reroute-js 0.22.3 → 0.22.5
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/cli/bin.d.ts +1 -1
- package/cli/bin.js +6 -6
- package/cli/bin.js.map +1 -1
- package/cli/index.d.ts +1 -1
- package/cli/index.js +4 -4
- package/cli/index.js.map +1 -1
- package/cli/src/cli.d.ts +1 -1
- package/cli/src/commands/analyze.d.ts +1 -1
- package/cli/src/commands/build.d.ts +1 -1
- package/cli/src/commands/dev.d.ts +1 -1
- package/cli/src/commands/gen.d.ts +1 -1
- package/cli/src/commands/index.d.ts +1 -1
- package/cli/src/commands/init.d.ts +1 -1
- package/cli/src/commands/lib/assets.d.ts +1 -1
- package/cli/src/commands/lib/bundler.d.ts +1 -1
- package/cli/src/commands/lib/command.d.ts +1 -1
- package/cli/src/commands/lib/env.d.ts +1 -1
- package/cli/src/commands/lib/index.d.ts +1 -1
- package/cli/src/commands/lib/log.d.ts +1 -1
- package/cli/src/commands/lib/markdown/availability.d.ts +1 -1
- package/cli/src/commands/lib/markdown/index.d.ts +1 -1
- package/cli/src/commands/lib/markdown/processor.d.ts +1 -1
- package/cli/src/commands/lib/production.d.ts +1 -1
- package/cli/src/commands/lib/server.d.ts +1 -1
- package/cli/src/commands/lib/streaming/analyzer.d.ts +1 -1
- package/cli/src/commands/lib/streaming/suspense.d.ts +1 -1
- package/cli/src/commands/lib/tailwind.d.ts +1 -1
- package/cli/src/commands/lib/terminal-ui.d.ts +1 -1
- package/cli/src/commands/lib/version.d.ts +1 -1
- package/cli/src/commands/og.d.ts +1 -1
- package/cli/src/commands/start.d.ts +1 -1
- package/cli/src/index.d.ts +1 -1
- package/core/index.d.ts +1 -1
- package/core/index.js +2 -2
- package/core/index.js.map +1 -1
- package/core/src/bundler/hash.d.ts +1 -1
- package/core/src/bundler/index.d.ts +1 -1
- package/core/src/config.d.ts +1 -1
- package/core/src/content/discovery.d.ts +1 -1
- package/core/src/content/index.d.ts +1 -1
- package/core/src/content/metadata.d.ts +1 -1
- package/core/src/index.d.ts +1 -1
- package/core/src/llms/extractor.d.ts +1 -1
- package/core/src/llms/formatter.d.ts +1 -1
- package/core/src/llms/full-generator.d.ts +1 -1
- package/core/src/llms/index-generator.d.ts +1 -1
- package/core/src/llms/index.d.ts +1 -1
- package/core/src/og/discovery.d.ts +1 -1
- package/core/src/og/index.d.ts +1 -1
- package/core/src/og/meta.d.ts +1 -1
- package/core/src/og/render.d.ts +1 -1
- package/core/src/og/types.d.ts +1 -1
- package/core/src/robots/discovery.d.ts +1 -1
- package/core/src/robots/generator.d.ts +1 -1
- package/core/src/robots/index.d.ts +1 -1
- package/core/src/robots/policies.d.ts +1 -1
- package/core/src/rss/discovery.d.ts +1 -1
- package/core/src/rss/generator.d.ts +1 -1
- package/core/src/rss/index.d.ts +1 -1
- package/core/src/sitemap/discovery.d.ts +1 -1
- package/core/src/sitemap/generator.d.ts +1 -1
- package/core/src/sitemap/index.d.ts +1 -1
- package/core/src/ssr/index.d.ts +1 -1
- package/core/src/ssr/lib/cache.d.ts +1 -1
- package/core/src/ssr/lib/collections.d.ts +1 -1
- package/core/src/ssr/lib/compression.d.ts +1 -1
- package/core/src/ssr/lib/compute/content.d.ts +1 -1
- package/core/src/ssr/lib/compute/index.d.ts +1 -1
- package/core/src/ssr/lib/compute/layouts.d.ts +1 -1
- package/core/src/ssr/lib/compute/routes.d.ts +1 -1
- package/core/src/ssr/lib/data.d.ts +1 -1
- package/core/src/ssr/lib/html.d.ts +1 -1
- package/core/src/ssr/lib/imports.d.ts +1 -1
- package/core/src/ssr/lib/index.d.ts +1 -1
- package/core/src/ssr/lib/layouts.d.ts +1 -1
- package/core/src/ssr/lib/metadata.d.ts +1 -1
- package/core/src/ssr/lib/mime.d.ts +1 -1
- package/core/src/ssr/lib/modules.d.ts +1 -1
- package/core/src/ssr/lib/path.d.ts +1 -1
- package/core/src/ssr/lib/preload.d.ts +1 -1
- package/core/src/ssr/lib/scripts/collections.d.ts +1 -1
- package/core/src/ssr/lib/scripts/data.d.ts +1 -1
- package/core/src/ssr/lib/scripts/escape.d.ts +1 -1
- package/core/src/ssr/lib/scripts/feeds.d.ts +1 -1
- package/core/src/ssr/lib/scripts/index.d.ts +1 -1
- package/core/src/ssr/lib/seed.d.ts +1 -1
- package/core/src/ssr/lib/setup.d.ts +1 -1
- package/core/src/ssr/lib/styles.d.ts +1 -1
- package/core/src/ssr/lib/template.d.ts +1 -1
- package/core/src/ssr/lib/types.d.ts +1 -1
- package/core/src/ssr/render.d.ts +1 -1
- package/core/src/ssr/stream.d.ts +1 -1
- package/elysia/index.d.ts +1 -1
- package/elysia/index.js +2 -2
- package/elysia/index.js.map +1 -1
- package/elysia/src/index.d.ts +1 -1
- package/elysia/src/libs/assets.d.ts +1 -1
- package/elysia/src/libs/cache.d.ts +1 -1
- package/elysia/src/libs/caching.d.ts +1 -1
- package/elysia/src/libs/http.d.ts +1 -1
- package/elysia/src/libs/image.d.ts +1 -1
- package/elysia/src/libs/index.d.ts +1 -1
- package/elysia/src/libs/llms.d.ts +1 -1
- package/elysia/src/libs/response.d.ts +1 -1
- package/elysia/src/libs/serving.d.ts +1 -1
- package/elysia/src/plugin.d.ts +1 -1
- package/elysia/src/routes/artifacts.d.ts +1 -1
- package/elysia/src/routes/content.d.ts +1 -1
- package/elysia/src/routes/image.d.ts +1 -1
- package/elysia/src/routes/index.d.ts +1 -1
- package/elysia/src/routes/internal.d.ts +1 -1
- package/elysia/src/routes/llms.d.ts +1 -1
- package/elysia/src/routes/og.d.ts +1 -1
- package/elysia/src/routes/redirects.d.ts +1 -1
- package/elysia/src/routes/robots.d.ts +1 -1
- package/elysia/src/routes/rss.d.ts +1 -1
- package/elysia/src/routes/search.d.ts +1 -1
- package/elysia/src/routes/sitemap.d.ts +1 -1
- package/elysia/src/routes/ssr.d.ts +1 -1
- package/elysia/src/routes/static.d.ts +1 -1
- package/elysia/src/types.d.ts +1 -1
- package/package.json +1 -1
- package/react/index.d.ts +1 -1
- package/react/index.js +2 -2
- package/react/index.js.map +1 -1
- package/react/src/components/ClientOnly.d.ts +1 -1
- package/react/src/components/ContentRoute.d.ts +1 -1
- package/react/src/components/Image.d.ts +1 -1
- package/react/src/components/LazyRoute.d.ts +1 -1
- package/react/src/components/Link.d.ts +1 -1
- package/react/src/components/Markdown.d.ts +1 -1
- package/react/src/components/Outlet.d.ts +1 -1
- package/react/src/components/index.d.ts +1 -1
- package/react/src/hooks/index.d.ts +1 -1
- package/react/src/hooks/useContent.d.ts +1 -1
- package/react/src/hooks/useData.d.ts +1 -1
- package/react/src/hooks/useFeed.d.ts +1 -1
- package/react/src/hooks/useLayoutData.d.ts +1 -1
- package/react/src/hooks/useLlms.d.ts +1 -1
- package/react/src/hooks/useNavigate.d.ts +1 -1
- package/react/src/hooks/useParams.d.ts +1 -1
- package/react/src/hooks/useRouter.d.ts +1 -1
- package/react/src/hooks/useSearch.d.ts +1 -1
- package/react/src/hooks/useSearchParams.d.ts +1 -1
- package/react/src/hooks/useToc.d.ts +1 -1
- package/react/src/index.d.ts +1 -1
- package/react/src/lib/collection.d.ts +1 -1
- package/react/src/lib/content.d.ts +1 -1
- package/react/src/lib/head.d.ts +1 -1
- package/react/src/lib/index.d.ts +1 -1
- package/react/src/lib/lazy-route.d.ts +1 -1
- package/react/src/lib/route-loader.d.ts +1 -1
- package/react/src/providers/ContentProvider.d.ts +1 -1
- package/react/src/providers/RerouteProvider.d.ts +1 -1
- package/react/src/providers/RouterProvider.d.ts +1 -1
- package/react/src/providers/index.d.ts +1 -1
- package/react/src/types/any.d.ts +1 -1
- package/react/src/types/index.d.ts +1 -1
- package/react/src/types/router.d.ts +1 -1
- package/telemetry/browser.d.ts +1 -1
- package/telemetry/browser.js +27 -5
- package/telemetry/browser.js.map +5 -4
- package/telemetry/index.d.ts +1 -1
- package/telemetry/index.js +2 -2
- package/telemetry/index.js.map +1 -1
- package/telemetry/react.d.ts +1 -1
- package/telemetry/react.js +373 -27
- package/telemetry/react.js.map +5 -4
- package/telemetry/src/browser/index.d.ts +1 -1
- package/telemetry/src/browser/react.d.ts +1 -1
- package/telemetry/src/browser/react.d.ts.map +1 -1
- package/telemetry/src/server/index.d.ts +1 -1
package/telemetry/react.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* reroute-js v0.22.
|
|
2
|
+
* reroute-js v0.22.5
|
|
3
3
|
*
|
|
4
4
|
* @license MIT
|
|
5
5
|
* @copyright 2025 stewones <hi@stewan.io>
|
|
@@ -23,6 +23,16 @@ var __toESM = (mod, isNodeMode, target) => {
|
|
|
23
23
|
});
|
|
24
24
|
return to;
|
|
25
25
|
};
|
|
26
|
+
var __export = (target, all) => {
|
|
27
|
+
for (var name in all)
|
|
28
|
+
__defProp(target, name, {
|
|
29
|
+
get: all[name],
|
|
30
|
+
enumerable: true,
|
|
31
|
+
configurable: true,
|
|
32
|
+
set: (newValue) => all[name] = () => newValue
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
26
36
|
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
27
37
|
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
28
38
|
}) : x)(function(x) {
|
|
@@ -31,6 +41,335 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
31
41
|
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
32
42
|
});
|
|
33
43
|
|
|
44
|
+
// packages/telemetry/src/browser/index.ts
|
|
45
|
+
var exports_browser = {};
|
|
46
|
+
__export(exports_browser, {
|
|
47
|
+
trackEvent: () => trackEvent,
|
|
48
|
+
trackError: () => trackError,
|
|
49
|
+
shutdownTelemetry: () => shutdownTelemetry,
|
|
50
|
+
initBrowserTelemetry: () => initBrowserTelemetry,
|
|
51
|
+
createSpan: () => createSpan
|
|
52
|
+
});
|
|
53
|
+
import { SpanStatusCode, trace } from "@opentelemetry/api";
|
|
54
|
+
import { getWebAutoInstrumentations } from "@opentelemetry/auto-instrumentations-web";
|
|
55
|
+
import { ZoneContextManager } from "@opentelemetry/context-zone";
|
|
56
|
+
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
|
|
57
|
+
import { registerInstrumentations } from "@opentelemetry/instrumentation";
|
|
58
|
+
import { resourceFromAttributes } from "@opentelemetry/resources";
|
|
59
|
+
import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-base";
|
|
60
|
+
import { WebTracerProvider } from "@opentelemetry/sdk-trace-web";
|
|
61
|
+
import {
|
|
62
|
+
ATTR_SERVICE_NAME,
|
|
63
|
+
ATTR_SERVICE_VERSION
|
|
64
|
+
} from "@opentelemetry/semantic-conventions";
|
|
65
|
+
function initBrowserTelemetry(options = {}) {
|
|
66
|
+
if (IS_SERVER || isInitialized) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const env = typeof import.meta !== "undefined" ? import.meta.env : undefined;
|
|
71
|
+
const SERVICE_NAME = options.serviceName || "reroute-app-browser";
|
|
72
|
+
const SERVICE_VERSION = options.serviceVersion || "1.0.0";
|
|
73
|
+
const OTLP_ENDPOINT = options.otlpEndpoint || "/api/telemetry";
|
|
74
|
+
const IS_PRODUCTION = options.isProduction ?? env?.PROD ?? false;
|
|
75
|
+
const ENABLE_WEB_VITALS = options.enableWebVitals ?? true;
|
|
76
|
+
const ENABLE_CONSOLE_CAPTURE = options.enableConsoleCapture ?? IS_PRODUCTION;
|
|
77
|
+
console.log(`[browser-telemetry] Initializing with endpoint: ${OTLP_ENDPOINT}`);
|
|
78
|
+
const headers = {};
|
|
79
|
+
const apiKey = options.apiKey || env?.REROUTE_SIGNOZ_API_KEY;
|
|
80
|
+
if (apiKey) {
|
|
81
|
+
headers.Authorization = `Bearer ${apiKey}`;
|
|
82
|
+
}
|
|
83
|
+
const exporter = new OTLPTraceExporter({
|
|
84
|
+
url: `${OTLP_ENDPOINT}/v1/traces`,
|
|
85
|
+
headers: Object.keys(headers).length > 0 ? headers : undefined
|
|
86
|
+
});
|
|
87
|
+
const resource = resourceFromAttributes({
|
|
88
|
+
[ATTR_SERVICE_NAME]: SERVICE_NAME,
|
|
89
|
+
[ATTR_SERVICE_VERSION]: SERVICE_VERSION,
|
|
90
|
+
"deployment.environment": IS_PRODUCTION ? "production" : "development",
|
|
91
|
+
"browser.user_agent": navigator.userAgent,
|
|
92
|
+
"browser.language": navigator.language,
|
|
93
|
+
"browser.platform": navigator.platform,
|
|
94
|
+
"screen.width": window.screen.width,
|
|
95
|
+
"screen.height": window.screen.height
|
|
96
|
+
});
|
|
97
|
+
const spanProcessor = new BatchSpanProcessor(exporter, {
|
|
98
|
+
maxQueueSize: 100,
|
|
99
|
+
maxExportBatchSize: 10,
|
|
100
|
+
scheduledDelayMillis: 500
|
|
101
|
+
});
|
|
102
|
+
tracerProvider = new WebTracerProvider({
|
|
103
|
+
resource,
|
|
104
|
+
spanProcessors: [spanProcessor]
|
|
105
|
+
});
|
|
106
|
+
tracerProvider.register({
|
|
107
|
+
contextManager: new ZoneContextManager
|
|
108
|
+
});
|
|
109
|
+
registerInstrumentations({
|
|
110
|
+
instrumentations: [
|
|
111
|
+
getWebAutoInstrumentations({
|
|
112
|
+
"@opentelemetry/instrumentation-document-load": {
|
|
113
|
+
enabled: true
|
|
114
|
+
},
|
|
115
|
+
"@opentelemetry/instrumentation-user-interaction": {
|
|
116
|
+
enabled: true,
|
|
117
|
+
eventNames: ["click", "submit"]
|
|
118
|
+
},
|
|
119
|
+
"@opentelemetry/instrumentation-fetch": {
|
|
120
|
+
enabled: true,
|
|
121
|
+
propagateTraceHeaderCorsUrls: [/.*/],
|
|
122
|
+
clearTimingResources: true
|
|
123
|
+
},
|
|
124
|
+
"@opentelemetry/instrumentation-xml-http-request": {
|
|
125
|
+
enabled: true,
|
|
126
|
+
propagateTraceHeaderCorsUrls: [/.*/],
|
|
127
|
+
clearTimingResources: true
|
|
128
|
+
}
|
|
129
|
+
})
|
|
130
|
+
]
|
|
131
|
+
});
|
|
132
|
+
setupErrorHandlers();
|
|
133
|
+
if (ENABLE_WEB_VITALS) {
|
|
134
|
+
setupWebVitals();
|
|
135
|
+
}
|
|
136
|
+
if (ENABLE_CONSOLE_CAPTURE) {
|
|
137
|
+
setupConsoleCapture();
|
|
138
|
+
}
|
|
139
|
+
setupVisibilityTracking();
|
|
140
|
+
isInitialized = true;
|
|
141
|
+
console.log("[browser-telemetry] Initialized successfully");
|
|
142
|
+
} catch (error) {
|
|
143
|
+
console.error("[browser-telemetry] Failed to initialize:", error);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function setupErrorHandlers() {
|
|
147
|
+
const tracer = trace.getTracer("error-handler");
|
|
148
|
+
window.addEventListener("error", (event) => {
|
|
149
|
+
try {
|
|
150
|
+
const span = tracer.startSpan("browser.error.uncaught", {
|
|
151
|
+
startTime: Date.now()
|
|
152
|
+
});
|
|
153
|
+
const stackTrace = event.error?.stack || "";
|
|
154
|
+
span.setStatus({
|
|
155
|
+
code: SpanStatusCode.ERROR,
|
|
156
|
+
message: event.message
|
|
157
|
+
});
|
|
158
|
+
span.setAttributes({
|
|
159
|
+
error: true,
|
|
160
|
+
"error.type": event.error?.name || "UncaughtError",
|
|
161
|
+
"error.message": event.message,
|
|
162
|
+
"error.stack": stackTrace,
|
|
163
|
+
"error.filename": event.filename || "",
|
|
164
|
+
"error.lineno": event.lineno || 0,
|
|
165
|
+
"error.colno": event.colno || 0,
|
|
166
|
+
"browser.url": window.location.href,
|
|
167
|
+
"browser.pathname": window.location.pathname,
|
|
168
|
+
"browser.user_agent": navigator.userAgent,
|
|
169
|
+
"browser.timestamp": new Date().toISOString()
|
|
170
|
+
});
|
|
171
|
+
if (event.error) {
|
|
172
|
+
span.recordException(event.error);
|
|
173
|
+
span.addEvent("exception", {
|
|
174
|
+
"exception.type": event.error.name,
|
|
175
|
+
"exception.message": event.error.message,
|
|
176
|
+
"exception.stacktrace": stackTrace,
|
|
177
|
+
"exception.escaped": "false"
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
span.end();
|
|
181
|
+
} catch (telemetryError) {
|
|
182
|
+
console.error("[browser-telemetry] Error tracking failed:", telemetryError);
|
|
183
|
+
}
|
|
184
|
+
console.error("[browser-telemetry] Uncaught error:", event.error || event.message);
|
|
185
|
+
});
|
|
186
|
+
window.addEventListener("unhandledrejection", (event) => {
|
|
187
|
+
try {
|
|
188
|
+
const span = tracer.startSpan("browser.error.unhandled_rejection", {
|
|
189
|
+
startTime: Date.now()
|
|
190
|
+
});
|
|
191
|
+
const isError = event.reason instanceof Error;
|
|
192
|
+
const errorMessage = isError ? event.reason.message : String(event.reason);
|
|
193
|
+
const errorStack = isError ? event.reason.stack || "" : "";
|
|
194
|
+
const errorType = isError ? event.reason.name : "UnhandledRejection";
|
|
195
|
+
span.setStatus({
|
|
196
|
+
code: SpanStatusCode.ERROR,
|
|
197
|
+
message: errorMessage
|
|
198
|
+
});
|
|
199
|
+
span.setAttributes({
|
|
200
|
+
error: true,
|
|
201
|
+
"error.type": errorType,
|
|
202
|
+
"error.message": errorMessage,
|
|
203
|
+
"error.stack": errorStack,
|
|
204
|
+
"browser.url": window.location.href,
|
|
205
|
+
"browser.pathname": window.location.pathname,
|
|
206
|
+
"browser.user_agent": navigator.userAgent,
|
|
207
|
+
"browser.timestamp": new Date().toISOString()
|
|
208
|
+
});
|
|
209
|
+
if (isError) {
|
|
210
|
+
span.recordException(event.reason);
|
|
211
|
+
span.addEvent("exception", {
|
|
212
|
+
"exception.type": event.reason.name,
|
|
213
|
+
"exception.message": event.reason.message,
|
|
214
|
+
"exception.stacktrace": errorStack,
|
|
215
|
+
"exception.escaped": "false"
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
span.end();
|
|
219
|
+
} catch (telemetryError) {
|
|
220
|
+
console.error("[browser-telemetry] Rejection tracking failed:", telemetryError);
|
|
221
|
+
}
|
|
222
|
+
console.error("[browser-telemetry] Unhandled rejection:", event.reason);
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
async function setupWebVitals() {
|
|
226
|
+
try {
|
|
227
|
+
const { onLCP, onCLS, onTTFB, onINP } = await import("web-vitals");
|
|
228
|
+
const tracer = trace.getTracer("web-vitals");
|
|
229
|
+
const sendToAnalytics = (metric) => {
|
|
230
|
+
try {
|
|
231
|
+
const span = tracer.startSpan(`web_vitals.${metric.name}`, {
|
|
232
|
+
startTime: Date.now() - metric.value
|
|
233
|
+
});
|
|
234
|
+
span.setAttributes({
|
|
235
|
+
"metric.name": metric.name,
|
|
236
|
+
"metric.value": metric.value,
|
|
237
|
+
"metric.rating": metric.rating,
|
|
238
|
+
"metric.delta": metric.delta,
|
|
239
|
+
"metric.id": metric.id,
|
|
240
|
+
"browser.url": window.location.href,
|
|
241
|
+
"browser.pathname": window.location.pathname
|
|
242
|
+
});
|
|
243
|
+
span.end();
|
|
244
|
+
} catch (error) {
|
|
245
|
+
console.error("[browser-telemetry] Web Vitals tracking failed:", error);
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
onLCP(sendToAnalytics);
|
|
249
|
+
onCLS(sendToAnalytics);
|
|
250
|
+
onTTFB(sendToAnalytics);
|
|
251
|
+
onINP(sendToAnalytics);
|
|
252
|
+
console.log("[browser-telemetry] Web Vitals tracking enabled");
|
|
253
|
+
} catch (error) {
|
|
254
|
+
console.warn("[browser-telemetry] Web Vitals not available:", error);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
function setupConsoleCapture() {
|
|
258
|
+
const tracer = trace.getTracer("console");
|
|
259
|
+
const originalError = console.error;
|
|
260
|
+
console.error = (...args) => {
|
|
261
|
+
try {
|
|
262
|
+
const span = tracer.startSpan("browser.console.error");
|
|
263
|
+
span.setAttributes({
|
|
264
|
+
"log.level": "error",
|
|
265
|
+
"log.message": args.map(String).join(" "),
|
|
266
|
+
"browser.url": window.location.href,
|
|
267
|
+
"browser.timestamp": new Date().toISOString()
|
|
268
|
+
});
|
|
269
|
+
span.end();
|
|
270
|
+
} catch {}
|
|
271
|
+
originalError.apply(console, args);
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
function setupVisibilityTracking() {
|
|
275
|
+
const tracer = trace.getTracer("visibility");
|
|
276
|
+
document.addEventListener("visibilitychange", () => {
|
|
277
|
+
try {
|
|
278
|
+
const span = tracer.startSpan("browser.visibility_change");
|
|
279
|
+
span.setAttributes({
|
|
280
|
+
"visibility.state": document.visibilityState,
|
|
281
|
+
"browser.url": window.location.href,
|
|
282
|
+
"browser.timestamp": new Date().toISOString()
|
|
283
|
+
});
|
|
284
|
+
span.end();
|
|
285
|
+
} catch {}
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
function createSpan(name, attributes = {}) {
|
|
289
|
+
if (IS_SERVER || !isInitialized) {
|
|
290
|
+
return {
|
|
291
|
+
setAttributes: () => {},
|
|
292
|
+
setStatus: () => {},
|
|
293
|
+
recordException: () => {},
|
|
294
|
+
end: () => {}
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
try {
|
|
298
|
+
const tracer = trace.getTracer("custom");
|
|
299
|
+
const span = tracer.startSpan(name);
|
|
300
|
+
span.setAttributes({
|
|
301
|
+
...attributes,
|
|
302
|
+
"browser.url": window.location.href,
|
|
303
|
+
"browser.pathname": window.location.pathname
|
|
304
|
+
});
|
|
305
|
+
return span;
|
|
306
|
+
} catch (error) {
|
|
307
|
+
console.error("[browser-telemetry] Failed to create span:", error);
|
|
308
|
+
return {
|
|
309
|
+
setAttributes: () => {},
|
|
310
|
+
setStatus: () => {},
|
|
311
|
+
recordException: () => {},
|
|
312
|
+
end: () => {}
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
function trackEvent(eventName, attributes = {}) {
|
|
317
|
+
if (IS_SERVER || !isInitialized) {
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
try {
|
|
321
|
+
const span = createSpan(`custom.${eventName}`, attributes);
|
|
322
|
+
span.end();
|
|
323
|
+
} catch (error) {
|
|
324
|
+
console.error("[browser-telemetry] Failed to track event:", error);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
function trackError(error, context = {}) {
|
|
328
|
+
if (IS_SERVER || !isInitialized) {
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
try {
|
|
332
|
+
const tracer = trace.getTracer("error-handler");
|
|
333
|
+
const span = tracer.startSpan("browser.error.tracked");
|
|
334
|
+
const stackTrace = error.stack || "";
|
|
335
|
+
span.setStatus({
|
|
336
|
+
code: SpanStatusCode.ERROR,
|
|
337
|
+
message: error.message
|
|
338
|
+
});
|
|
339
|
+
span.setAttributes({
|
|
340
|
+
error: true,
|
|
341
|
+
"error.type": error.name,
|
|
342
|
+
"error.message": error.message,
|
|
343
|
+
"error.stack": stackTrace,
|
|
344
|
+
...context,
|
|
345
|
+
"browser.url": window.location.href,
|
|
346
|
+
"browser.pathname": window.location.pathname,
|
|
347
|
+
"browser.timestamp": new Date().toISOString()
|
|
348
|
+
});
|
|
349
|
+
span.recordException(error);
|
|
350
|
+
span.addEvent("exception", {
|
|
351
|
+
"exception.type": error.name,
|
|
352
|
+
"exception.message": error.message,
|
|
353
|
+
"exception.stacktrace": stackTrace,
|
|
354
|
+
"exception.escaped": "false"
|
|
355
|
+
});
|
|
356
|
+
span.end();
|
|
357
|
+
} catch (telemetryError) {
|
|
358
|
+
console.error("[browser-telemetry] Failed to track error:", telemetryError);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
async function shutdownTelemetry() {
|
|
362
|
+
if (tracerProvider) {
|
|
363
|
+
await tracerProvider.shutdown();
|
|
364
|
+
isInitialized = false;
|
|
365
|
+
console.log("[browser-telemetry] Shut down successfully");
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
var IS_SERVER, isInitialized = false, tracerProvider = null;
|
|
369
|
+
var init_browser = __esm(() => {
|
|
370
|
+
IS_SERVER = typeof window === "undefined";
|
|
371
|
+
});
|
|
372
|
+
|
|
34
373
|
// packages/telemetry/src/browser/react.tsx
|
|
35
374
|
import {
|
|
36
375
|
createContext,
|
|
@@ -41,24 +380,33 @@ import {
|
|
|
41
380
|
useState
|
|
42
381
|
} from "react";
|
|
43
382
|
import { jsx } from "react/jsx-runtime";
|
|
44
|
-
var
|
|
383
|
+
var IS_SERVER2 = typeof window === "undefined";
|
|
45
384
|
var telemetryModule = null;
|
|
46
385
|
var loadTelemetry = async () => {
|
|
47
|
-
if (
|
|
48
|
-
return
|
|
386
|
+
if (IS_SERVER2 || telemetryModule) {
|
|
387
|
+
return telemetryModule;
|
|
49
388
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
389
|
+
try {
|
|
390
|
+
const module = await Promise.resolve().then(() => (init_browser(), exports_browser));
|
|
391
|
+
telemetryModule = module;
|
|
392
|
+
return telemetryModule;
|
|
393
|
+
} catch (error) {
|
|
394
|
+
console.warn("[TelemetryProvider] Failed to load telemetry module:", error);
|
|
395
|
+
return null;
|
|
58
396
|
}
|
|
59
|
-
return telemetryModule;
|
|
60
397
|
};
|
|
61
398
|
var TelemetryContext = createContext(null);
|
|
399
|
+
var noopSpan = {
|
|
400
|
+
setAttributes: () => {},
|
|
401
|
+
setStatus: () => {},
|
|
402
|
+
recordException: () => {},
|
|
403
|
+
end: () => {}
|
|
404
|
+
};
|
|
405
|
+
var noopContext = {
|
|
406
|
+
createCustomSpan: () => noopSpan,
|
|
407
|
+
trackCustomEvent: () => {},
|
|
408
|
+
trackCustomError: () => {}
|
|
409
|
+
};
|
|
62
410
|
function TelemetryProvider({
|
|
63
411
|
children,
|
|
64
412
|
serviceName,
|
|
@@ -88,13 +436,15 @@ function TelemetryProvider({
|
|
|
88
436
|
enableConsoleCapture
|
|
89
437
|
]);
|
|
90
438
|
useEffect(() => {
|
|
439
|
+
if (IS_SERVER2)
|
|
440
|
+
return;
|
|
91
441
|
setIsMounted(true);
|
|
92
442
|
}, []);
|
|
93
443
|
useEffect(() => {
|
|
94
|
-
if (
|
|
444
|
+
if (IS_SERVER2 || !isMounted)
|
|
95
445
|
return;
|
|
96
446
|
loadTelemetry().then((module) => {
|
|
97
|
-
if (module) {
|
|
447
|
+
if (module?.initBrowserTelemetry) {
|
|
98
448
|
module.initBrowserTelemetry(opts);
|
|
99
449
|
console.debug("[TelemetryProvider] Browser telemetry initialized");
|
|
100
450
|
}
|
|
@@ -106,12 +456,7 @@ function TelemetryProvider({
|
|
|
106
456
|
if (telemetryModule) {
|
|
107
457
|
return telemetryModule.createSpan(name, attributes);
|
|
108
458
|
}
|
|
109
|
-
return
|
|
110
|
-
setAttributes: () => {},
|
|
111
|
-
setStatus: () => {},
|
|
112
|
-
recordException: () => {},
|
|
113
|
-
end: () => {}
|
|
114
|
-
};
|
|
459
|
+
return noopSpan;
|
|
115
460
|
}, []);
|
|
116
461
|
const trackCustomEvent = useCallback((eventName, attributes) => {
|
|
117
462
|
if (telemetryModule) {
|
|
@@ -123,12 +468,13 @@ function TelemetryProvider({
|
|
|
123
468
|
telemetryModule.trackError(error, context);
|
|
124
469
|
}
|
|
125
470
|
}, []);
|
|
471
|
+
const contextValue = IS_SERVER2 ? noopContext : {
|
|
472
|
+
createCustomSpan,
|
|
473
|
+
trackCustomEvent,
|
|
474
|
+
trackCustomError
|
|
475
|
+
};
|
|
126
476
|
return /* @__PURE__ */ jsx(TelemetryContext.Provider, {
|
|
127
|
-
value:
|
|
128
|
-
createCustomSpan,
|
|
129
|
-
trackCustomEvent,
|
|
130
|
-
trackCustomError
|
|
131
|
-
},
|
|
477
|
+
value: contextValue,
|
|
132
478
|
children
|
|
133
479
|
});
|
|
134
480
|
}
|
|
@@ -144,4 +490,4 @@ export {
|
|
|
144
490
|
TelemetryProvider
|
|
145
491
|
};
|
|
146
492
|
|
|
147
|
-
//# debugId=
|
|
493
|
+
//# debugId=DC79F3C9CFD9854C64756E2164756E21
|
package/telemetry/react.js.map
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../packages/telemetry/src/browser/react.tsx"],
|
|
3
|
+
"sources": ["../../packages/telemetry/src/browser/index.ts", "../../packages/telemetry/src/browser/react.tsx"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import {\n\tcreateContext,\n\ttype ReactNode,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseState,\n} from 'react';\n\n// Inline type definition to avoid importing from ./index during SSR bundling\nexport interface BrowserTelemetryOptions {\n\tserviceName?: string;\n\tserviceVersion?: string;\n\totlpEndpoint?: string;\n\tapiKey?: string;\n\tisProduction?: boolean;\n\tenableWebVitals?: boolean;\n\tenableConsoleCapture?: boolean;\n}\n\nconst IS_SERVER = typeof window === 'undefined';\n\n// Only define these in browser context to prevent SSR bundling issues\n// biome-ignore lint/suspicious/noExplicitAny: That's fine\nlet telemetryModule: any = null;\n\nconst loadTelemetry = async () => {\n\t// Never execute on server\n\tif (IS_SERVER) {\n\t\treturn null;\n\t}\n\n\tif (!telemetryModule) {\n\t\ttry {\n\t\t\t// Use string concatenation to prevent bundler from resolving this during SSR\n\t\t\tconst modulePath = './index';\n\t\t\ttelemetryModule = await import(/* @vite-ignore */ modulePath);\n\t\t} catch (error) {\n\t\t\tconsole.warn(\n\t\t\t\t'[TelemetryProvider] Failed to load telemetry module:',\n\t\t\t\terror,\n\t\t\t);\n\t\t\treturn null;\n\t\t}\n\t}\n\treturn telemetryModule;\n};\n\ninterface TelemetryContextType {\n\tcreateCustomSpan: (\n\t\tname: string,\n\t\tattributes?: Record<string, string | number | boolean>,\n\t) => {\n\t\tsetAttributes: (attrs: Record<string, string | number | boolean>) => void;\n\t\tsetStatus: (status: { code: number; message?: string }) => void;\n\t\trecordException: (error: Error) => void;\n\t\tend: () => void;\n\t};\n\ttrackCustomEvent: (\n\t\teventName: string,\n\t\tattributes?: Record<string, string | number | boolean>,\n\t) => void;\n\ttrackCustomError: (\n\t\terror: Error,\n\t\tcontext?: Record<string, string | number | boolean>,\n\t) => void;\n}\n\nconst TelemetryContext = createContext<TelemetryContextType | null>(null);\n\nexport function TelemetryProvider({\n\tchildren,\n\tserviceName,\n\tserviceVersion,\n\totlpEndpoint,\n\tapiKey,\n\tisProduction,\n\tenableWebVitals,\n\tenableConsoleCapture,\n}: BrowserTelemetryOptions & { children: ReactNode }) {\n\t// Only run in browser - use state to ensure client-only execution\n\tconst [isMounted, setIsMounted] = useState(false);\n\n\tconst opts = useMemo(\n\t\t() => ({\n\t\t\tserviceName,\n\t\t\tserviceVersion,\n\t\t\totlpEndpoint,\n\t\t\tapiKey,\n\t\t\tisProduction,\n\t\t\tenableWebVitals,\n\t\t\tenableConsoleCapture,\n\t\t}),\n\t\t[\n\t\t\tserviceName,\n\t\t\tserviceVersion,\n\t\t\totlpEndpoint,\n\t\t\tapiKey,\n\t\t\tisProduction,\n\t\t\tenableWebVitals,\n\t\t\tenableConsoleCapture,\n\t\t],\n\t);\n\n\tuseEffect(() => {\n\t\tsetIsMounted(true);\n\t}, []);\n\n\tuseEffect(() => {\n\t\t// Triple guard: check IS_SERVER, isMounted, and window\n\t\tif (IS_SERVER || !isMounted || typeof window === 'undefined') return;\n\n\t\tloadTelemetry()\n\t\t\t.then((module) => {\n\t\t\t\tif (module) {\n\t\t\t\t\tmodule.initBrowserTelemetry(opts);\n\t\t\t\t\tconsole.debug('[TelemetryProvider] Browser telemetry initialized');\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('[TelemetryProvider] Failed to load telemetry:', error);\n\t\t\t});\n\t}, [opts, isMounted]);\n\n\tconst createCustomSpan = useCallback(\n\t\t(name: string, attributes?: Record<string, string | number | boolean>) => {\n\t\t\tif (telemetryModule) {\n\t\t\t\treturn telemetryModule.createSpan(name, attributes);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tsetAttributes: () => {},\n\t\t\t\tsetStatus: () => {},\n\t\t\t\trecordException: () => {},\n\t\t\t\tend: () => {},\n\t\t\t};\n\t\t},\n\t\t[],\n\t);\n\n\tconst trackCustomEvent = useCallback(\n\t\t(\n\t\t\teventName: string,\n\t\t\tattributes?: Record<string, string | number | boolean>,\n\t\t) => {\n\t\t\tif (telemetryModule) {\n\t\t\t\ttelemetryModule.trackEvent(eventName, attributes);\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\n\tconst trackCustomError = useCallback(\n\t\t(error: Error, context?: Record<string, string | number | boolean>) => {\n\t\t\tif (telemetryModule) {\n\t\t\t\ttelemetryModule.trackError(error, context);\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\n\treturn (\n\t\t<TelemetryContext.Provider\n\t\t\tvalue={{\n\t\t\t\tcreateCustomSpan,\n\t\t\t\ttrackCustomEvent,\n\t\t\t\ttrackCustomError,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</TelemetryContext.Provider>\n\t);\n}\n\nexport function useTelemetry() {\n\tconst context = useContext(TelemetryContext);\n\tif (!context) {\n\t\tthrow new Error('useTelemetry must be used within a TelemetryProvider');\n\t}\n\treturn context;\n}\n"
|
|
5
|
+
"import { SpanStatusCode, trace } from '@opentelemetry/api';\nimport { getWebAutoInstrumentations } from '@opentelemetry/auto-instrumentations-web';\nimport { ZoneContextManager } from '@opentelemetry/context-zone';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport { registerInstrumentations } from '@opentelemetry/instrumentation';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport { WebTracerProvider } from '@opentelemetry/sdk-trace-web';\nimport {\n\tATTR_SERVICE_NAME,\n\tATTR_SERVICE_VERSION,\n} from '@opentelemetry/semantic-conventions';\n\nexport interface BrowserTelemetryOptions {\n\t/**\n\t * Service name for browser telemetry\n\t * @default 'reroute-app-browser'\n\t */\n\tserviceName?: string;\n\n\t/**\n\t * Service version\n\t * @default '1.0.0'\n\t */\n\tserviceVersion?: string;\n\n\t/**\n\t * OTLP endpoint URL (use relative URL for same-origin proxy)\n\t * @default '/api/telemetry'\n\t */\n\totlpEndpoint?: string;\n\n\t/**\n\t * API key for authentication (optional)\n\t */\n\tapiKey?: string;\n\n\t/**\n\t * Whether running in production\n\t * @default import.meta.env.PROD\n\t */\n\tisProduction?: boolean;\n\n\t/**\n\t * Enable Web Vitals tracking (LCP, CLS, TTFB, INP)\n\t * @default true\n\t */\n\tenableWebVitals?: boolean;\n\n\t/**\n\t * Enable console.error capture (recommended for production only)\n\t * @default isProduction\n\t */\n\tenableConsoleCapture?: boolean;\n}\n\nconst IS_SERVER = typeof window === 'undefined';\n\nlet isInitialized = false;\nlet tracerProvider: WebTracerProvider | null = null;\n\n/**\n * Initialize browser telemetry\n * Call this once when your app starts (usually in a React provider)\n *\n * @example\n * ```typescript\n * import { initBrowserTelemetry } from 'reroute-js/telemetry/browser';\n *\n * initBrowserTelemetry({\n * serviceName: 'My App Browser',\n * otlpEndpoint: '/api/telemetry', // Same-origin proxy\n * isProduction: true,\n * });\n * ```\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Initialization requires multiple setup steps\nexport function initBrowserTelemetry(options: BrowserTelemetryOptions = {}) {\n\tif (IS_SERVER || isInitialized) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst env =\n\t\t\ttypeof import.meta !== 'undefined' ? import.meta.env : undefined;\n\n\t\tconst SERVICE_NAME = options.serviceName || 'reroute-app-browser';\n\t\tconst SERVICE_VERSION = options.serviceVersion || '1.0.0';\n\t\tconst OTLP_ENDPOINT = options.otlpEndpoint || '/api/telemetry';\n\t\tconst IS_PRODUCTION = options.isProduction ?? env?.PROD ?? false;\n\t\tconst ENABLE_WEB_VITALS = options.enableWebVitals ?? true;\n\t\tconst ENABLE_CONSOLE_CAPTURE =\n\t\t\toptions.enableConsoleCapture ?? IS_PRODUCTION;\n\n\t\tconsole.log(\n\t\t\t`[browser-telemetry] Initializing with endpoint: ${OTLP_ENDPOINT}`,\n\t\t);\n\n\t\t// Configure OTLP exporter\n\t\tconst headers: Record<string, string> = {};\n\t\tconst apiKey = options.apiKey || env?.REROUTE_SIGNOZ_API_KEY;\n\t\tif (apiKey) {\n\t\t\theaders.Authorization = `Bearer ${apiKey}`;\n\t\t}\n\n\t\tconst exporter = new OTLPTraceExporter({\n\t\t\turl: `${OTLP_ENDPOINT}/v1/traces`,\n\t\t\theaders: Object.keys(headers).length > 0 ? headers : undefined,\n\t\t});\n\n\t\t// Create resource\n\t\tconst resource = resourceFromAttributes({\n\t\t\t[ATTR_SERVICE_NAME]: SERVICE_NAME,\n\t\t\t[ATTR_SERVICE_VERSION]: SERVICE_VERSION,\n\t\t\t'deployment.environment': IS_PRODUCTION ? 'production' : 'development',\n\t\t\t'browser.user_agent': navigator.userAgent,\n\t\t\t'browser.language': navigator.language,\n\t\t\t'browser.platform': navigator.platform,\n\t\t\t'screen.width': window.screen.width,\n\t\t\t'screen.height': window.screen.height,\n\t\t});\n\n\t\t// Create span processor\n\t\tconst spanProcessor = new BatchSpanProcessor(exporter, {\n\t\t\tmaxQueueSize: 100,\n\t\t\tmaxExportBatchSize: 10,\n\t\t\tscheduledDelayMillis: 500,\n\t\t});\n\n\t\t// Create tracer provider\n\t\ttracerProvider = new WebTracerProvider({\n\t\t\tresource,\n\t\t\tspanProcessors: [spanProcessor],\n\t\t});\n\n\t\ttracerProvider.register({\n\t\t\tcontextManager: new ZoneContextManager(),\n\t\t});\n\n\t\t// Auto-instrument browser APIs\n\t\tregisterInstrumentations({\n\t\t\tinstrumentations: [\n\t\t\t\tgetWebAutoInstrumentations({\n\t\t\t\t\t'@opentelemetry/instrumentation-document-load': {\n\t\t\t\t\t\tenabled: true,\n\t\t\t\t\t},\n\t\t\t\t\t'@opentelemetry/instrumentation-user-interaction': {\n\t\t\t\t\t\tenabled: true,\n\t\t\t\t\t\teventNames: ['click', 'submit'],\n\t\t\t\t\t},\n\t\t\t\t\t'@opentelemetry/instrumentation-fetch': {\n\t\t\t\t\t\tenabled: true,\n\t\t\t\t\t\tpropagateTraceHeaderCorsUrls: [/.*/],\n\t\t\t\t\t\tclearTimingResources: true,\n\t\t\t\t\t},\n\t\t\t\t\t'@opentelemetry/instrumentation-xml-http-request': {\n\t\t\t\t\t\tenabled: true,\n\t\t\t\t\t\tpropagateTraceHeaderCorsUrls: [/.*/],\n\t\t\t\t\t\tclearTimingResources: true,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t],\n\t\t});\n\n\t\t// Setup error handlers\n\t\tsetupErrorHandlers();\n\n\t\t// Setup Web Vitals\n\t\tif (ENABLE_WEB_VITALS) {\n\t\t\tsetupWebVitals();\n\t\t}\n\n\t\t// Setup console capture (production only)\n\t\tif (ENABLE_CONSOLE_CAPTURE) {\n\t\t\tsetupConsoleCapture();\n\t\t}\n\n\t\t// Track page visibility\n\t\tsetupVisibilityTracking();\n\n\t\tisInitialized = true;\n\t\tconsole.log('[browser-telemetry] Initialized successfully');\n\t} catch (error) {\n\t\tconsole.error('[browser-telemetry] Failed to initialize:', error);\n\t\t// Don't throw - telemetry should never break the app\n\t}\n}\n\nfunction setupErrorHandlers() {\n\tconst tracer = trace.getTracer('error-handler');\n\n\twindow.addEventListener('error', (event) => {\n\t\ttry {\n\t\t\tconst span = tracer.startSpan('browser.error.uncaught', {\n\t\t\t\tstartTime: Date.now(),\n\t\t\t});\n\n\t\t\tconst stackTrace = event.error?.stack || '';\n\n\t\t\tspan.setStatus({\n\t\t\t\tcode: SpanStatusCode.ERROR,\n\t\t\t\tmessage: event.message,\n\t\t\t});\n\n\t\t\tspan.setAttributes({\n\t\t\t\terror: true,\n\t\t\t\t'error.type': event.error?.name || 'UncaughtError',\n\t\t\t\t'error.message': event.message,\n\t\t\t\t'error.stack': stackTrace,\n\t\t\t\t'error.filename': event.filename || '',\n\t\t\t\t'error.lineno': event.lineno || 0,\n\t\t\t\t'error.colno': event.colno || 0,\n\t\t\t\t'browser.url': window.location.href,\n\t\t\t\t'browser.pathname': window.location.pathname,\n\t\t\t\t'browser.user_agent': navigator.userAgent,\n\t\t\t\t'browser.timestamp': new Date().toISOString(),\n\t\t\t});\n\n\t\t\tif (event.error) {\n\t\t\t\tspan.recordException(event.error);\n\t\t\t\tspan.addEvent('exception', {\n\t\t\t\t\t'exception.type': event.error.name,\n\t\t\t\t\t'exception.message': event.error.message,\n\t\t\t\t\t'exception.stacktrace': stackTrace,\n\t\t\t\t\t'exception.escaped': 'false',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tspan.end();\n\t\t} catch (telemetryError) {\n\t\t\t// Telemetry failed - log but don't break the app\n\t\t\tconsole.error(\n\t\t\t\t'[browser-telemetry] Error tracking failed:',\n\t\t\t\ttelemetryError,\n\t\t\t);\n\t\t}\n\t\tconsole.error(\n\t\t\t'[browser-telemetry] Uncaught error:',\n\t\t\tevent.error || event.message,\n\t\t);\n\t});\n\n\twindow.addEventListener('unhandledrejection', (event) => {\n\t\ttry {\n\t\t\tconst span = tracer.startSpan('browser.error.unhandled_rejection', {\n\t\t\t\tstartTime: Date.now(),\n\t\t\t});\n\n\t\t\tconst isError = event.reason instanceof Error;\n\t\t\tconst errorMessage = isError\n\t\t\t\t? event.reason.message\n\t\t\t\t: String(event.reason);\n\t\t\tconst errorStack = isError ? event.reason.stack || '' : '';\n\t\t\tconst errorType = isError ? event.reason.name : 'UnhandledRejection';\n\n\t\t\tspan.setStatus({\n\t\t\t\tcode: SpanStatusCode.ERROR,\n\t\t\t\tmessage: errorMessage,\n\t\t\t});\n\n\t\t\tspan.setAttributes({\n\t\t\t\terror: true,\n\t\t\t\t'error.type': errorType,\n\t\t\t\t'error.message': errorMessage,\n\t\t\t\t'error.stack': errorStack,\n\t\t\t\t'browser.url': window.location.href,\n\t\t\t\t'browser.pathname': window.location.pathname,\n\t\t\t\t'browser.user_agent': navigator.userAgent,\n\t\t\t\t'browser.timestamp': new Date().toISOString(),\n\t\t\t});\n\n\t\t\tif (isError) {\n\t\t\t\tspan.recordException(event.reason);\n\t\t\t\tspan.addEvent('exception', {\n\t\t\t\t\t'exception.type': event.reason.name,\n\t\t\t\t\t'exception.message': event.reason.message,\n\t\t\t\t\t'exception.stacktrace': errorStack,\n\t\t\t\t\t'exception.escaped': 'false',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tspan.end();\n\t\t} catch (telemetryError) {\n\t\t\t// Telemetry failed - log but don't break the app\n\t\t\tconsole.error(\n\t\t\t\t'[browser-telemetry] Rejection tracking failed:',\n\t\t\t\ttelemetryError,\n\t\t\t);\n\t\t}\n\t\tconsole.error('[browser-telemetry] Unhandled rejection:', event.reason);\n\t});\n}\n\nasync function setupWebVitals() {\n\ttry {\n\t\tconst { onLCP, onCLS, onTTFB, onINP } = await import('web-vitals');\n\t\tconst tracer = trace.getTracer('web-vitals');\n\n\t\tconst sendToAnalytics = (metric: {\n\t\t\tname: string;\n\t\t\tvalue: number;\n\t\t\trating: string;\n\t\t\tdelta: number;\n\t\t\tid: string;\n\t\t}) => {\n\t\t\ttry {\n\t\t\t\tconst span = tracer.startSpan(`web_vitals.${metric.name}`, {\n\t\t\t\t\tstartTime: Date.now() - metric.value,\n\t\t\t\t});\n\n\t\t\t\tspan.setAttributes({\n\t\t\t\t\t'metric.name': metric.name,\n\t\t\t\t\t'metric.value': metric.value,\n\t\t\t\t\t'metric.rating': metric.rating,\n\t\t\t\t\t'metric.delta': metric.delta,\n\t\t\t\t\t'metric.id': metric.id,\n\t\t\t\t\t'browser.url': window.location.href,\n\t\t\t\t\t'browser.pathname': window.location.pathname,\n\t\t\t\t});\n\n\t\t\t\tspan.end();\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[browser-telemetry] Web Vitals tracking failed:', error);\n\t\t\t}\n\t\t};\n\n\t\tonLCP(sendToAnalytics);\n\t\tonCLS(sendToAnalytics);\n\t\tonTTFB(sendToAnalytics);\n\t\tonINP(sendToAnalytics);\n\n\t\tconsole.log('[browser-telemetry] Web Vitals tracking enabled');\n\t} catch (error) {\n\t\tconsole.warn('[browser-telemetry] Web Vitals not available:', error);\n\t}\n}\n\nfunction setupConsoleCapture() {\n\tconst tracer = trace.getTracer('console');\n\tconst originalError = console.error;\n\n\tconsole.error = (...args: unknown[]) => {\n\t\ttry {\n\t\t\tconst span = tracer.startSpan('browser.console.error');\n\n\t\t\tspan.setAttributes({\n\t\t\t\t'log.level': 'error',\n\t\t\t\t'log.message': args.map(String).join(' '),\n\t\t\t\t'browser.url': window.location.href,\n\t\t\t\t'browser.timestamp': new Date().toISOString(),\n\t\t\t});\n\n\t\t\tspan.end();\n\t\t} catch {\n\t\t\t// Silently fail - don't break console.error\n\t\t}\n\t\toriginalError.apply(console, args);\n\t};\n}\n\nfunction setupVisibilityTracking() {\n\tconst tracer = trace.getTracer('visibility');\n\n\tdocument.addEventListener('visibilitychange', () => {\n\t\ttry {\n\t\t\tconst span = tracer.startSpan('browser.visibility_change');\n\n\t\t\tspan.setAttributes({\n\t\t\t\t'visibility.state': document.visibilityState,\n\t\t\t\t'browser.url': window.location.href,\n\t\t\t\t'browser.timestamp': new Date().toISOString(),\n\t\t\t});\n\n\t\t\tspan.end();\n\t\t} catch {\n\t\t\t// Silently fail - don't break visibility tracking\n\t\t}\n\t});\n}\n\n/**\n * Create a custom span for tracking user interactions\n *\n * @example\n * ```typescript\n * const span = createSpan('user.button_click', { button: 'download' });\n * // ... do something\n * span.end();\n * ```\n */\nexport function createSpan(\n\tname: string,\n\tattributes: Record<string, string | number | boolean> = {},\n) {\n\tif (IS_SERVER || !isInitialized) {\n\t\treturn {\n\t\t\tsetAttributes: () => {},\n\t\t\tsetStatus: () => {},\n\t\t\trecordException: () => {},\n\t\t\tend: () => {},\n\t\t};\n\t}\n\n\ttry {\n\t\tconst tracer = trace.getTracer('custom');\n\t\tconst span = tracer.startSpan(name);\n\n\t\tspan.setAttributes({\n\t\t\t...attributes,\n\t\t\t'browser.url': window.location.href,\n\t\t\t'browser.pathname': window.location.pathname,\n\t\t});\n\n\t\treturn span;\n\t} catch (error) {\n\t\tconsole.error('[browser-telemetry] Failed to create span:', error);\n\t\treturn {\n\t\t\tsetAttributes: () => {},\n\t\t\tsetStatus: () => {},\n\t\t\trecordException: () => {},\n\t\t\tend: () => {},\n\t\t};\n\t}\n}\n\n/**\n * Track a custom event\n *\n * @example\n * ```typescript\n * trackEvent('download_click', { platform: 'mac' });\n * ```\n */\nexport function trackEvent(\n\teventName: string,\n\tattributes: Record<string, string | number | boolean> = {},\n) {\n\tif (IS_SERVER || !isInitialized) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst span = createSpan(`custom.${eventName}`, attributes);\n\t\tspan.end();\n\t} catch (error) {\n\t\tconsole.error('[browser-telemetry] Failed to track event:', error);\n\t}\n}\n\n/**\n * Track an error with context\n *\n * @example\n * ```typescript\n * try {\n * // ... something\n * } catch (error) {\n * trackError(error, { action: 'checkout', step: 'payment' });\n * }\n * ```\n */\nexport function trackError(\n\terror: Error,\n\tcontext: Record<string, string | number | boolean> = {},\n) {\n\tif (IS_SERVER || !isInitialized) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst tracer = trace.getTracer('error-handler');\n\t\tconst span = tracer.startSpan('browser.error.tracked');\n\n\t\tconst stackTrace = error.stack || '';\n\n\t\tspan.setStatus({\n\t\t\tcode: SpanStatusCode.ERROR,\n\t\t\tmessage: error.message,\n\t\t});\n\n\t\tspan.setAttributes({\n\t\t\terror: true,\n\t\t\t'error.type': error.name,\n\t\t\t'error.message': error.message,\n\t\t\t'error.stack': stackTrace,\n\t\t\t...context,\n\t\t\t'browser.url': window.location.href,\n\t\t\t'browser.pathname': window.location.pathname,\n\t\t\t'browser.timestamp': new Date().toISOString(),\n\t\t});\n\n\t\tspan.recordException(error);\n\n\t\tspan.addEvent('exception', {\n\t\t\t'exception.type': error.name,\n\t\t\t'exception.message': error.message,\n\t\t\t'exception.stacktrace': stackTrace,\n\t\t\t'exception.escaped': 'false',\n\t\t});\n\n\t\tspan.end();\n\t} catch (telemetryError) {\n\t\tconsole.error('[browser-telemetry] Failed to track error:', telemetryError);\n\t}\n}\n\n/**\n * Gracefully shutdown telemetry\n */\nexport async function shutdownTelemetry() {\n\tif (tracerProvider) {\n\t\tawait tracerProvider.shutdown();\n\t\tisInitialized = false;\n\t\tconsole.log('[browser-telemetry] Shut down successfully');\n\t}\n}\n",
|
|
6
|
+
"import {\n\tcreateContext,\n\ttype ReactNode,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseState,\n} from 'react';\n\n// Inline type definition to avoid importing from ./index during SSR bundling\nexport interface BrowserTelemetryOptions {\n\tserviceName?: string;\n\tserviceVersion?: string;\n\totlpEndpoint?: string;\n\tapiKey?: string;\n\tisProduction?: boolean;\n\tenableWebVitals?: boolean;\n\tenableConsoleCapture?: boolean;\n}\n\nconst IS_SERVER = typeof window === 'undefined';\n\n// Lazy-load browser telemetry module only when actually needed (client-side)\n// biome-ignore lint/suspicious/noExplicitAny: Dynamic import type\nlet telemetryModule: any = null;\n\nconst loadTelemetry = async () => {\n\tif (IS_SERVER || telemetryModule) {\n\t\treturn telemetryModule;\n\t}\n\n\ttry {\n\t\t// Dynamic import that stays dynamic (not resolved during bundling)\n\t\t// Use relative path since we're in the same package\n\t\tconst module = await import('./index');\n\t\ttelemetryModule = module;\n\t\treturn telemetryModule;\n\t} catch (error) {\n\t\tconsole.warn('[TelemetryProvider] Failed to load telemetry module:', error);\n\t\treturn null;\n\t}\n};\n\ninterface TelemetryContextType {\n\tcreateCustomSpan: (\n\t\tname: string,\n\t\tattributes?: Record<string, string | number | boolean>,\n\t) => {\n\t\tsetAttributes: (attrs: Record<string, string | number | boolean>) => void;\n\t\tsetStatus: (status: { code: number; message?: string }) => void;\n\t\trecordException: (error: Error) => void;\n\t\tend: () => void;\n\t};\n\ttrackCustomEvent: (\n\t\teventName: string,\n\t\tattributes?: Record<string, string | number | boolean>,\n\t) => void;\n\ttrackCustomError: (\n\t\terror: Error,\n\t\tcontext?: Record<string, string | number | boolean>,\n\t) => void;\n}\n\nconst TelemetryContext = createContext<TelemetryContextType | null>(null);\n\n// No-op implementations for SSR\nconst noopSpan = {\n\tsetAttributes: () => {},\n\tsetStatus: () => {},\n\trecordException: () => {},\n\tend: () => {},\n};\n\nconst noopContext = {\n\tcreateCustomSpan: () => noopSpan,\n\ttrackCustomEvent: () => {},\n\ttrackCustomError: () => {},\n};\n\nexport function TelemetryProvider({\n\tchildren,\n\tserviceName,\n\tserviceVersion,\n\totlpEndpoint,\n\tapiKey,\n\tisProduction,\n\tenableWebVitals,\n\tenableConsoleCapture,\n}: BrowserTelemetryOptions & { children: ReactNode }) {\n\t// Always call hooks unconditionally (required by Rules of Hooks)\n\tconst [isMounted, setIsMounted] = useState(false);\n\n\tconst opts = useMemo(\n\t\t() => ({\n\t\t\tserviceName,\n\t\t\tserviceVersion,\n\t\t\totlpEndpoint,\n\t\t\tapiKey,\n\t\t\tisProduction,\n\t\t\tenableWebVitals,\n\t\t\tenableConsoleCapture,\n\t\t}),\n\t\t[\n\t\t\tserviceName,\n\t\t\tserviceVersion,\n\t\t\totlpEndpoint,\n\t\t\tapiKey,\n\t\t\tisProduction,\n\t\t\tenableWebVitals,\n\t\t\tenableConsoleCapture,\n\t\t],\n\t);\n\n\tuseEffect(() => {\n\t\t// Skip on server\n\t\tif (IS_SERVER) return;\n\t\tsetIsMounted(true);\n\t}, []);\n\n\tuseEffect(() => {\n\t\t// Skip on server or before mount\n\t\tif (IS_SERVER || !isMounted) return;\n\n\t\tloadTelemetry()\n\t\t\t.then((module) => {\n\t\t\t\tif (module?.initBrowserTelemetry) {\n\t\t\t\t\tmodule.initBrowserTelemetry(opts);\n\t\t\t\t\tconsole.debug('[TelemetryProvider] Browser telemetry initialized');\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('[TelemetryProvider] Failed to load telemetry:', error);\n\t\t\t});\n\t}, [opts, isMounted]);\n\n\tconst createCustomSpan = useCallback(\n\t\t(name: string, attributes?: Record<string, string | number | boolean>) => {\n\t\t\tif (telemetryModule) {\n\t\t\t\treturn telemetryModule.createSpan(name, attributes);\n\t\t\t}\n\t\t\treturn noopSpan;\n\t\t},\n\t\t[],\n\t);\n\n\tconst trackCustomEvent = useCallback(\n\t\t(\n\t\t\teventName: string,\n\t\t\tattributes?: Record<string, string | number | boolean>,\n\t\t) => {\n\t\t\tif (telemetryModule) {\n\t\t\t\ttelemetryModule.trackEvent(eventName, attributes);\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\n\tconst trackCustomError = useCallback(\n\t\t(error: Error, context?: Record<string, string | number | boolean>) => {\n\t\t\tif (telemetryModule) {\n\t\t\t\ttelemetryModule.trackError(error, context);\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\n\t// Handle SSR case after all hooks are called\n\tconst contextValue = IS_SERVER\n\t\t? noopContext\n\t\t: {\n\t\t\t\tcreateCustomSpan,\n\t\t\t\ttrackCustomEvent,\n\t\t\t\ttrackCustomError,\n\t\t\t};\n\n\treturn (\n\t\t<TelemetryContext.Provider value={contextValue}>\n\t\t\t{children}\n\t\t</TelemetryContext.Provider>\n\t);\n}\n\nexport function useTelemetry() {\n\tconst context = useContext(TelemetryContext);\n\tif (!context) {\n\t\tthrow new Error('useTelemetry must be used within a TelemetryProvider');\n\t}\n\treturn context;\n}\n"
|
|
6
7
|
],
|
|
7
|
-
"mappings": "
|
|
8
|
-
"debugId": "
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "DC79F3C9CFD9854C64756E2164756E21",
|
|
9
10
|
"names": []
|
|
10
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../../../../../packages/telemetry/src/browser/react.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,SAAS,EAMd,MAAM,OAAO,CAAC;AAGf,MAAM,WAAW,uBAAuB;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAC/B;
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../../../../../packages/telemetry/src/browser/react.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,SAAS,EAMd,MAAM,OAAO,CAAC;AAGf,MAAM,WAAW,uBAAuB;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAyBD,UAAU,oBAAoB;IAC7B,gBAAgB,EAAE,CACjB,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,KAClD;QACJ,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC;QAC1E,SAAS,EAAE,CAAC,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAC;QAChE,eAAe,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;QACxC,GAAG,EAAE,MAAM,IAAI,CAAC;KAChB,CAAC;IACF,gBAAgB,EAAE,CACjB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,KAClD,IAAI,CAAC;IACV,gBAAgB,EAAE,CACjB,KAAK,EAAE,KAAK,EACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,KAC/C,IAAI,CAAC;CACV;AAkBD,wBAAgB,iBAAiB,CAAC,EACjC,QAAQ,EACR,WAAW,EACX,cAAc,EACd,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,eAAe,EACf,oBAAoB,GACpB,EAAE,uBAAuB,GAAG;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CA4FnD;AAED,wBAAgB,YAAY,yBAM3B"}
|