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.
Files changed (197) hide show
  1. package/README.md +150 -52
  2. package/cli/bin.d.ts +1 -1
  3. package/cli/bin.js +446 -150
  4. package/cli/bin.js.map +13 -9
  5. package/cli/index.d.ts +1 -1
  6. package/cli/index.js +4 -4
  7. package/cli/index.js.map +1 -1
  8. package/cli/src/cli.d.ts +1 -1
  9. package/cli/src/commands/analyze.d.ts +1 -1
  10. package/cli/src/commands/build.d.ts +1 -1
  11. package/cli/src/commands/dev.d.ts +1 -1
  12. package/cli/src/commands/gen.d.ts +1 -1
  13. package/cli/src/commands/gen.d.ts.map +1 -1
  14. package/cli/src/commands/index.d.ts +1 -1
  15. package/cli/src/commands/init.d.ts +1 -1
  16. package/cli/src/commands/lib/assets.d.ts +1 -1
  17. package/cli/src/commands/lib/bundler.d.ts +1 -1
  18. package/cli/src/commands/lib/command.d.ts +1 -1
  19. package/cli/src/commands/lib/env.d.ts +1 -1
  20. package/cli/src/commands/lib/index.d.ts +1 -1
  21. package/cli/src/commands/lib/log.d.ts +1 -1
  22. package/cli/src/commands/lib/markdown/availability.d.ts +1 -1
  23. package/cli/src/commands/lib/markdown/index.d.ts +1 -1
  24. package/cli/src/commands/lib/markdown/processor.d.ts +1 -1
  25. package/cli/src/commands/lib/production.d.ts +1 -1
  26. package/cli/src/commands/lib/server.d.ts +1 -1
  27. package/cli/src/commands/lib/streaming/analyzer.d.ts +1 -1
  28. package/cli/src/commands/lib/streaming/suspense.d.ts +1 -1
  29. package/cli/src/commands/lib/tailwind.d.ts +1 -1
  30. package/cli/src/commands/lib/terminal-ui.d.ts +1 -1
  31. package/cli/src/commands/lib/version.d.ts +1 -1
  32. package/cli/src/commands/og.d.ts +1 -1
  33. package/cli/src/commands/start.d.ts +1 -1
  34. package/cli/src/index.d.ts +1 -1
  35. package/core/index.d.ts +1 -1
  36. package/core/index.js +912 -589
  37. package/core/index.js.map +22 -14
  38. package/core/src/bundler/hash.d.ts +1 -1
  39. package/core/src/bundler/index.d.ts +1 -1
  40. package/core/src/config.d.ts +243 -2
  41. package/core/src/config.d.ts.map +1 -1
  42. package/core/src/content/discovery.d.ts +1 -1
  43. package/core/src/content/index.d.ts +1 -1
  44. package/core/src/content/metadata.d.ts +1 -1
  45. package/core/src/index.d.ts +1 -1
  46. package/core/src/llms/extractor.d.ts +1 -1
  47. package/core/src/llms/formatter.d.ts +1 -1
  48. package/core/src/llms/full-generator.d.ts +1 -1
  49. package/core/src/llms/index-generator.d.ts +1 -1
  50. package/core/src/llms/index.d.ts +1 -1
  51. package/core/src/og/discovery.d.ts +1 -1
  52. package/core/src/og/index.d.ts +1 -1
  53. package/core/src/og/meta.d.ts +1 -1
  54. package/core/src/og/render.d.ts +1 -1
  55. package/core/src/og/types.d.ts +1 -1
  56. package/core/src/robots/discovery.d.ts +1 -1
  57. package/core/src/robots/generator.d.ts +1 -1
  58. package/core/src/robots/index.d.ts +1 -1
  59. package/core/src/robots/policies.d.ts +1 -1
  60. package/core/src/rss/discovery.d.ts +1 -1
  61. package/core/src/rss/generator.d.ts +1 -1
  62. package/core/src/rss/index.d.ts +1 -1
  63. package/core/src/sitemap/discovery.d.ts +1 -1
  64. package/core/src/sitemap/generator.d.ts +1 -1
  65. package/core/src/sitemap/index.d.ts +1 -1
  66. package/core/src/ssr/index.d.ts +1 -1
  67. package/core/src/ssr/lib/cache.d.ts +1 -1
  68. package/core/src/ssr/lib/collections.d.ts +1 -1
  69. package/core/src/ssr/lib/compression.d.ts +1 -1
  70. package/core/src/ssr/lib/compute/content.d.ts +1 -1
  71. package/core/src/ssr/lib/compute/index.d.ts +1 -1
  72. package/core/src/ssr/lib/compute/layouts.d.ts +1 -1
  73. package/core/src/ssr/lib/compute/routes.d.ts +1 -1
  74. package/core/src/ssr/lib/data.d.ts +1 -1
  75. package/core/src/ssr/lib/html.d.ts +1 -1
  76. package/core/src/ssr/lib/imports.d.ts +1 -1
  77. package/core/src/ssr/lib/index.d.ts +1 -1
  78. package/core/src/ssr/lib/layouts.d.ts +1 -1
  79. package/core/src/ssr/lib/metadata.d.ts +1 -1
  80. package/core/src/ssr/lib/mime.d.ts +1 -1
  81. package/core/src/ssr/lib/modules.d.ts +1 -1
  82. package/core/src/ssr/lib/path.d.ts +1 -1
  83. package/core/src/ssr/lib/preload.d.ts +1 -1
  84. package/core/src/ssr/lib/scripts/collections.d.ts +1 -1
  85. package/core/src/ssr/lib/scripts/data.d.ts +2 -2
  86. package/core/src/ssr/lib/scripts/data.d.ts.map +1 -1
  87. package/core/src/ssr/lib/scripts/escape.d.ts +1 -1
  88. package/core/src/ssr/lib/scripts/feeds.d.ts +1 -1
  89. package/core/src/ssr/lib/scripts/index.d.ts +1 -1
  90. package/core/src/ssr/lib/seed.d.ts +1 -1
  91. package/core/src/ssr/lib/setup.d.ts +4 -2
  92. package/core/src/ssr/lib/setup.d.ts.map +1 -1
  93. package/core/src/ssr/lib/styles.d.ts +1 -1
  94. package/core/src/ssr/lib/template.d.ts +1 -1
  95. package/core/src/ssr/lib/types.d.ts +1 -1
  96. package/core/src/ssr/render.d.ts +4 -2
  97. package/core/src/ssr/render.d.ts.map +1 -1
  98. package/core/src/ssr/stream.d.ts +4 -2
  99. package/core/src/ssr/stream.d.ts.map +1 -1
  100. package/elysia/index.d.ts +1 -1
  101. package/elysia/index.js +715 -468
  102. package/elysia/index.js.map +15 -11
  103. package/elysia/src/index.d.ts +1 -1
  104. package/elysia/src/libs/assets.d.ts +1 -1
  105. package/elysia/src/libs/cache.d.ts +1 -1
  106. package/elysia/src/libs/caching.d.ts +1 -1
  107. package/elysia/src/libs/http.d.ts +1 -1
  108. package/elysia/src/libs/image.d.ts +1 -1
  109. package/elysia/src/libs/index.d.ts +1 -1
  110. package/elysia/src/libs/llms.d.ts +1 -1
  111. package/elysia/src/libs/response.d.ts +1 -1
  112. package/elysia/src/libs/serving.d.ts +1 -1
  113. package/elysia/src/plugin.d.ts +1 -1
  114. package/elysia/src/routes/artifacts.d.ts +1 -1
  115. package/elysia/src/routes/content.d.ts +1 -1
  116. package/elysia/src/routes/content.d.ts.map +1 -1
  117. package/elysia/src/routes/image.d.ts +1 -1
  118. package/elysia/src/routes/index.d.ts +1 -1
  119. package/elysia/src/routes/internal.d.ts +1 -1
  120. package/elysia/src/routes/llms.d.ts +1 -1
  121. package/elysia/src/routes/og.d.ts +1 -1
  122. package/elysia/src/routes/redirects.d.ts +1 -1
  123. package/elysia/src/routes/robots.d.ts +1 -1
  124. package/elysia/src/routes/rss.d.ts +1 -1
  125. package/elysia/src/routes/search.d.ts +1 -1
  126. package/elysia/src/routes/sitemap.d.ts +1 -1
  127. package/elysia/src/routes/ssr.d.ts +1 -1
  128. package/elysia/src/routes/ssr.d.ts.map +1 -1
  129. package/elysia/src/routes/static.d.ts +1 -1
  130. package/elysia/src/routes/static.d.ts.map +1 -1
  131. package/elysia/src/types.d.ts +1 -1
  132. package/package.json +2 -9
  133. package/react/index.d.ts +1 -1
  134. package/react/index.js +2 -2
  135. package/react/index.js.map +1 -1
  136. package/react/src/components/ClientOnly.d.ts +1 -1
  137. package/react/src/components/ContentRoute.d.ts +1 -1
  138. package/react/src/components/Image.d.ts +1 -1
  139. package/react/src/components/LazyRoute.d.ts +1 -1
  140. package/react/src/components/Link.d.ts +1 -1
  141. package/react/src/components/Markdown.d.ts +1 -1
  142. package/react/src/components/Outlet.d.ts +1 -1
  143. package/react/src/components/index.d.ts +1 -1
  144. package/react/src/hooks/index.d.ts +1 -1
  145. package/react/src/hooks/useContent.d.ts +1 -1
  146. package/react/src/hooks/useData.d.ts +1 -1
  147. package/react/src/hooks/useFeed.d.ts +1 -1
  148. package/react/src/hooks/useLayoutData.d.ts +1 -1
  149. package/react/src/hooks/useLlms.d.ts +1 -1
  150. package/react/src/hooks/useNavigate.d.ts +1 -1
  151. package/react/src/hooks/useParams.d.ts +1 -1
  152. package/react/src/hooks/useRouter.d.ts +1 -1
  153. package/react/src/hooks/useSearch.d.ts +1 -1
  154. package/react/src/hooks/useSearchParams.d.ts +1 -1
  155. package/react/src/hooks/useToc.d.ts +1 -1
  156. package/react/src/index.d.ts +1 -1
  157. package/react/src/lib/collection.d.ts +1 -1
  158. package/react/src/lib/content.d.ts +1 -1
  159. package/react/src/lib/head.d.ts +1 -1
  160. package/react/src/lib/index.d.ts +1 -1
  161. package/react/src/lib/lazy-route.d.ts +1 -1
  162. package/react/src/lib/route-loader.d.ts +1 -1
  163. package/react/src/providers/ContentProvider.d.ts +1 -1
  164. package/react/src/providers/RerouteProvider.d.ts +1 -1
  165. package/react/src/providers/RouterProvider.d.ts +1 -1
  166. package/react/src/providers/index.d.ts +1 -1
  167. package/react/src/types/any.d.ts +1 -1
  168. package/react/src/types/index.d.ts +1 -1
  169. package/react/src/types/router.d.ts +1 -1
  170. package/telemetry/react.d.ts +2 -2
  171. package/telemetry/react.d.ts.map +1 -1
  172. package/telemetry/react.js +167 -185
  173. package/telemetry/react.js.map +7 -6
  174. package/telemetry/{index.d.ts → server.d.ts} +2 -2
  175. package/telemetry/server.d.ts.map +1 -0
  176. package/telemetry/server.js +1134 -0
  177. package/telemetry/server.js.map +44 -0
  178. package/telemetry/src/{browser/react.d.ts → react/api.d.ts} +4 -12
  179. package/telemetry/src/react/api.d.ts.map +1 -0
  180. package/telemetry/{browser.d.ts → src/react/index.d.ts} +4 -3
  181. package/telemetry/src/react/index.d.ts.map +1 -0
  182. package/telemetry/src/{browser/index.d.ts → react/telemetry.d.ts} +13 -13
  183. package/telemetry/src/react/telemetry.d.ts.map +1 -0
  184. package/telemetry/src/server/index.d.ts +3 -101
  185. package/telemetry/src/server/index.d.ts.map +1 -1
  186. package/telemetry/src/server/instrumentation.d.ts +62 -0
  187. package/telemetry/src/server/instrumentation.d.ts.map +1 -0
  188. package/telemetry/src/server/plugin.d.ts +72 -0
  189. package/telemetry/src/server/plugin.d.ts.map +1 -0
  190. package/telemetry/browser.d.ts.map +0 -1
  191. package/telemetry/browser.js +0 -382
  192. package/telemetry/browser.js.map +0 -10
  193. package/telemetry/index.d.ts.map +0 -1
  194. package/telemetry/index.js +0 -509
  195. package/telemetry/index.js.map +0 -10
  196. package/telemetry/src/browser/index.d.ts.map +0 -1
  197. 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