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
|
@@ -0,0 +1,1134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* reroute-js v0.26.0
|
|
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
|
+
import { createRequire } from "node:module";
|
|
11
|
+
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
12
|
+
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
13
|
+
|
|
14
|
+
// packages/telemetry/src/server/instrumentation.ts
|
|
15
|
+
import { context, SpanStatusCode, trace } from "@opentelemetry/api";
|
|
16
|
+
function isOtelAvailable() {
|
|
17
|
+
if (otelAvailable !== undefined)
|
|
18
|
+
return otelAvailable;
|
|
19
|
+
try {
|
|
20
|
+
__require("@opentelemetry/api");
|
|
21
|
+
otelAvailable = true;
|
|
22
|
+
return true;
|
|
23
|
+
} catch {
|
|
24
|
+
otelAvailable = false;
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
class NoopSpan {
|
|
30
|
+
spanContext() {
|
|
31
|
+
return {
|
|
32
|
+
traceId: "",
|
|
33
|
+
spanId: "",
|
|
34
|
+
traceFlags: 0
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
setAttribute() {
|
|
38
|
+
return this;
|
|
39
|
+
}
|
|
40
|
+
setAttributes() {
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
addEvent() {
|
|
44
|
+
return this;
|
|
45
|
+
}
|
|
46
|
+
addLink() {
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
49
|
+
addLinks() {
|
|
50
|
+
return this;
|
|
51
|
+
}
|
|
52
|
+
setStatus() {
|
|
53
|
+
return this;
|
|
54
|
+
}
|
|
55
|
+
updateName() {
|
|
56
|
+
return this;
|
|
57
|
+
}
|
|
58
|
+
end() {}
|
|
59
|
+
isRecording() {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
recordException() {}
|
|
63
|
+
}
|
|
64
|
+
async function withSpan(name, fn, attributes) {
|
|
65
|
+
if (!isOtelAvailable()) {
|
|
66
|
+
return fn(noopSpan);
|
|
67
|
+
}
|
|
68
|
+
const tracer = trace.getTracer("reroute");
|
|
69
|
+
return tracer.startActiveSpan(name, { attributes }, async (span) => {
|
|
70
|
+
try {
|
|
71
|
+
const result = await fn(span);
|
|
72
|
+
span.end();
|
|
73
|
+
return result;
|
|
74
|
+
} catch (error) {
|
|
75
|
+
span.recordException(error);
|
|
76
|
+
span.setStatus({
|
|
77
|
+
code: SpanStatusCode.ERROR,
|
|
78
|
+
message: error instanceof Error ? error.message : String(error)
|
|
79
|
+
});
|
|
80
|
+
span.end();
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
function withSpanSync(name, fn, attributes) {
|
|
86
|
+
if (!isOtelAvailable()) {
|
|
87
|
+
return fn(noopSpan);
|
|
88
|
+
}
|
|
89
|
+
const tracer = trace.getTracer("reroute");
|
|
90
|
+
return tracer.startActiveSpan(name, { attributes }, (span) => {
|
|
91
|
+
try {
|
|
92
|
+
const result = fn(span);
|
|
93
|
+
span.end();
|
|
94
|
+
return result;
|
|
95
|
+
} catch (error) {
|
|
96
|
+
span.recordException(error);
|
|
97
|
+
span.setStatus({
|
|
98
|
+
code: SpanStatusCode.ERROR,
|
|
99
|
+
message: error instanceof Error ? error.message : String(error)
|
|
100
|
+
});
|
|
101
|
+
span.end();
|
|
102
|
+
throw error;
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
function setSpanAttributes(attributes) {
|
|
107
|
+
if (!isOtelAvailable())
|
|
108
|
+
return;
|
|
109
|
+
const span = trace.getActiveSpan();
|
|
110
|
+
if (span) {
|
|
111
|
+
span.setAttributes(attributes);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function addSpanEvent(name, attributes) {
|
|
115
|
+
if (!isOtelAvailable())
|
|
116
|
+
return;
|
|
117
|
+
const span = trace.getActiveSpan();
|
|
118
|
+
if (span) {
|
|
119
|
+
span.addEvent(name, attributes);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async function withParentSpan(parentSpan, fn) {
|
|
123
|
+
if (!(isOtelAvailable() && parentSpan)) {
|
|
124
|
+
return fn();
|
|
125
|
+
}
|
|
126
|
+
const ctx = trace.setSpan(context.active(), parentSpan);
|
|
127
|
+
return context.with(ctx, fn);
|
|
128
|
+
}
|
|
129
|
+
function withParentSpanSync(parentSpan, fn) {
|
|
130
|
+
if (!(isOtelAvailable() && parentSpan)) {
|
|
131
|
+
return fn();
|
|
132
|
+
}
|
|
133
|
+
const ctx = trace.setSpan(context.active(), parentSpan);
|
|
134
|
+
return context.with(ctx, fn);
|
|
135
|
+
}
|
|
136
|
+
var otelAvailable, noopSpan;
|
|
137
|
+
var init_instrumentation = __esm(() => {
|
|
138
|
+
noopSpan = new NoopSpan;
|
|
139
|
+
});
|
|
140
|
+
// packages/core/src/bundler/index.ts
|
|
141
|
+
var init_bundler = () => {};
|
|
142
|
+
|
|
143
|
+
// packages/core/src/config.ts
|
|
144
|
+
import { pathToFileURL } from "node:url";
|
|
145
|
+
async function loadConfig(cwd) {
|
|
146
|
+
const bundledConfig = globalThis.__REROUTE_CONFIG__;
|
|
147
|
+
if (bundledConfig) {
|
|
148
|
+
return bundledConfig;
|
|
149
|
+
}
|
|
150
|
+
const configPath = `${cwd}/reroute.config.ts`;
|
|
151
|
+
const configFile = Bun.file(configPath);
|
|
152
|
+
if (!await configFile.exists()) {
|
|
153
|
+
return {};
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
const mod = await import(`${pathToFileURL(configPath).href}?t=${Date.now()}`);
|
|
157
|
+
return mod.default || mod;
|
|
158
|
+
} catch (error) {
|
|
159
|
+
console.warn("[reroute] Failed to load reroute.config.ts:", error);
|
|
160
|
+
return {};
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
var init_config = () => {};
|
|
164
|
+
// packages/core/src/content/discovery.ts
|
|
165
|
+
var init_discovery = () => {};
|
|
166
|
+
|
|
167
|
+
// packages/core/src/content/metadata.ts
|
|
168
|
+
var init_metadata = () => {};
|
|
169
|
+
|
|
170
|
+
// packages/core/src/content/index.ts
|
|
171
|
+
var init_content = __esm(() => {
|
|
172
|
+
init_discovery();
|
|
173
|
+
init_metadata();
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
// packages/core/src/ssr/lib/cache.ts
|
|
177
|
+
class SSRDataCache {
|
|
178
|
+
cache = new Map;
|
|
179
|
+
static cleanupInterval = null;
|
|
180
|
+
constructor() {
|
|
181
|
+
if (!SSRDataCache.cleanupInterval) {
|
|
182
|
+
SSRDataCache.cleanupInterval = setInterval(() => {
|
|
183
|
+
this.cleanup();
|
|
184
|
+
}, 60000);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
get(key) {
|
|
188
|
+
const entry = this.cache.get(key);
|
|
189
|
+
if (!entry)
|
|
190
|
+
return;
|
|
191
|
+
const age = Date.now() - entry.timestamp;
|
|
192
|
+
if (age > entry.maxAge) {
|
|
193
|
+
this.cache.delete(key);
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
return entry.data;
|
|
197
|
+
}
|
|
198
|
+
set(key, data, maxAge) {
|
|
199
|
+
if (maxAge <= 0)
|
|
200
|
+
return;
|
|
201
|
+
this.cache.set(key, {
|
|
202
|
+
data,
|
|
203
|
+
timestamp: Date.now(),
|
|
204
|
+
maxAge
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
has(key) {
|
|
208
|
+
return this.get(key) !== undefined;
|
|
209
|
+
}
|
|
210
|
+
clear() {
|
|
211
|
+
this.cache.clear();
|
|
212
|
+
}
|
|
213
|
+
cleanup() {
|
|
214
|
+
const now = Date.now();
|
|
215
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
216
|
+
if (now - entry.timestamp > entry.maxAge) {
|
|
217
|
+
this.cache.delete(key);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
stats() {
|
|
222
|
+
return {
|
|
223
|
+
size: this.cache.size,
|
|
224
|
+
keys: Array.from(this.cache.keys())
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
destroy() {
|
|
228
|
+
if (SSRDataCache.cleanupInterval) {
|
|
229
|
+
clearInterval(SSRDataCache.cleanupInterval);
|
|
230
|
+
SSRDataCache.cleanupInterval = null;
|
|
231
|
+
}
|
|
232
|
+
this.clear();
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
class LRUCache {
|
|
237
|
+
cache = new Map;
|
|
238
|
+
maxSize;
|
|
239
|
+
constructor(maxSize = 100) {
|
|
240
|
+
this.maxSize = maxSize;
|
|
241
|
+
}
|
|
242
|
+
get(key) {
|
|
243
|
+
const value = this.cache.get(key);
|
|
244
|
+
if (value !== undefined) {
|
|
245
|
+
this.cache.delete(key);
|
|
246
|
+
this.cache.set(key, value);
|
|
247
|
+
}
|
|
248
|
+
return value;
|
|
249
|
+
}
|
|
250
|
+
set(key, value) {
|
|
251
|
+
this.cache.delete(key);
|
|
252
|
+
if (this.cache.size >= this.maxSize) {
|
|
253
|
+
const firstKey = this.cache.keys().next().value;
|
|
254
|
+
this.cache.delete(firstKey);
|
|
255
|
+
}
|
|
256
|
+
this.cache.set(key, value);
|
|
257
|
+
}
|
|
258
|
+
has(key) {
|
|
259
|
+
return this.cache.has(key);
|
|
260
|
+
}
|
|
261
|
+
clear() {
|
|
262
|
+
this.cache.clear();
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
var getGlobalCache = () => {
|
|
266
|
+
const g = globalThis;
|
|
267
|
+
if (!g.__REROUTE_SSR_CACHE__) {
|
|
268
|
+
g.__REROUTE_SSR_CACHE__ = new SSRDataCache;
|
|
269
|
+
}
|
|
270
|
+
return g.__REROUTE_SSR_CACHE__;
|
|
271
|
+
}, getGlobalStatusCache = () => {
|
|
272
|
+
const g = globalThis;
|
|
273
|
+
if (!g.__REROUTE_STATUS_CACHE__) {
|
|
274
|
+
g.__REROUTE_STATUS_CACHE__ = new SSRDataCache;
|
|
275
|
+
}
|
|
276
|
+
return g.__REROUTE_STATUS_CACHE__;
|
|
277
|
+
}, ssrCache, statusCache;
|
|
278
|
+
var init_cache = __esm(() => {
|
|
279
|
+
ssrCache = getGlobalCache();
|
|
280
|
+
statusCache = getGlobalStatusCache();
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
// packages/core/src/ssr/lib/imports.ts
|
|
284
|
+
var init_imports = () => {};
|
|
285
|
+
|
|
286
|
+
// packages/core/src/ssr/lib/collections.ts
|
|
287
|
+
var init_collections = __esm(() => {
|
|
288
|
+
init_imports();
|
|
289
|
+
});
|
|
290
|
+
// packages/core/src/ssr/lib/compression.ts
|
|
291
|
+
var init_compression = () => {};
|
|
292
|
+
|
|
293
|
+
// packages/core/src/ssr/lib/compute/content.ts
|
|
294
|
+
var init_content2 = __esm(() => {
|
|
295
|
+
init_cache();
|
|
296
|
+
init_imports();
|
|
297
|
+
});
|
|
298
|
+
// packages/core/src/ssr/lib/compute/layouts.ts
|
|
299
|
+
var init_layouts = __esm(() => {
|
|
300
|
+
init_cache();
|
|
301
|
+
init_imports();
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
// packages/core/src/ssr/lib/compute/routes.ts
|
|
305
|
+
var init_routes = __esm(() => {
|
|
306
|
+
init_cache();
|
|
307
|
+
init_imports();
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
// packages/core/src/ssr/lib/compute/index.ts
|
|
311
|
+
var init_compute = __esm(() => {
|
|
312
|
+
init_imports();
|
|
313
|
+
init_content2();
|
|
314
|
+
init_layouts();
|
|
315
|
+
init_routes();
|
|
316
|
+
init_content2();
|
|
317
|
+
init_layouts();
|
|
318
|
+
init_routes();
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
// packages/core/src/ssr/lib/modules.ts
|
|
322
|
+
var init_modules = __esm(() => {
|
|
323
|
+
init_imports();
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
// packages/core/src/ssr/lib/seed.ts
|
|
327
|
+
var init_seed = __esm(() => {
|
|
328
|
+
init_modules();
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
// packages/core/src/ssr/lib/data.ts
|
|
332
|
+
var init_data = __esm(() => {
|
|
333
|
+
init_imports();
|
|
334
|
+
init_seed();
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
// packages/core/src/ssr/lib/html.ts
|
|
338
|
+
var init_html = () => {};
|
|
339
|
+
|
|
340
|
+
// packages/core/src/og/discovery.ts
|
|
341
|
+
var init_discovery2 = () => {};
|
|
342
|
+
|
|
343
|
+
// packages/core/src/og/meta.ts
|
|
344
|
+
var init_meta = __esm(() => {
|
|
345
|
+
init_discovery2();
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
// packages/core/src/ssr/lib/metadata.ts
|
|
349
|
+
var init_metadata2 = __esm(() => {
|
|
350
|
+
init_metadata();
|
|
351
|
+
init_meta();
|
|
352
|
+
init_imports();
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
// packages/core/src/ssr/lib/preload.ts
|
|
356
|
+
var init_preload = __esm(() => {
|
|
357
|
+
init_imports();
|
|
358
|
+
});
|
|
359
|
+
// packages/core/src/ssr/lib/scripts/collections.ts
|
|
360
|
+
var init_collections2 = () => {};
|
|
361
|
+
|
|
362
|
+
// packages/core/src/ssr/lib/scripts/data.ts
|
|
363
|
+
var init_data2 = () => {};
|
|
364
|
+
|
|
365
|
+
// packages/core/src/ssr/lib/scripts/feeds.ts
|
|
366
|
+
var init_feeds = () => {};
|
|
367
|
+
|
|
368
|
+
// packages/core/src/ssr/lib/scripts/index.ts
|
|
369
|
+
var init_scripts = __esm(() => {
|
|
370
|
+
init_collections2();
|
|
371
|
+
init_data2();
|
|
372
|
+
init_feeds();
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
// packages/core/src/ssr/lib/styles.ts
|
|
376
|
+
var init_styles = () => {};
|
|
377
|
+
|
|
378
|
+
// packages/core/src/ssr/lib/setup.ts
|
|
379
|
+
var init_setup = __esm(() => {
|
|
380
|
+
init_server2();
|
|
381
|
+
init_collections();
|
|
382
|
+
init_compute();
|
|
383
|
+
init_metadata2();
|
|
384
|
+
init_preload();
|
|
385
|
+
init_scripts();
|
|
386
|
+
init_seed();
|
|
387
|
+
init_styles();
|
|
388
|
+
});
|
|
389
|
+
// packages/core/src/ssr/lib/index.ts
|
|
390
|
+
var init_lib = __esm(() => {
|
|
391
|
+
init_data();
|
|
392
|
+
init_cache();
|
|
393
|
+
init_collections();
|
|
394
|
+
init_compression();
|
|
395
|
+
init_compute();
|
|
396
|
+
init_html();
|
|
397
|
+
init_imports();
|
|
398
|
+
init_metadata2();
|
|
399
|
+
init_modules();
|
|
400
|
+
init_preload();
|
|
401
|
+
init_scripts();
|
|
402
|
+
init_seed();
|
|
403
|
+
init_setup();
|
|
404
|
+
init_styles();
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
// packages/core/src/ssr/render.ts
|
|
408
|
+
import dedent from "dedent";
|
|
409
|
+
import { cloneElement } from "react";
|
|
410
|
+
import { renderToString } from "react-dom/server";
|
|
411
|
+
var init_render = __esm(() => {
|
|
412
|
+
init_server2();
|
|
413
|
+
init_config();
|
|
414
|
+
init_lib();
|
|
415
|
+
init_html();
|
|
416
|
+
});
|
|
417
|
+
// packages/core/src/llms/extractor.ts
|
|
418
|
+
import { renderToStaticMarkup } from "react-dom/server";
|
|
419
|
+
var init_extractor = __esm(() => {
|
|
420
|
+
init_render();
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
// packages/core/src/llms/full-generator.ts
|
|
424
|
+
var init_full_generator = __esm(() => {
|
|
425
|
+
init_extractor();
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
// packages/core/src/llms/index-generator.ts
|
|
429
|
+
var init_index_generator = __esm(() => {
|
|
430
|
+
init_extractor();
|
|
431
|
+
});
|
|
432
|
+
|
|
433
|
+
// packages/core/src/llms/index.ts
|
|
434
|
+
var init_llms = __esm(() => {
|
|
435
|
+
init_extractor();
|
|
436
|
+
init_full_generator();
|
|
437
|
+
init_index_generator();
|
|
438
|
+
});
|
|
439
|
+
|
|
440
|
+
// packages/core/src/og/render.ts
|
|
441
|
+
import { createElement } from "react";
|
|
442
|
+
var init_render2 = () => {};
|
|
443
|
+
|
|
444
|
+
// packages/core/src/og/index.ts
|
|
445
|
+
var init_og = __esm(() => {
|
|
446
|
+
init_discovery2();
|
|
447
|
+
init_meta();
|
|
448
|
+
init_render2();
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
// packages/core/src/robots/discovery.ts
|
|
452
|
+
var init_discovery3 = () => {};
|
|
453
|
+
// packages/core/src/robots/policies.ts
|
|
454
|
+
var init_policies = () => {};
|
|
455
|
+
|
|
456
|
+
// packages/core/src/robots/index.ts
|
|
457
|
+
var init_robots = __esm(() => {
|
|
458
|
+
init_discovery3();
|
|
459
|
+
init_policies();
|
|
460
|
+
});
|
|
461
|
+
|
|
462
|
+
// packages/core/src/rss/discovery.ts
|
|
463
|
+
var init_discovery4 = () => {};
|
|
464
|
+
// packages/core/src/rss/index.ts
|
|
465
|
+
var init_rss = __esm(() => {
|
|
466
|
+
init_discovery4();
|
|
467
|
+
});
|
|
468
|
+
|
|
469
|
+
// packages/core/src/sitemap/discovery.ts
|
|
470
|
+
var init_discovery5 = () => {};
|
|
471
|
+
|
|
472
|
+
// packages/core/src/sitemap/generator.ts
|
|
473
|
+
var init_generator = () => {};
|
|
474
|
+
|
|
475
|
+
// packages/core/src/sitemap/index.ts
|
|
476
|
+
var init_sitemap = __esm(() => {
|
|
477
|
+
init_discovery5();
|
|
478
|
+
init_generator();
|
|
479
|
+
});
|
|
480
|
+
|
|
481
|
+
// packages/core/src/ssr/stream.ts
|
|
482
|
+
import { cloneElement as cloneElement2 } from "react";
|
|
483
|
+
import { renderToReadableStream } from "react-dom/server";
|
|
484
|
+
var init_stream = __esm(() => {
|
|
485
|
+
init_server2();
|
|
486
|
+
init_config();
|
|
487
|
+
init_lib();
|
|
488
|
+
init_html();
|
|
489
|
+
init_imports();
|
|
490
|
+
});
|
|
491
|
+
|
|
492
|
+
// packages/core/src/ssr/index.ts
|
|
493
|
+
var init_ssr = __esm(() => {
|
|
494
|
+
init_lib();
|
|
495
|
+
init_render();
|
|
496
|
+
init_stream();
|
|
497
|
+
});
|
|
498
|
+
|
|
499
|
+
// packages/core/src/index.ts
|
|
500
|
+
var init_src = __esm(() => {
|
|
501
|
+
init_bundler();
|
|
502
|
+
init_config();
|
|
503
|
+
init_content();
|
|
504
|
+
init_llms();
|
|
505
|
+
init_og();
|
|
506
|
+
init_robots();
|
|
507
|
+
init_rss();
|
|
508
|
+
init_sitemap();
|
|
509
|
+
init_ssr();
|
|
510
|
+
});
|
|
511
|
+
|
|
512
|
+
// packages/core/index.ts
|
|
513
|
+
var init_core = __esm(() => {
|
|
514
|
+
init_src();
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
// packages/telemetry/src/server/plugin.ts
|
|
518
|
+
import os from "node:os";
|
|
519
|
+
import {
|
|
520
|
+
metrics,
|
|
521
|
+
SpanStatusCode as SpanStatusCode2,
|
|
522
|
+
trace as trace2
|
|
523
|
+
} from "@opentelemetry/api";
|
|
524
|
+
import { logs, SeverityNumber } from "@opentelemetry/api-logs";
|
|
525
|
+
import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-proto";
|
|
526
|
+
import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-proto";
|
|
527
|
+
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-proto";
|
|
528
|
+
import { resourceFromAttributes } from "@opentelemetry/resources";
|
|
529
|
+
import {
|
|
530
|
+
BatchLogRecordProcessor,
|
|
531
|
+
LoggerProvider
|
|
532
|
+
} from "@opentelemetry/sdk-logs";
|
|
533
|
+
import {
|
|
534
|
+
MeterProvider,
|
|
535
|
+
PeriodicExportingMetricReader
|
|
536
|
+
} from "@opentelemetry/sdk-metrics";
|
|
537
|
+
import {
|
|
538
|
+
BatchSpanProcessor,
|
|
539
|
+
NodeTracerProvider
|
|
540
|
+
} from "@opentelemetry/sdk-trace-node";
|
|
541
|
+
import {
|
|
542
|
+
ATTR_SERVICE_NAME,
|
|
543
|
+
ATTR_SERVICE_VERSION
|
|
544
|
+
} from "@opentelemetry/semantic-conventions";
|
|
545
|
+
import { ATTR_HOST_NAME } from "@opentelemetry/semantic-conventions/incubating";
|
|
546
|
+
function getErrorDetails(error) {
|
|
547
|
+
if (error instanceof Error) {
|
|
548
|
+
return {
|
|
549
|
+
name: error.name,
|
|
550
|
+
message: error.message,
|
|
551
|
+
stack: error.stack || ""
|
|
552
|
+
};
|
|
553
|
+
}
|
|
554
|
+
if (typeof error === "object" && error !== null) {
|
|
555
|
+
const err = error;
|
|
556
|
+
return {
|
|
557
|
+
name: String(err.name || err.code || "UnknownError"),
|
|
558
|
+
message: String(err.message || err.error || JSON.stringify(error)),
|
|
559
|
+
stack: String(err.stack || "")
|
|
560
|
+
};
|
|
561
|
+
}
|
|
562
|
+
return {
|
|
563
|
+
name: "UnknownError",
|
|
564
|
+
message: String(error),
|
|
565
|
+
stack: ""
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
function shouldIgnoreRoute(patterns, pathname, method) {
|
|
569
|
+
return patterns.some((pattern) => {
|
|
570
|
+
if (typeof pattern === "string") {
|
|
571
|
+
return pathname.includes(pattern);
|
|
572
|
+
}
|
|
573
|
+
if (pattern instanceof RegExp) {
|
|
574
|
+
return pattern.test(pathname);
|
|
575
|
+
}
|
|
576
|
+
if (typeof pattern === "function") {
|
|
577
|
+
return pattern(pathname, method);
|
|
578
|
+
}
|
|
579
|
+
return false;
|
|
580
|
+
});
|
|
581
|
+
}
|
|
582
|
+
function shouldSample(rate) {
|
|
583
|
+
return Math.random() < rate;
|
|
584
|
+
}
|
|
585
|
+
function telemetry(options = {}) {
|
|
586
|
+
return async (app) => {
|
|
587
|
+
const cwd = typeof process !== "undefined" && typeof process.cwd === "function" ? process.cwd() : "/";
|
|
588
|
+
const config2 = await loadConfig(cwd);
|
|
589
|
+
const merged = {
|
|
590
|
+
...config2.telemetry,
|
|
591
|
+
...options
|
|
592
|
+
};
|
|
593
|
+
const TELEMETRY_ENABLED = merged.enabled ?? false;
|
|
594
|
+
if (!TELEMETRY_ENABLED) {
|
|
595
|
+
console.log("[telemetry] Disabled - set enabled: true in config or options to enable");
|
|
596
|
+
return app;
|
|
597
|
+
}
|
|
598
|
+
const SERVICE_NAME = merged.serviceName || "reroute-app";
|
|
599
|
+
const SERVICE_VERSION = merged.serviceVersion || process.env.npm_package_version || "1.0.0";
|
|
600
|
+
const OTLP_ENDPOINT = merged.otlpEndpoint || process.env.OTEL_EXPORTER_OTLP_ENDPOINT || "http://localhost:4318";
|
|
601
|
+
const METRICS_INTERVAL = merged.metricsInterval ?? 5000;
|
|
602
|
+
const proxyConfig = merged.proxy;
|
|
603
|
+
const ENABLE_PROXY = typeof proxyConfig === "boolean" ? proxyConfig : proxyConfig?.enabled ?? !!proxyConfig;
|
|
604
|
+
const PROXY_PATHNAME = typeof proxyConfig === "object" ? proxyConfig.pathname ?? "/api/telemetry" : "/api/telemetry";
|
|
605
|
+
const PROXY_VERBOSE = typeof proxyConfig === "object" ? proxyConfig.verbose ?? false : false;
|
|
606
|
+
const PROXY_HANDLER = typeof proxyConfig === "object" ? proxyConfig.handler : undefined;
|
|
607
|
+
const ENABLE_TRACES = merged.enableTraces ?? true;
|
|
608
|
+
const ENABLE_METRICS = merged.enableMetrics ?? true;
|
|
609
|
+
const ENABLE_LOGS = merged.enableLogs ?? true;
|
|
610
|
+
const ENABLE_SYSTEM_METRICS = merged.enableSystemMetrics ?? true;
|
|
611
|
+
const SAMPLE_RATE = merged.sampleRate ?? 1;
|
|
612
|
+
const ERROR_SAMPLE_RATE = merged.errorSampleRate ?? 1;
|
|
613
|
+
const IGNORE_ROUTES = merged.ignoreRoutes || [];
|
|
614
|
+
const CAPTURE_HEADERS = merged.captureHeaders || [];
|
|
615
|
+
const CUSTOM_ATTRIBUTES = merged.customAttributes || {};
|
|
616
|
+
console.log(`[telemetry] Initializing with endpoint: ${OTLP_ENDPOINT}`);
|
|
617
|
+
console.log(`[telemetry] Features - Traces: ${ENABLE_TRACES}, Metrics: ${ENABLE_METRICS}, Logs: ${ENABLE_LOGS}`);
|
|
618
|
+
if (SAMPLE_RATE < 1) {
|
|
619
|
+
console.log(`[telemetry] Sampling - Requests: ${SAMPLE_RATE * 100}%, Errors: ${ERROR_SAMPLE_RATE * 100}%`);
|
|
620
|
+
}
|
|
621
|
+
if (ENABLE_PROXY) {
|
|
622
|
+
console.log(`[telemetry] Browser telemetry proxy enabled at ${PROXY_PATHNAME}/*`);
|
|
623
|
+
}
|
|
624
|
+
const otlpHeaders = {};
|
|
625
|
+
if (merged.apiKey || process.env.SIGNOZ_API_KEY) {
|
|
626
|
+
otlpHeaders.Authorization = `Bearer ${merged.apiKey || process.env.SIGNOZ_API_KEY}`;
|
|
627
|
+
}
|
|
628
|
+
const traceExporter = ENABLE_TRACES ? new OTLPTraceExporter({
|
|
629
|
+
url: `${OTLP_ENDPOINT}/v1/traces`,
|
|
630
|
+
headers: Object.keys(otlpHeaders).length > 0 ? otlpHeaders : undefined,
|
|
631
|
+
timeoutMillis: 5000
|
|
632
|
+
}) : null;
|
|
633
|
+
const logExporter = ENABLE_LOGS ? new OTLPLogExporter({
|
|
634
|
+
url: `${OTLP_ENDPOINT}/v1/logs`,
|
|
635
|
+
headers: Object.keys(otlpHeaders).length > 0 ? otlpHeaders : undefined,
|
|
636
|
+
timeoutMillis: 5000
|
|
637
|
+
}) : null;
|
|
638
|
+
const metricExporter = ENABLE_METRICS ? new OTLPMetricExporter({
|
|
639
|
+
url: `${OTLP_ENDPOINT}/v1/metrics`,
|
|
640
|
+
headers: Object.keys(otlpHeaders).length > 0 ? otlpHeaders : undefined,
|
|
641
|
+
timeoutMillis: 5000
|
|
642
|
+
}) : null;
|
|
643
|
+
const HOSTNAME = process.env.OTEL_RESOURCE_ATTRIBUTES?.match(/host\.name=([^,]+)/)?.[1] || process.env.HOSTNAME || os.hostname();
|
|
644
|
+
const resource = resourceFromAttributes({
|
|
645
|
+
[ATTR_SERVICE_NAME]: SERVICE_NAME,
|
|
646
|
+
[ATTR_SERVICE_VERSION]: SERVICE_VERSION,
|
|
647
|
+
[ATTR_HOST_NAME]: HOSTNAME
|
|
648
|
+
});
|
|
649
|
+
if (ENABLE_TRACES && traceExporter) {
|
|
650
|
+
try {
|
|
651
|
+
const tracerProvider = new NodeTracerProvider({
|
|
652
|
+
resource,
|
|
653
|
+
spanProcessors: [new BatchSpanProcessor(traceExporter)]
|
|
654
|
+
});
|
|
655
|
+
tracerProvider.register();
|
|
656
|
+
} catch (error) {
|
|
657
|
+
console.error("[telemetry] Failed to initialize tracer:", error);
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
let logger = null;
|
|
661
|
+
if (ENABLE_LOGS && logExporter) {
|
|
662
|
+
try {
|
|
663
|
+
const loggerProvider = new LoggerProvider({
|
|
664
|
+
resource,
|
|
665
|
+
processors: [new BatchLogRecordProcessor(logExporter)]
|
|
666
|
+
});
|
|
667
|
+
logs.setGlobalLoggerProvider(loggerProvider);
|
|
668
|
+
logger = loggerProvider.getLogger(SERVICE_NAME, SERVICE_VERSION);
|
|
669
|
+
} catch (error) {
|
|
670
|
+
console.error("[telemetry] Failed to initialize logger:", error);
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
let meter = null;
|
|
674
|
+
if (ENABLE_METRICS && metricExporter) {
|
|
675
|
+
try {
|
|
676
|
+
const meterProvider = new MeterProvider({
|
|
677
|
+
resource,
|
|
678
|
+
readers: [
|
|
679
|
+
new PeriodicExportingMetricReader({
|
|
680
|
+
exporter: metricExporter,
|
|
681
|
+
exportIntervalMillis: METRICS_INTERVAL
|
|
682
|
+
})
|
|
683
|
+
]
|
|
684
|
+
});
|
|
685
|
+
metrics.setGlobalMeterProvider(meterProvider);
|
|
686
|
+
meter = meterProvider.getMeter(SERVICE_NAME, SERVICE_VERSION);
|
|
687
|
+
} catch (error) {
|
|
688
|
+
console.error("[telemetry] Failed to initialize meter:", error);
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
let httpRequestCounter = null;
|
|
692
|
+
let httpRequestDuration = null;
|
|
693
|
+
let httpErrorCounter = null;
|
|
694
|
+
let httpActiveRequests = null;
|
|
695
|
+
let activeConnections = null;
|
|
696
|
+
if (meter) {
|
|
697
|
+
try {
|
|
698
|
+
httpRequestCounter = meter.createCounter("http.server.request.count", {
|
|
699
|
+
description: "Total HTTP requests",
|
|
700
|
+
unit: "requests"
|
|
701
|
+
});
|
|
702
|
+
httpRequestDuration = meter.createHistogram("http.server.request.duration", {
|
|
703
|
+
description: "HTTP request duration",
|
|
704
|
+
unit: "milliseconds"
|
|
705
|
+
});
|
|
706
|
+
httpErrorCounter = meter.createCounter("http.server.error.count", {
|
|
707
|
+
description: "Total HTTP errors",
|
|
708
|
+
unit: "errors"
|
|
709
|
+
});
|
|
710
|
+
httpActiveRequests = meter.createUpDownCounter("http.server.active_requests", {
|
|
711
|
+
description: "Active HTTP requests",
|
|
712
|
+
unit: "requests"
|
|
713
|
+
});
|
|
714
|
+
activeConnections = meter.createUpDownCounter("app.connections.active", {
|
|
715
|
+
description: "Active connections",
|
|
716
|
+
unit: "connections"
|
|
717
|
+
});
|
|
718
|
+
} catch (error) {
|
|
719
|
+
console.error("[telemetry] Failed to create HTTP metrics:", error);
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
if (ENABLE_SYSTEM_METRICS && meter) {
|
|
723
|
+
try {
|
|
724
|
+
const memoryUsage = meter.createObservableGauge("app.memory.usage", {
|
|
725
|
+
description: "Process memory usage",
|
|
726
|
+
unit: "bytes"
|
|
727
|
+
});
|
|
728
|
+
memoryUsage.addCallback((result) => {
|
|
729
|
+
try {
|
|
730
|
+
const usage = process.memoryUsage();
|
|
731
|
+
result.observe(usage.heapUsed, {
|
|
732
|
+
type: "heap",
|
|
733
|
+
"host.name": HOSTNAME
|
|
734
|
+
});
|
|
735
|
+
result.observe(usage.rss, { type: "rss", "host.name": HOSTNAME });
|
|
736
|
+
result.observe(usage.external, {
|
|
737
|
+
type: "external",
|
|
738
|
+
"host.name": HOSTNAME
|
|
739
|
+
});
|
|
740
|
+
} catch (error) {
|
|
741
|
+
console.error("[telemetry] Memory usage callback failed:", error);
|
|
742
|
+
}
|
|
743
|
+
});
|
|
744
|
+
const systemCpuUsage = meter.createObservableGauge("system.cpu.utilization", {
|
|
745
|
+
description: "System CPU utilization",
|
|
746
|
+
unit: "1"
|
|
747
|
+
});
|
|
748
|
+
systemCpuUsage.addCallback((result) => {
|
|
749
|
+
try {
|
|
750
|
+
const cpus = os.cpus();
|
|
751
|
+
let totalIdle = 0;
|
|
752
|
+
let totalTick = 0;
|
|
753
|
+
cpus.forEach((cpu) => {
|
|
754
|
+
const times = cpu.times;
|
|
755
|
+
totalIdle += times.idle;
|
|
756
|
+
totalTick += times.user + times.nice + times.sys + times.idle + times.irq;
|
|
757
|
+
});
|
|
758
|
+
const usage = 1 - totalIdle / totalTick;
|
|
759
|
+
result.observe(usage, {
|
|
760
|
+
"service.name": SERVICE_NAME,
|
|
761
|
+
"host.name": HOSTNAME
|
|
762
|
+
});
|
|
763
|
+
} catch (error) {
|
|
764
|
+
console.error("[telemetry] CPU usage callback failed:", error);
|
|
765
|
+
}
|
|
766
|
+
});
|
|
767
|
+
const systemMemoryUsage = meter.createObservableGauge("system.memory.utilization", {
|
|
768
|
+
description: "System memory utilization",
|
|
769
|
+
unit: "1"
|
|
770
|
+
});
|
|
771
|
+
systemMemoryUsage.addCallback((result) => {
|
|
772
|
+
try {
|
|
773
|
+
const totalMem = os.totalmem();
|
|
774
|
+
const freeMem = os.freemem();
|
|
775
|
+
const usage = (totalMem - freeMem) / totalMem;
|
|
776
|
+
result.observe(usage, {
|
|
777
|
+
"service.name": SERVICE_NAME,
|
|
778
|
+
"host.name": HOSTNAME
|
|
779
|
+
});
|
|
780
|
+
} catch (error) {
|
|
781
|
+
console.error("[telemetry] System memory callback failed:", error);
|
|
782
|
+
}
|
|
783
|
+
});
|
|
784
|
+
} catch (error) {
|
|
785
|
+
console.error("[telemetry] Failed to create system metrics:", error);
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
const shutdown = async () => {
|
|
789
|
+
console.log("[telemetry] Shutting down...");
|
|
790
|
+
try {
|
|
791
|
+
await logs.disable();
|
|
792
|
+
} catch (error) {
|
|
793
|
+
console.error("[telemetry] Shutdown error:", error);
|
|
794
|
+
}
|
|
795
|
+
};
|
|
796
|
+
process.on("SIGTERM", async () => {
|
|
797
|
+
await shutdown();
|
|
798
|
+
process.exit(0);
|
|
799
|
+
});
|
|
800
|
+
let tracer = null;
|
|
801
|
+
if (ENABLE_TRACES && traceExporter) {
|
|
802
|
+
tracer = trace2.getTracer(SERVICE_NAME, SERVICE_VERSION);
|
|
803
|
+
}
|
|
804
|
+
app = app.onBeforeHandle(({ request, store }) => {
|
|
805
|
+
const startTime = Date.now();
|
|
806
|
+
const url = new URL(request.url);
|
|
807
|
+
const route = url.pathname;
|
|
808
|
+
const method = request.method;
|
|
809
|
+
store.startTime = startTime;
|
|
810
|
+
store.route = route;
|
|
811
|
+
const shouldIgnore = IGNORE_ROUTES.length > 0 && shouldIgnoreRoute(IGNORE_ROUTES, route, method);
|
|
812
|
+
store.shouldIgnoreTelemetry = shouldIgnore;
|
|
813
|
+
if (!shouldIgnore) {
|
|
814
|
+
const sampled = shouldSample(SAMPLE_RATE);
|
|
815
|
+
store.isSampled = sampled;
|
|
816
|
+
if (!sampled) {
|
|
817
|
+
store.shouldIgnoreTelemetry = true;
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
if (tracer && !store.shouldIgnoreTelemetry) {
|
|
821
|
+
try {
|
|
822
|
+
const span = tracer.startSpan(`${method} ${route}`, {
|
|
823
|
+
attributes: {
|
|
824
|
+
"http.request.method": method,
|
|
825
|
+
"http.route": route,
|
|
826
|
+
"url.full": request.url,
|
|
827
|
+
"url.scheme": url.protocol.replace(":", ""),
|
|
828
|
+
"server.address": url.host,
|
|
829
|
+
"service.name": SERVICE_NAME,
|
|
830
|
+
...CUSTOM_ATTRIBUTES
|
|
831
|
+
}
|
|
832
|
+
});
|
|
833
|
+
store.telemetrySpan = span;
|
|
834
|
+
} catch (error) {
|
|
835
|
+
console.error("[telemetry] Failed to create span:", error);
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
try {
|
|
839
|
+
activeConnections?.add(1);
|
|
840
|
+
httpActiveRequests?.add(1, {
|
|
841
|
+
"http.request.method": method,
|
|
842
|
+
route
|
|
843
|
+
});
|
|
844
|
+
} catch (error) {
|
|
845
|
+
console.error("[telemetry] Failed to track active requests:", error);
|
|
846
|
+
}
|
|
847
|
+
if (store.shouldIgnoreTelemetry) {
|
|
848
|
+
return;
|
|
849
|
+
}
|
|
850
|
+
const capturedHeaders = {};
|
|
851
|
+
for (const headerName of CAPTURE_HEADERS) {
|
|
852
|
+
const headerValue = request.headers.get(headerName);
|
|
853
|
+
if (headerValue) {
|
|
854
|
+
capturedHeaders[`http.request.header.${headerName}`] = headerValue;
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
const baseAttributes = {
|
|
858
|
+
"http.request.method": method,
|
|
859
|
+
"url.full": request.url,
|
|
860
|
+
"http.route": route,
|
|
861
|
+
"url.scheme": url.protocol.replace(":", ""),
|
|
862
|
+
"server.address": url.host,
|
|
863
|
+
"service.name": SERVICE_NAME,
|
|
864
|
+
...CUSTOM_ATTRIBUTES,
|
|
865
|
+
...capturedHeaders
|
|
866
|
+
};
|
|
867
|
+
try {
|
|
868
|
+
logger?.emit({
|
|
869
|
+
severityNumber: SeverityNumber.INFO,
|
|
870
|
+
severityText: "INFO",
|
|
871
|
+
body: `→ ${method} ${route}`,
|
|
872
|
+
attributes: baseAttributes
|
|
873
|
+
});
|
|
874
|
+
} catch (error) {
|
|
875
|
+
console.error("[telemetry] Failed to log incoming request:", error);
|
|
876
|
+
}
|
|
877
|
+
try {
|
|
878
|
+
httpRequestCounter?.add(1, {
|
|
879
|
+
"http.request.method": method,
|
|
880
|
+
"http.route": route,
|
|
881
|
+
"url.scheme": url.protocol.replace(":", "")
|
|
882
|
+
});
|
|
883
|
+
} catch (error) {
|
|
884
|
+
console.error("[telemetry] Failed to increment request counter:", error);
|
|
885
|
+
}
|
|
886
|
+
}).onError(({ error, request, set, store }) => {
|
|
887
|
+
const errorDetails = getErrorDetails(error);
|
|
888
|
+
const duration = Date.now() - (store.startTime || Date.now());
|
|
889
|
+
const url = new URL(request.url);
|
|
890
|
+
const route = url.pathname;
|
|
891
|
+
const method = request.method;
|
|
892
|
+
const shouldIgnore = IGNORE_ROUTES.length > 0 && shouldIgnoreRoute(IGNORE_ROUTES, route, method);
|
|
893
|
+
const errorSampled = shouldSample(ERROR_SAMPLE_RATE);
|
|
894
|
+
const skipTelemetry = shouldIgnore || !errorSampled;
|
|
895
|
+
if (!skipTelemetry) {
|
|
896
|
+
try {
|
|
897
|
+
const span = store.telemetrySpan;
|
|
898
|
+
if (span) {
|
|
899
|
+
const errorObj = error instanceof Error ? error : new Error(errorDetails.message);
|
|
900
|
+
span.recordException(errorObj);
|
|
901
|
+
span.setStatus({
|
|
902
|
+
code: SpanStatusCode2.ERROR,
|
|
903
|
+
message: `${errorDetails.name}: ${errorDetails.message}`
|
|
904
|
+
});
|
|
905
|
+
span.setAttributes({
|
|
906
|
+
error: true,
|
|
907
|
+
"error.type": errorDetails.name,
|
|
908
|
+
"error.message": errorDetails.message,
|
|
909
|
+
"error.stack": errorDetails.stack,
|
|
910
|
+
"http.response.status_code": typeof set.status === "number" ? set.status : 500,
|
|
911
|
+
"http.duration_ms": duration,
|
|
912
|
+
...CUSTOM_ATTRIBUTES
|
|
913
|
+
});
|
|
914
|
+
span.addEvent("exception", {
|
|
915
|
+
"exception.type": errorDetails.name,
|
|
916
|
+
"exception.message": errorDetails.message,
|
|
917
|
+
"exception.stacktrace": errorDetails.stack,
|
|
918
|
+
"exception.escaped": "false"
|
|
919
|
+
});
|
|
920
|
+
span.end();
|
|
921
|
+
}
|
|
922
|
+
} catch (spanError) {
|
|
923
|
+
console.error("[telemetry] Failed to record exception in span:", spanError);
|
|
924
|
+
}
|
|
925
|
+
try {
|
|
926
|
+
logger?.emit({
|
|
927
|
+
severityNumber: SeverityNumber.ERROR,
|
|
928
|
+
severityText: "ERROR",
|
|
929
|
+
body: `${errorDetails.name}: ${errorDetails.message}`,
|
|
930
|
+
attributes: {
|
|
931
|
+
"error.type": errorDetails.name,
|
|
932
|
+
"error.message": errorDetails.message,
|
|
933
|
+
"error.stack": errorDetails.stack,
|
|
934
|
+
"http.request.method": method,
|
|
935
|
+
"url.full": request.url,
|
|
936
|
+
"http.response.status_code": typeof set.status === "number" ? set.status : 500,
|
|
937
|
+
"service.name": SERVICE_NAME,
|
|
938
|
+
...CUSTOM_ATTRIBUTES
|
|
939
|
+
}
|
|
940
|
+
});
|
|
941
|
+
} catch (logError) {
|
|
942
|
+
console.error("[telemetry] Failed to log error:", logError);
|
|
943
|
+
}
|
|
944
|
+
try {
|
|
945
|
+
const statusCode = typeof set.status === "number" ? set.status : 500;
|
|
946
|
+
httpErrorCounter?.add(1, {
|
|
947
|
+
"http.request.method": method,
|
|
948
|
+
"http.response.status_code": statusCode,
|
|
949
|
+
"error.type": errorDetails.name
|
|
950
|
+
});
|
|
951
|
+
httpRequestDuration?.record(duration, {
|
|
952
|
+
"http.request.method": method,
|
|
953
|
+
"http.response.status_code": statusCode,
|
|
954
|
+
error: true
|
|
955
|
+
});
|
|
956
|
+
} catch (metricsError) {
|
|
957
|
+
console.error("[telemetry] Failed to record error metrics:", metricsError);
|
|
958
|
+
}
|
|
959
|
+
}
|
|
960
|
+
}).onAfterResponse(({ request, set, store }) => {
|
|
961
|
+
const url = new URL(request.url);
|
|
962
|
+
const pathname = url.pathname;
|
|
963
|
+
const method = request.method;
|
|
964
|
+
const statusCode = typeof set.status === "number" ? set.status : 200;
|
|
965
|
+
const duration = Date.now() - (store.startTime || Date.now());
|
|
966
|
+
const route = store.route || pathname;
|
|
967
|
+
try {
|
|
968
|
+
activeConnections?.add(-1);
|
|
969
|
+
httpActiveRequests?.add(-1, {
|
|
970
|
+
"http.request.method": method,
|
|
971
|
+
route
|
|
972
|
+
});
|
|
973
|
+
} catch (error) {
|
|
974
|
+
console.error("[telemetry] Failed to decrement active requests:", error);
|
|
975
|
+
}
|
|
976
|
+
const shouldIgnoreTelemetry = store.shouldIgnoreTelemetry;
|
|
977
|
+
if (shouldIgnoreTelemetry) {
|
|
978
|
+
return;
|
|
979
|
+
}
|
|
980
|
+
try {
|
|
981
|
+
const span = store.telemetrySpan;
|
|
982
|
+
if (span) {
|
|
983
|
+
span.setAttributes({
|
|
984
|
+
"http.response.status_code": statusCode,
|
|
985
|
+
"http.duration_ms": duration,
|
|
986
|
+
...CUSTOM_ATTRIBUTES
|
|
987
|
+
});
|
|
988
|
+
if (statusCode >= 400) {
|
|
989
|
+
span.setStatus({
|
|
990
|
+
code: SpanStatusCode2.ERROR,
|
|
991
|
+
message: `HTTP ${statusCode}`
|
|
992
|
+
});
|
|
993
|
+
span.setAttribute("error", true);
|
|
994
|
+
}
|
|
995
|
+
span.end();
|
|
996
|
+
}
|
|
997
|
+
} catch (spanError) {
|
|
998
|
+
console.error("[telemetry] Failed to end span:", spanError);
|
|
999
|
+
}
|
|
1000
|
+
try {
|
|
1001
|
+
const isError = statusCode >= 400;
|
|
1002
|
+
logger?.emit({
|
|
1003
|
+
severityNumber: isError ? SeverityNumber.ERROR : SeverityNumber.INFO,
|
|
1004
|
+
severityText: isError ? "ERROR" : "INFO",
|
|
1005
|
+
body: `← ${method} ${route} → ${statusCode} (${duration}ms)`,
|
|
1006
|
+
attributes: {
|
|
1007
|
+
"http.request.method": method,
|
|
1008
|
+
"url.full": request.url,
|
|
1009
|
+
"http.route": route,
|
|
1010
|
+
"http.response.status_code": statusCode,
|
|
1011
|
+
"http.duration_ms": duration,
|
|
1012
|
+
"url.scheme": url.protocol.replace(":", ""),
|
|
1013
|
+
"server.address": url.host,
|
|
1014
|
+
"service.name": SERVICE_NAME,
|
|
1015
|
+
...CUSTOM_ATTRIBUTES
|
|
1016
|
+
}
|
|
1017
|
+
});
|
|
1018
|
+
} catch (logError) {
|
|
1019
|
+
console.error("[telemetry] Failed to log response:", logError);
|
|
1020
|
+
}
|
|
1021
|
+
try {
|
|
1022
|
+
httpRequestDuration?.record(duration, {
|
|
1023
|
+
"http.request.method": method,
|
|
1024
|
+
"http.route": route,
|
|
1025
|
+
"http.response.status_code": statusCode,
|
|
1026
|
+
"url.scheme": url.protocol.replace(":", "")
|
|
1027
|
+
});
|
|
1028
|
+
} catch (metricsError) {
|
|
1029
|
+
console.error("[telemetry] Failed to record request duration:", metricsError);
|
|
1030
|
+
}
|
|
1031
|
+
});
|
|
1032
|
+
if (ENABLE_PROXY) {
|
|
1033
|
+
const API_KEY = merged.apiKey || process.env.SIGNOZ_API_KEY;
|
|
1034
|
+
const handleProxy = async (endpoint, requestBody) => {
|
|
1035
|
+
const headers = {
|
|
1036
|
+
"Content-Type": "application/json"
|
|
1037
|
+
};
|
|
1038
|
+
if (API_KEY) {
|
|
1039
|
+
headers.Authorization = `Bearer ${API_KEY}`;
|
|
1040
|
+
}
|
|
1041
|
+
if (PROXY_HANDLER) {
|
|
1042
|
+
return await PROXY_HANDLER({
|
|
1043
|
+
body: requestBody,
|
|
1044
|
+
endpoint,
|
|
1045
|
+
headers,
|
|
1046
|
+
otlpEndpoint: OTLP_ENDPOINT
|
|
1047
|
+
});
|
|
1048
|
+
}
|
|
1049
|
+
try {
|
|
1050
|
+
const controller = new AbortController;
|
|
1051
|
+
const timeoutId = setTimeout(() => controller.abort(), 5000);
|
|
1052
|
+
const response = await fetch(`${OTLP_ENDPOINT}${endpoint}`, {
|
|
1053
|
+
method: "POST",
|
|
1054
|
+
headers,
|
|
1055
|
+
body: JSON.stringify(requestBody),
|
|
1056
|
+
signal: controller.signal
|
|
1057
|
+
});
|
|
1058
|
+
clearTimeout(timeoutId);
|
|
1059
|
+
if (PROXY_VERBOSE) {
|
|
1060
|
+
console.log(`[telemetry-proxy]${endpoint} forwarded: ${response.status}`);
|
|
1061
|
+
}
|
|
1062
|
+
if (!response.ok && PROXY_VERBOSE) {
|
|
1063
|
+
console.error(`[telemetry-proxy] OTLP error: ${response.status} ${response.statusText}`);
|
|
1064
|
+
}
|
|
1065
|
+
return { status: 200 };
|
|
1066
|
+
} catch (error) {
|
|
1067
|
+
if (PROXY_VERBOSE) {
|
|
1068
|
+
console.error(`[telemetry-proxy] Failed to forward${endpoint}:`, error);
|
|
1069
|
+
}
|
|
1070
|
+
return { status: 200 };
|
|
1071
|
+
}
|
|
1072
|
+
};
|
|
1073
|
+
app.post(`${PROXY_PATHNAME}/v1/traces`, async function forwardBrowserTraces({ body }) {
|
|
1074
|
+
try {
|
|
1075
|
+
const result = await handleProxy("/v1/traces", body);
|
|
1076
|
+
return new Response(null, { status: result.status });
|
|
1077
|
+
} catch (error) {
|
|
1078
|
+
console.error("[telemetry-proxy] Handler error:", error);
|
|
1079
|
+
return new Response(null, { status: 200 });
|
|
1080
|
+
}
|
|
1081
|
+
}).post(`${PROXY_PATHNAME}/v1/metrics`, async function forwardBrowserMetrics({ body }) {
|
|
1082
|
+
try {
|
|
1083
|
+
const result = await handleProxy("/v1/metrics", body);
|
|
1084
|
+
return new Response(null, { status: result.status });
|
|
1085
|
+
} catch (error) {
|
|
1086
|
+
console.error("[telemetry-proxy] Handler error:", error);
|
|
1087
|
+
return new Response(null, { status: 200 });
|
|
1088
|
+
}
|
|
1089
|
+
}).post(`${PROXY_PATHNAME}/v1/logs`, async function forwardBrowserLogs({ body }) {
|
|
1090
|
+
try {
|
|
1091
|
+
const result = await handleProxy("/v1/logs", body);
|
|
1092
|
+
return new Response(null, { status: result.status });
|
|
1093
|
+
} catch (error) {
|
|
1094
|
+
console.error("[telemetry-proxy] Handler error:", error);
|
|
1095
|
+
return new Response(null, { status: 200 });
|
|
1096
|
+
}
|
|
1097
|
+
}).get(`${PROXY_PATHNAME}/health`, () => {
|
|
1098
|
+
return {
|
|
1099
|
+
status: "ok",
|
|
1100
|
+
otlpEndpoint: OTLP_ENDPOINT,
|
|
1101
|
+
timestamp: new Date().toISOString()
|
|
1102
|
+
};
|
|
1103
|
+
});
|
|
1104
|
+
}
|
|
1105
|
+
return app;
|
|
1106
|
+
};
|
|
1107
|
+
}
|
|
1108
|
+
var init_plugin = __esm(() => {
|
|
1109
|
+
init_core();
|
|
1110
|
+
});
|
|
1111
|
+
|
|
1112
|
+
// packages/telemetry/src/server/index.ts
|
|
1113
|
+
var init_server = __esm(() => {
|
|
1114
|
+
init_instrumentation();
|
|
1115
|
+
init_plugin();
|
|
1116
|
+
});
|
|
1117
|
+
|
|
1118
|
+
// packages/telemetry/server.ts
|
|
1119
|
+
var init_server2 = __esm(() => {
|
|
1120
|
+
init_server();
|
|
1121
|
+
});
|
|
1122
|
+
init_server2();
|
|
1123
|
+
|
|
1124
|
+
export {
|
|
1125
|
+
withSpanSync,
|
|
1126
|
+
withSpan,
|
|
1127
|
+
withParentSpanSync,
|
|
1128
|
+
withParentSpan,
|
|
1129
|
+
telemetry,
|
|
1130
|
+
setSpanAttributes,
|
|
1131
|
+
addSpanEvent
|
|
1132
|
+
};
|
|
1133
|
+
|
|
1134
|
+
//# debugId=B91F92BF15BBA06264756E2164756E21
|