reroute-js 0.25.2 → 0.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +150 -52
- package/cli/bin.d.ts +1 -1
- package/cli/bin.js +446 -150
- package/cli/bin.js.map +13 -9
- 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/gen.d.ts.map +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 +912 -589
- package/core/index.js.map +22 -14
- package/core/src/bundler/hash.d.ts +1 -1
- package/core/src/bundler/index.d.ts +1 -1
- package/core/src/config.d.ts +243 -2
- package/core/src/config.d.ts.map +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 +2 -2
- package/core/src/ssr/lib/scripts/data.d.ts.map +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 +4 -2
- package/core/src/ssr/lib/setup.d.ts.map +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 +4 -2
- package/core/src/ssr/render.d.ts.map +1 -1
- package/core/src/ssr/stream.d.ts +4 -2
- package/core/src/ssr/stream.d.ts.map +1 -1
- package/elysia/index.d.ts +1 -1
- package/elysia/index.js +715 -468
- package/elysia/index.js.map +15 -11
- 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/content.d.ts.map +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/ssr.d.ts.map +1 -1
- package/elysia/src/routes/static.d.ts +1 -1
- package/elysia/src/routes/static.d.ts.map +1 -1
- package/elysia/src/types.d.ts +1 -1
- package/package.json +2 -9
- 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/react.d.ts +2 -2
- package/telemetry/react.d.ts.map +1 -1
- package/telemetry/react.js +167 -185
- package/telemetry/react.js.map +7 -6
- package/telemetry/{index.d.ts → server.d.ts} +2 -2
- package/telemetry/server.d.ts.map +1 -0
- package/telemetry/server.js +1134 -0
- package/telemetry/server.js.map +44 -0
- package/telemetry/src/{browser/react.d.ts → react/api.d.ts} +4 -12
- package/telemetry/src/react/api.d.ts.map +1 -0
- package/telemetry/{browser.d.ts → src/react/index.d.ts} +4 -3
- package/telemetry/src/react/index.d.ts.map +1 -0
- package/telemetry/src/{browser/index.d.ts → react/telemetry.d.ts} +13 -13
- package/telemetry/src/react/telemetry.d.ts.map +1 -0
- package/telemetry/src/server/index.d.ts +3 -101
- package/telemetry/src/server/index.d.ts.map +1 -1
- package/telemetry/src/server/instrumentation.d.ts +62 -0
- package/telemetry/src/server/instrumentation.d.ts.map +1 -0
- package/telemetry/src/server/plugin.d.ts +72 -0
- package/telemetry/src/server/plugin.d.ts.map +1 -0
- package/telemetry/browser.d.ts.map +0 -1
- package/telemetry/browser.js +0 -382
- package/telemetry/browser.js.map +0 -10
- package/telemetry/index.d.ts.map +0 -1
- package/telemetry/index.js +0 -509
- package/telemetry/index.js.map +0 -10
- package/telemetry/src/browser/index.d.ts.map +0 -1
- package/telemetry/src/browser/react.d.ts.map +0 -1
package/telemetry/browser.js
DELETED
|
@@ -1,382 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* reroute-js v0.25.2
|
|
3
|
-
*
|
|
4
|
-
* @license MIT
|
|
5
|
-
* @copyright 2025 stewones <hi@stewan.io>
|
|
6
|
-
* @see https://github.com/stewones/reroute
|
|
7
|
-
*
|
|
8
|
-
* Built with Bun <3
|
|
9
|
-
*/
|
|
10
|
-
var __create = Object.create;
|
|
11
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
12
|
-
var __defProp = Object.defineProperty;
|
|
13
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
14
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
15
|
-
var __toESM = (mod, isNodeMode, target) => {
|
|
16
|
-
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
17
|
-
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
18
|
-
for (let key of __getOwnPropNames(mod))
|
|
19
|
-
if (!__hasOwnProp.call(to, key))
|
|
20
|
-
__defProp(to, key, {
|
|
21
|
-
get: () => mod[key],
|
|
22
|
-
enumerable: true
|
|
23
|
-
});
|
|
24
|
-
return to;
|
|
25
|
-
};
|
|
26
|
-
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
27
|
-
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
28
|
-
}) : x)(function(x) {
|
|
29
|
-
if (typeof require !== "undefined")
|
|
30
|
-
return require.apply(this, arguments);
|
|
31
|
-
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
// packages/telemetry/src/browser/index.ts
|
|
35
|
-
var IS_SERVER = typeof window === "undefined";
|
|
36
|
-
var isInitialized = false;
|
|
37
|
-
var tracerProvider = null;
|
|
38
|
-
async function initBrowserTelemetry(options = {}) {
|
|
39
|
-
if (IS_SERVER || isInitialized) {
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
try {
|
|
43
|
-
const [
|
|
44
|
-
{ getWebAutoInstrumentations },
|
|
45
|
-
{ ZoneContextManager },
|
|
46
|
-
{ OTLPTraceExporter },
|
|
47
|
-
{ registerInstrumentations },
|
|
48
|
-
{ resourceFromAttributes },
|
|
49
|
-
{ BatchSpanProcessor },
|
|
50
|
-
{ WebTracerProvider },
|
|
51
|
-
{ ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION }
|
|
52
|
-
] = await Promise.all([
|
|
53
|
-
import("@opentelemetry/auto-instrumentations-web"),
|
|
54
|
-
import("@opentelemetry/context-zone"),
|
|
55
|
-
import("@opentelemetry/exporter-trace-otlp-http"),
|
|
56
|
-
import("@opentelemetry/instrumentation"),
|
|
57
|
-
import("@opentelemetry/resources"),
|
|
58
|
-
import("@opentelemetry/sdk-trace-base"),
|
|
59
|
-
import("@opentelemetry/sdk-trace-web"),
|
|
60
|
-
import("@opentelemetry/semantic-conventions")
|
|
61
|
-
]);
|
|
62
|
-
const env = typeof import.meta !== "undefined" ? import.meta.env : undefined;
|
|
63
|
-
const SERVICE_NAME = options.serviceName || "reroute-app-browser";
|
|
64
|
-
const SERVICE_VERSION = options.serviceVersion || "1.0.0";
|
|
65
|
-
const OTLP_ENDPOINT = options.otlpEndpoint || "/api/telemetry";
|
|
66
|
-
const IS_PRODUCTION = options.isProduction ?? env?.PROD ?? false;
|
|
67
|
-
const ENABLE_WEB_VITALS = options.enableWebVitals ?? true;
|
|
68
|
-
const ENABLE_CONSOLE_CAPTURE = options.enableConsoleCapture ?? IS_PRODUCTION;
|
|
69
|
-
console.log(`[browser-telemetry] Initializing with endpoint: ${OTLP_ENDPOINT}`);
|
|
70
|
-
const headers = {};
|
|
71
|
-
const apiKey = options.apiKey || env?.REROUTE_SIGNOZ_API_KEY;
|
|
72
|
-
if (apiKey) {
|
|
73
|
-
headers.Authorization = `Bearer ${apiKey}`;
|
|
74
|
-
}
|
|
75
|
-
const exporter = new OTLPTraceExporter({
|
|
76
|
-
url: `${OTLP_ENDPOINT}/v1/traces`,
|
|
77
|
-
headers: Object.keys(headers).length > 0 ? headers : undefined
|
|
78
|
-
});
|
|
79
|
-
const resource = resourceFromAttributes({
|
|
80
|
-
[ATTR_SERVICE_NAME]: SERVICE_NAME,
|
|
81
|
-
[ATTR_SERVICE_VERSION]: SERVICE_VERSION,
|
|
82
|
-
"deployment.environment": IS_PRODUCTION ? "production" : "development",
|
|
83
|
-
"browser.user_agent": navigator.userAgent,
|
|
84
|
-
"browser.language": navigator.language,
|
|
85
|
-
"browser.platform": navigator.platform,
|
|
86
|
-
"screen.width": window.screen.width,
|
|
87
|
-
"screen.height": window.screen.height
|
|
88
|
-
});
|
|
89
|
-
const spanProcessor = new BatchSpanProcessor(exporter, {
|
|
90
|
-
maxQueueSize: 100,
|
|
91
|
-
maxExportBatchSize: 10,
|
|
92
|
-
scheduledDelayMillis: 500
|
|
93
|
-
});
|
|
94
|
-
tracerProvider = new WebTracerProvider({
|
|
95
|
-
resource,
|
|
96
|
-
spanProcessors: [spanProcessor]
|
|
97
|
-
});
|
|
98
|
-
tracerProvider.register({
|
|
99
|
-
contextManager: new ZoneContextManager
|
|
100
|
-
});
|
|
101
|
-
registerInstrumentations({
|
|
102
|
-
instrumentations: [
|
|
103
|
-
getWebAutoInstrumentations({
|
|
104
|
-
"@opentelemetry/instrumentation-document-load": {
|
|
105
|
-
enabled: true
|
|
106
|
-
},
|
|
107
|
-
"@opentelemetry/instrumentation-user-interaction": {
|
|
108
|
-
enabled: true,
|
|
109
|
-
eventNames: ["click", "submit"]
|
|
110
|
-
},
|
|
111
|
-
"@opentelemetry/instrumentation-fetch": {
|
|
112
|
-
enabled: true,
|
|
113
|
-
propagateTraceHeaderCorsUrls: [/.*/],
|
|
114
|
-
clearTimingResources: true
|
|
115
|
-
},
|
|
116
|
-
"@opentelemetry/instrumentation-xml-http-request": {
|
|
117
|
-
enabled: true,
|
|
118
|
-
propagateTraceHeaderCorsUrls: [/.*/],
|
|
119
|
-
clearTimingResources: true
|
|
120
|
-
}
|
|
121
|
-
})
|
|
122
|
-
]
|
|
123
|
-
});
|
|
124
|
-
setupErrorHandlers().catch((err) => console.error("[browser-telemetry] Error handler setup failed:", err));
|
|
125
|
-
if (ENABLE_WEB_VITALS) {
|
|
126
|
-
setupWebVitals().catch((err) => console.error("[browser-telemetry] Web Vitals setup failed:", err));
|
|
127
|
-
}
|
|
128
|
-
if (ENABLE_CONSOLE_CAPTURE) {
|
|
129
|
-
setupConsoleCapture().catch((err) => console.error("[browser-telemetry] Console capture setup failed:", err));
|
|
130
|
-
}
|
|
131
|
-
setupVisibilityTracking().catch((err) => console.error("[browser-telemetry] Visibility tracking setup failed:", err));
|
|
132
|
-
isInitialized = true;
|
|
133
|
-
console.log("[browser-telemetry] Initialized successfully");
|
|
134
|
-
} catch (error) {
|
|
135
|
-
console.error("[browser-telemetry] Failed to initialize:", error);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
async function setupErrorHandlers() {
|
|
139
|
-
const { trace, SpanStatusCode } = await import("@opentelemetry/api");
|
|
140
|
-
const tracer = trace.getTracer("error-handler");
|
|
141
|
-
window.addEventListener("error", (event) => {
|
|
142
|
-
try {
|
|
143
|
-
const span = tracer.startSpan("browser.error.uncaught", {
|
|
144
|
-
startTime: Date.now()
|
|
145
|
-
});
|
|
146
|
-
const stackTrace = event.error?.stack || "";
|
|
147
|
-
span.setStatus({
|
|
148
|
-
code: SpanStatusCode.ERROR,
|
|
149
|
-
message: event.message
|
|
150
|
-
});
|
|
151
|
-
span.setAttributes({
|
|
152
|
-
error: true,
|
|
153
|
-
"error.type": event.error?.name || "UncaughtError",
|
|
154
|
-
"error.message": event.message,
|
|
155
|
-
"error.stack": stackTrace,
|
|
156
|
-
"error.filename": event.filename || "",
|
|
157
|
-
"error.lineno": event.lineno || 0,
|
|
158
|
-
"error.colno": event.colno || 0,
|
|
159
|
-
"browser.url": window.location.href,
|
|
160
|
-
"browser.pathname": window.location.pathname,
|
|
161
|
-
"browser.user_agent": navigator.userAgent,
|
|
162
|
-
"browser.timestamp": new Date().toISOString()
|
|
163
|
-
});
|
|
164
|
-
if (event.error) {
|
|
165
|
-
span.recordException(event.error);
|
|
166
|
-
span.addEvent("exception", {
|
|
167
|
-
"exception.type": event.error.name,
|
|
168
|
-
"exception.message": event.error.message,
|
|
169
|
-
"exception.stacktrace": stackTrace,
|
|
170
|
-
"exception.escaped": "false"
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
span.end();
|
|
174
|
-
} catch (telemetryError) {
|
|
175
|
-
console.error("[browser-telemetry] Error tracking failed:", telemetryError);
|
|
176
|
-
}
|
|
177
|
-
console.error("[browser-telemetry] Uncaught error:", event.error || event.message);
|
|
178
|
-
});
|
|
179
|
-
window.addEventListener("unhandledrejection", (event) => {
|
|
180
|
-
try {
|
|
181
|
-
const span = tracer.startSpan("browser.error.unhandled_rejection", {
|
|
182
|
-
startTime: Date.now()
|
|
183
|
-
});
|
|
184
|
-
const isError = event.reason instanceof Error;
|
|
185
|
-
const errorMessage = isError ? event.reason.message : String(event.reason);
|
|
186
|
-
const errorStack = isError ? event.reason.stack || "" : "";
|
|
187
|
-
const errorType = isError ? event.reason.name : "UnhandledRejection";
|
|
188
|
-
span.setStatus({
|
|
189
|
-
code: SpanStatusCode.ERROR,
|
|
190
|
-
message: errorMessage
|
|
191
|
-
});
|
|
192
|
-
span.setAttributes({
|
|
193
|
-
error: true,
|
|
194
|
-
"error.type": errorType,
|
|
195
|
-
"error.message": errorMessage,
|
|
196
|
-
"error.stack": errorStack,
|
|
197
|
-
"browser.url": window.location.href,
|
|
198
|
-
"browser.pathname": window.location.pathname,
|
|
199
|
-
"browser.user_agent": navigator.userAgent,
|
|
200
|
-
"browser.timestamp": new Date().toISOString()
|
|
201
|
-
});
|
|
202
|
-
if (isError) {
|
|
203
|
-
span.recordException(event.reason);
|
|
204
|
-
span.addEvent("exception", {
|
|
205
|
-
"exception.type": event.reason.name,
|
|
206
|
-
"exception.message": event.reason.message,
|
|
207
|
-
"exception.stacktrace": errorStack,
|
|
208
|
-
"exception.escaped": "false"
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
span.end();
|
|
212
|
-
} catch (telemetryError) {
|
|
213
|
-
console.error("[browser-telemetry] Rejection tracking failed:", telemetryError);
|
|
214
|
-
}
|
|
215
|
-
console.error("[browser-telemetry] Unhandled rejection:", event.reason);
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
async function setupWebVitals() {
|
|
219
|
-
try {
|
|
220
|
-
const { onLCP, onCLS, onTTFB, onINP } = await import("web-vitals");
|
|
221
|
-
const { trace } = await import("@opentelemetry/api");
|
|
222
|
-
const tracer = trace.getTracer("web-vitals");
|
|
223
|
-
const sendToAnalytics = (metric) => {
|
|
224
|
-
try {
|
|
225
|
-
const span = tracer.startSpan(`web_vitals.${metric.name}`, {
|
|
226
|
-
startTime: Date.now() - metric.value
|
|
227
|
-
});
|
|
228
|
-
span.setAttributes({
|
|
229
|
-
"metric.name": metric.name,
|
|
230
|
-
"metric.value": metric.value,
|
|
231
|
-
"metric.rating": metric.rating,
|
|
232
|
-
"metric.delta": metric.delta,
|
|
233
|
-
"metric.id": metric.id,
|
|
234
|
-
"browser.url": window.location.href,
|
|
235
|
-
"browser.pathname": window.location.pathname
|
|
236
|
-
});
|
|
237
|
-
span.end();
|
|
238
|
-
} catch (error) {
|
|
239
|
-
console.error("[browser-telemetry] Web Vitals tracking failed:", error);
|
|
240
|
-
}
|
|
241
|
-
};
|
|
242
|
-
onLCP(sendToAnalytics);
|
|
243
|
-
onCLS(sendToAnalytics);
|
|
244
|
-
onTTFB(sendToAnalytics);
|
|
245
|
-
onINP(sendToAnalytics);
|
|
246
|
-
console.log("[browser-telemetry] Web Vitals tracking enabled");
|
|
247
|
-
} catch (error) {
|
|
248
|
-
console.warn("[browser-telemetry] Web Vitals not available:", error);
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
async function setupConsoleCapture() {
|
|
252
|
-
const { trace } = await import("@opentelemetry/api");
|
|
253
|
-
const tracer = trace.getTracer("console");
|
|
254
|
-
const originalError = console.error;
|
|
255
|
-
if (originalError.__telemetry_captured__) {
|
|
256
|
-
return;
|
|
257
|
-
}
|
|
258
|
-
const wrappedError = (...args) => {
|
|
259
|
-
try {
|
|
260
|
-
const span = tracer.startSpan("browser.console.error");
|
|
261
|
-
span.setAttributes({
|
|
262
|
-
"log.level": "error",
|
|
263
|
-
"log.message": args.map(String).join(" "),
|
|
264
|
-
"browser.url": window.location.href,
|
|
265
|
-
"browser.timestamp": new Date().toISOString()
|
|
266
|
-
});
|
|
267
|
-
span.end();
|
|
268
|
-
} catch {}
|
|
269
|
-
originalError.apply(console, args);
|
|
270
|
-
};
|
|
271
|
-
wrappedError.__telemetry_captured__ = true;
|
|
272
|
-
console.error = wrappedError;
|
|
273
|
-
}
|
|
274
|
-
async function setupVisibilityTracking() {
|
|
275
|
-
const { trace } = await import("@opentelemetry/api");
|
|
276
|
-
const tracer = trace.getTracer("visibility");
|
|
277
|
-
document.addEventListener("visibilitychange", () => {
|
|
278
|
-
try {
|
|
279
|
-
const span = tracer.startSpan("browser.visibility_change");
|
|
280
|
-
span.setAttributes({
|
|
281
|
-
"visibility.state": document.visibilityState,
|
|
282
|
-
"browser.url": window.location.href,
|
|
283
|
-
"browser.timestamp": new Date().toISOString()
|
|
284
|
-
});
|
|
285
|
-
span.end();
|
|
286
|
-
} catch {}
|
|
287
|
-
});
|
|
288
|
-
}
|
|
289
|
-
function createSpan(name, attributes = {}) {
|
|
290
|
-
if (IS_SERVER || !isInitialized) {
|
|
291
|
-
return {
|
|
292
|
-
setAttributes: () => {},
|
|
293
|
-
setStatus: () => {},
|
|
294
|
-
recordException: () => {},
|
|
295
|
-
end: () => {}
|
|
296
|
-
};
|
|
297
|
-
}
|
|
298
|
-
try {
|
|
299
|
-
const trace = globalThis.__OTEL_TRACE__ || __require("@opentelemetry/api").trace;
|
|
300
|
-
if (!globalThis.__OTEL_TRACE__) {
|
|
301
|
-
globalThis.__OTEL_TRACE__ = trace;
|
|
302
|
-
}
|
|
303
|
-
const tracer = trace.getTracer("custom");
|
|
304
|
-
const span = tracer.startSpan(name);
|
|
305
|
-
span.setAttributes({
|
|
306
|
-
...attributes,
|
|
307
|
-
"browser.url": window.location.href,
|
|
308
|
-
"browser.pathname": window.location.pathname
|
|
309
|
-
});
|
|
310
|
-
return span;
|
|
311
|
-
} catch (error) {
|
|
312
|
-
console.error("[browser-telemetry] Failed to create span:", error);
|
|
313
|
-
return {
|
|
314
|
-
setAttributes: () => {},
|
|
315
|
-
setStatus: () => {},
|
|
316
|
-
recordException: () => {},
|
|
317
|
-
end: () => {}
|
|
318
|
-
};
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
function trackEvent(eventName, attributes = {}) {
|
|
322
|
-
if (IS_SERVER || !isInitialized) {
|
|
323
|
-
return;
|
|
324
|
-
}
|
|
325
|
-
try {
|
|
326
|
-
const span = createSpan(`custom.${eventName}`, attributes);
|
|
327
|
-
span.end();
|
|
328
|
-
} catch (error) {
|
|
329
|
-
console.error("[browser-telemetry] Failed to track event:", error);
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
function trackError(error, context = {}) {
|
|
333
|
-
if (IS_SERVER || !isInitialized) {
|
|
334
|
-
return;
|
|
335
|
-
}
|
|
336
|
-
try {
|
|
337
|
-
const { trace, SpanStatusCode } = __require("@opentelemetry/api");
|
|
338
|
-
const tracer = trace.getTracer("error-handler");
|
|
339
|
-
const span = tracer.startSpan("browser.error.tracked");
|
|
340
|
-
const stackTrace = error.stack || "";
|
|
341
|
-
span.setStatus({
|
|
342
|
-
code: SpanStatusCode.ERROR,
|
|
343
|
-
message: error.message
|
|
344
|
-
});
|
|
345
|
-
span.setAttributes({
|
|
346
|
-
error: true,
|
|
347
|
-
"error.type": error.name,
|
|
348
|
-
"error.message": error.message,
|
|
349
|
-
"error.stack": stackTrace,
|
|
350
|
-
...context,
|
|
351
|
-
"browser.url": window.location.href,
|
|
352
|
-
"browser.pathname": window.location.pathname,
|
|
353
|
-
"browser.timestamp": new Date().toISOString()
|
|
354
|
-
});
|
|
355
|
-
span.recordException(error);
|
|
356
|
-
span.addEvent("exception", {
|
|
357
|
-
"exception.type": error.name,
|
|
358
|
-
"exception.message": error.message,
|
|
359
|
-
"exception.stacktrace": stackTrace,
|
|
360
|
-
"exception.escaped": "false"
|
|
361
|
-
});
|
|
362
|
-
span.end();
|
|
363
|
-
} catch (telemetryError) {
|
|
364
|
-
console.error("[browser-telemetry] Failed to track error:", telemetryError);
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
async function shutdownTelemetry() {
|
|
368
|
-
if (tracerProvider) {
|
|
369
|
-
await tracerProvider.shutdown();
|
|
370
|
-
isInitialized = false;
|
|
371
|
-
console.log("[browser-telemetry] Shut down successfully");
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
export {
|
|
375
|
-
trackEvent,
|
|
376
|
-
trackError,
|
|
377
|
-
shutdownTelemetry,
|
|
378
|
-
initBrowserTelemetry,
|
|
379
|
-
createSpan
|
|
380
|
-
};
|
|
381
|
-
|
|
382
|
-
//# debugId=D743E81166FB016B64756E2164756E21
|
package/telemetry/browser.js.map
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../packages/telemetry/src/browser/index.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/** biome-ignore-all lint/suspicious/noExplicitAny: That's fine */\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: any = 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 async function initBrowserTelemetry(\n\toptions: BrowserTelemetryOptions = {},\n) {\n\tif (IS_SERVER || isInitialized) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\t// Lazy load OpenTelemetry modules to prevent SSR execution\n\t\tconst [\n\t\t\t{ getWebAutoInstrumentations },\n\t\t\t{ ZoneContextManager },\n\t\t\t{ OTLPTraceExporter },\n\t\t\t{ registerInstrumentations },\n\t\t\t{ resourceFromAttributes },\n\t\t\t{ BatchSpanProcessor },\n\t\t\t{ WebTracerProvider },\n\t\t\t{ ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION },\n\t\t] = await Promise.all([\n\t\t\timport('@opentelemetry/auto-instrumentations-web'),\n\t\t\timport('@opentelemetry/context-zone'),\n\t\t\timport('@opentelemetry/exporter-trace-otlp-http'),\n\t\t\timport('@opentelemetry/instrumentation'),\n\t\t\timport('@opentelemetry/resources'),\n\t\t\timport('@opentelemetry/sdk-trace-base'),\n\t\t\timport('@opentelemetry/sdk-trace-web'),\n\t\t\timport('@opentelemetry/semantic-conventions'),\n\t\t]);\n\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 (async but don't await - let them set up in background)\n\t\tsetupErrorHandlers().catch((err) =>\n\t\t\tconsole.error('[browser-telemetry] Error handler setup failed:', err),\n\t\t);\n\n\t\t// Setup Web Vitals (async but don't await)\n\t\tif (ENABLE_WEB_VITALS) {\n\t\t\tsetupWebVitals().catch((err) =>\n\t\t\t\tconsole.error('[browser-telemetry] Web Vitals setup failed:', err),\n\t\t\t);\n\t\t}\n\n\t\t// Setup console capture (async but don't await)\n\t\tif (ENABLE_CONSOLE_CAPTURE) {\n\t\t\tsetupConsoleCapture().catch((err) =>\n\t\t\t\tconsole.error('[browser-telemetry] Console capture setup failed:', err),\n\t\t\t);\n\t\t}\n\n\t\t// Track page visibility (async but don't await)\n\t\tsetupVisibilityTracking().catch((err) =>\n\t\t\tconsole.error(\n\t\t\t\t'[browser-telemetry] Visibility tracking setup failed:',\n\t\t\t\terr,\n\t\t\t),\n\t\t);\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\nasync function setupErrorHandlers() {\n\tconst { trace, SpanStatusCode } = await import('@opentelemetry/api');\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 { trace } = await import('@opentelemetry/api');\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\nasync function setupConsoleCapture() {\n\tconst { trace } = await import('@opentelemetry/api');\n\tconst tracer = trace.getTracer('console');\n\n\t// Store reference to current console.error (which might be a test spy)\n\tconst originalError = console.error;\n\n\t// Don't override if it's already been captured (e.g., in tests)\n\tif ((originalError as any).__telemetry_captured__) {\n\t\treturn;\n\t}\n\n\tconst wrappedError = (...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\t// Mark as captured\n\t(wrappedError as any).__telemetry_captured__ = true;\n\tconsole.error = wrappedError;\n}\n\nasync function setupVisibilityTracking() {\n\tconst { trace } = await import('@opentelemetry/api');\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\t// Use globalThis cache to avoid repeated imports\n\t\tconst trace =\n\t\t\t(globalThis as any).__OTEL_TRACE__ || require('@opentelemetry/api').trace;\n\t\tif (!(globalThis as any).__OTEL_TRACE__) {\n\t\t\t(globalThis as any).__OTEL_TRACE__ = trace;\n\t\t}\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 { trace, SpanStatusCode } = require('@opentelemetry/api');\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
|
-
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "D743E81166FB016B64756E2164756E21",
|
|
9
|
-
"names": []
|
|
10
|
-
}
|
package/telemetry/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/telemetry/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
|