@farm.js/core 0.1.0-beta.67 → 0.1.0-beta.68

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 (112) hide show
  1. package/dist/api/route-manager.cjs +10 -6
  2. package/dist/api/route-manager.cjs.map +1 -1
  3. package/dist/api/route-manager.mjs +4 -4
  4. package/dist/api/runtime.cjs +10 -6
  5. package/dist/api/runtime.cjs.map +1 -1
  6. package/dist/api/runtime.mjs +3 -3
  7. package/dist/api.cjs +10 -6
  8. package/dist/api.cjs.map +1 -1
  9. package/dist/api.mjs +7 -7
  10. package/dist/cache.cjs +10 -6
  11. package/dist/cache.cjs.map +1 -1
  12. package/dist/cache.mjs +2 -2
  13. package/dist/{chunk-5LDLQOU7.mjs → chunk-45ANXPMW.mjs} +2 -2
  14. package/dist/{chunk-FLZRTXOH.mjs → chunk-6YT3MHGS.mjs} +2 -2
  15. package/dist/{chunk-BPG5HLBR.mjs → chunk-76PZXONZ.mjs} +2 -2
  16. package/dist/{chunk-5IVYTVAO.mjs → chunk-7NELY3YG.mjs} +3 -3
  17. package/dist/{chunk-VGOJAATN.mjs → chunk-BEVQNJBU.mjs} +2 -2
  18. package/dist/{chunk-PULJY6XU.mjs → chunk-EIFPT5OT.mjs} +2 -2
  19. package/dist/{chunk-GAPAL2TO.mjs → chunk-H44PA2W7.mjs} +2 -2
  20. package/dist/{chunk-SQHMP4XA.mjs → chunk-HTM5AUEK.mjs} +2 -2
  21. package/dist/{chunk-5TLXU6MG.mjs → chunk-J6ALW6MD.mjs} +2 -2
  22. package/dist/{chunk-HLMU3U7K.mjs → chunk-KJPP5FET.mjs} +3 -3
  23. package/dist/{chunk-S35F2MY7.mjs → chunk-KQOJ7C5L.mjs} +2 -2
  24. package/dist/{chunk-TJFMCCNX.mjs → chunk-PW6I3QX5.mjs} +2 -2
  25. package/dist/{chunk-SX4WHBSX.mjs → chunk-Q2W56ZWS.mjs} +3 -3
  26. package/dist/{chunk-Q7ZTEADY.mjs → chunk-RVXBYZQT.mjs} +3 -3
  27. package/dist/{chunk-335JWE6F.mjs → chunk-TQ5WZG6C.mjs} +6 -6
  28. package/dist/{chunk-3PO3UK5B.mjs → chunk-UJRIHTJF.mjs} +2 -2
  29. package/dist/{chunk-3PO3UK5B.mjs.map → chunk-UJRIHTJF.mjs.map} +1 -1
  30. package/dist/{chunk-6HZ23B26.mjs → chunk-USMITIYZ.mjs} +3 -3
  31. package/dist/{chunk-VSDJ4EX2.mjs → chunk-X5KBWTVR.mjs} +2 -2
  32. package/dist/{chunk-BDDLX64F.mjs → chunk-XPQTDWIB.mjs} +2 -2
  33. package/dist/{chunk-7ZMKVETU.mjs → chunk-ZRBCBOEX.mjs} +16 -10
  34. package/dist/{chunk-7ZMKVETU.mjs.map → chunk-ZRBCBOEX.mjs.map} +1 -1
  35. package/dist/client/lifecycle.mjs +2 -2
  36. package/dist/client-plugins.cjs +1 -1
  37. package/dist/client-plugins.cjs.map +1 -1
  38. package/dist/client-plugins.mjs +2 -2
  39. package/dist/client.cjs +11 -7
  40. package/dist/client.cjs.map +1 -1
  41. package/dist/client.mjs +9 -9
  42. package/dist/index.cjs +16 -10
  43. package/dist/index.cjs.map +1 -1
  44. package/dist/index.d.mts +1 -1
  45. package/dist/index.d.ts +1 -1
  46. package/dist/index.mjs +20 -20
  47. package/dist/internal/build-runtime.cjs +11 -7
  48. package/dist/internal/build-runtime.cjs.map +1 -1
  49. package/dist/internal/build-runtime.mjs +8 -8
  50. package/dist/internal/client-runtime.cjs +1 -1
  51. package/dist/internal/client-runtime.cjs.map +1 -1
  52. package/dist/internal/client-runtime.mjs +2 -2
  53. package/dist/internal/production-runtime.cjs +10 -6
  54. package/dist/internal/production-runtime.cjs.map +1 -1
  55. package/dist/internal/production-runtime.mjs +3 -3
  56. package/dist/middleware.cjs +10 -6
  57. package/dist/middleware.cjs.map +1 -1
  58. package/dist/middleware.mjs +4 -4
  59. package/dist/observability.cjs +15 -9
  60. package/dist/observability.cjs.map +1 -1
  61. package/dist/observability.d.mts +6 -2
  62. package/dist/observability.d.ts +6 -2
  63. package/dist/observability.mjs +1 -1
  64. package/dist/plugin.cjs +11 -7
  65. package/dist/plugin.cjs.map +1 -1
  66. package/dist/plugin.mjs +7 -7
  67. package/dist/renderer-client.cjs +10 -6
  68. package/dist/renderer-client.cjs.map +1 -1
  69. package/dist/renderer-client.mjs +4 -4
  70. package/dist/routes.cjs +10 -6
  71. package/dist/routes.cjs.map +1 -1
  72. package/dist/routes.mjs +3 -3
  73. package/dist/server-fn.cjs +10 -6
  74. package/dist/server-fn.cjs.map +1 -1
  75. package/dist/server-fn.mjs +3 -3
  76. package/dist/server-query-client.cjs +10 -6
  77. package/dist/server-query-client.cjs.map +1 -1
  78. package/dist/server-query-client.mjs +5 -5
  79. package/dist/server-query.cjs +10 -6
  80. package/dist/server-query.cjs.map +1 -1
  81. package/dist/server-query.mjs +4 -4
  82. package/dist/server.cjs +11 -7
  83. package/dist/server.cjs.map +1 -1
  84. package/dist/server.mjs +9 -9
  85. package/dist/testing.cjs +10 -6
  86. package/dist/testing.cjs.map +1 -1
  87. package/dist/testing.mjs +5 -5
  88. package/dist/version.cjs +1 -1
  89. package/dist/version.cjs.map +1 -1
  90. package/dist/version.mjs +1 -1
  91. package/dist/vite.cjs +11 -7
  92. package/dist/vite.cjs.map +1 -1
  93. package/dist/vite.mjs +7 -7
  94. package/package.json +1 -1
  95. /package/dist/{chunk-5LDLQOU7.mjs.map → chunk-45ANXPMW.mjs.map} +0 -0
  96. /package/dist/{chunk-FLZRTXOH.mjs.map → chunk-6YT3MHGS.mjs.map} +0 -0
  97. /package/dist/{chunk-BPG5HLBR.mjs.map → chunk-76PZXONZ.mjs.map} +0 -0
  98. /package/dist/{chunk-5IVYTVAO.mjs.map → chunk-7NELY3YG.mjs.map} +0 -0
  99. /package/dist/{chunk-VGOJAATN.mjs.map → chunk-BEVQNJBU.mjs.map} +0 -0
  100. /package/dist/{chunk-PULJY6XU.mjs.map → chunk-EIFPT5OT.mjs.map} +0 -0
  101. /package/dist/{chunk-GAPAL2TO.mjs.map → chunk-H44PA2W7.mjs.map} +0 -0
  102. /package/dist/{chunk-SQHMP4XA.mjs.map → chunk-HTM5AUEK.mjs.map} +0 -0
  103. /package/dist/{chunk-5TLXU6MG.mjs.map → chunk-J6ALW6MD.mjs.map} +0 -0
  104. /package/dist/{chunk-HLMU3U7K.mjs.map → chunk-KJPP5FET.mjs.map} +0 -0
  105. /package/dist/{chunk-S35F2MY7.mjs.map → chunk-KQOJ7C5L.mjs.map} +0 -0
  106. /package/dist/{chunk-TJFMCCNX.mjs.map → chunk-PW6I3QX5.mjs.map} +0 -0
  107. /package/dist/{chunk-SX4WHBSX.mjs.map → chunk-Q2W56ZWS.mjs.map} +0 -0
  108. /package/dist/{chunk-Q7ZTEADY.mjs.map → chunk-RVXBYZQT.mjs.map} +0 -0
  109. /package/dist/{chunk-335JWE6F.mjs.map → chunk-TQ5WZG6C.mjs.map} +0 -0
  110. /package/dist/{chunk-6HZ23B26.mjs.map → chunk-USMITIYZ.mjs.map} +0 -0
  111. /package/dist/{chunk-VSDJ4EX2.mjs.map → chunk-X5KBWTVR.mjs.map} +0 -0
  112. /package/dist/{chunk-BDDLX64F.mjs.map → chunk-XPQTDWIB.mjs.map} +0 -0
@@ -7,15 +7,15 @@ import {
7
7
  memoryRateLimitStorage,
8
8
  middleware,
9
9
  unwrapMiddleware
10
- } from "./chunk-VSDJ4EX2.mjs";
10
+ } from "./chunk-X5KBWTVR.mjs";
11
11
  import {
12
12
  applyProductionMiddlewareHeaders,
13
13
  createProductionMiddlewareRunner
14
- } from "./chunk-5TLXU6MG.mjs";
14
+ } from "./chunk-J6ALW6MD.mjs";
15
15
  import {
16
16
  MiddlewareManager,
17
17
  createContext
18
- } from "./chunk-S35F2MY7.mjs";
18
+ } from "./chunk-KQOJ7C5L.mjs";
19
19
  import {
20
20
  _runWithMiddlewareContext,
21
21
  _runWithMiddlewareData,
@@ -30,7 +30,7 @@ import "./chunk-QN4DQGY7.mjs";
30
30
  import "./chunk-X6WJFY7U.mjs";
31
31
  import "./chunk-LM2YNO4U.mjs";
32
32
  import "./chunk-44ZCFSKE.mjs";
33
- import "./chunk-7ZMKVETU.mjs";
33
+ import "./chunk-ZRBCBOEX.mjs";
34
34
  import "./chunk-CGILA3WO.mjs";
35
35
  export {
36
36
  MiddlewareManager,
@@ -366,6 +366,7 @@ __name(getSpanTraceContext, "getSpanTraceContext");
366
366
 
367
367
  // src/observability.ts
368
368
  var runtimeHandlers = /* @__PURE__ */ new Set();
369
+ var unfilteredRuntimeHandlers = /* @__PURE__ */ new Set();
369
370
  var observabilityState = {
370
371
  logs: false,
371
372
  handlers: [],
@@ -392,15 +393,17 @@ function normalizeFarmObservabilityConfig(config) {
392
393
  };
393
394
  }
394
395
  __name(normalizeFarmObservabilityConfig, "normalizeFarmObservabilityConfig");
395
- function onFarmEvent(handler) {
396
- runtimeHandlers.add(handler);
396
+ function onFarmEvent(handler, options = {}) {
397
+ const handlers = options.unfiltered ? unfilteredRuntimeHandlers : runtimeHandlers;
398
+ handlers.add(handler);
397
399
  return () => {
398
- runtimeHandlers.delete(handler);
400
+ handlers.delete(handler);
399
401
  };
400
402
  }
401
403
  __name(onFarmEvent, "onFarmEvent");
402
404
  function resetFarmObservability() {
403
405
  runtimeHandlers.clear();
406
+ unfilteredRuntimeHandlers.clear();
404
407
  observabilityState = {
405
408
  logs: false,
406
409
  handlers: [],
@@ -421,13 +424,17 @@ function emitFarmEvent(input) {
421
424
  event.spanId = traceContext.spanId;
422
425
  event.traceSampled = traceContext.traceSampled;
423
426
  }
424
- if (!shouldEmitFarmEvent(event)) {
425
- return event;
426
- }
427
+ notifyFarmEventHandlers(event, unfilteredRuntimeHandlers);
428
+ if (!shouldEmitFarmEvent(event)) return event;
427
429
  if (observabilityState.logs) {
428
430
  logFarmEvent(event);
429
431
  }
430
- for (const handler of [...observabilityState.handlers, ...runtimeHandlers]) {
432
+ notifyFarmEventHandlers(event, [...observabilityState.handlers, ...runtimeHandlers]);
433
+ return event;
434
+ }
435
+ __name(emitFarmEvent, "emitFarmEvent");
436
+ function notifyFarmEventHandlers(event, handlers) {
437
+ for (const handler of handlers) {
431
438
  try {
432
439
  Promise.resolve(handler(event)).catch((error) => {
433
440
  console.warn(`[farm:observability] event handler failed: ${formatError(error)}`);
@@ -436,9 +443,8 @@ function emitFarmEvent(input) {
436
443
  console.warn(`[farm:observability] event handler failed: ${formatError(error)}`);
437
444
  }
438
445
  }
439
- return event;
440
446
  }
441
- __name(emitFarmEvent, "emitFarmEvent");
447
+ __name(notifyFarmEventHandlers, "notifyFarmEventHandlers");
442
448
  async function runWithFarmRequestSpan(request, handler, options = {}) {
443
449
  const url = new URL(request.url);
444
450
  const method = request.method || "GET";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/observability.ts","../src/tracing.ts"],"sourcesContent":["import {\n _runWithFarmRequestSpan,\n configureFarmTracing,\n getFarmTraceContext,\n normalizeFarmTracingConfig,\n recordFarmEventTrace,\n resetFarmTracing,\n runWithFarmSpan,\n type FarmRequestSpanOptions,\n type FarmResolvedTracingConfig,\n type FarmSpanOptions,\n type FarmTraceContext,\n type FarmTraceSpanKind,\n type FarmTracingConfig,\n type FarmTracingUserConfig,\n} from \"./tracing\";\n\nexport type FarmEventLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport interface FarmEventBase {\n type: string;\n timestamp: number;\n level: FarmEventLevel;\n requestId?: string;\n traceId?: string;\n spanId?: string;\n traceSampled?: boolean;\n route?: string;\n pathname?: string;\n}\n\nexport type FarmRequestEvent =\n | (FarmEventBase & { type: \"request.start\"; method: string; pathname: string })\n | (FarmEventBase & {\n type: \"request.complete\";\n method: string;\n pathname: string;\n status: number;\n durationMs: number;\n })\n | (FarmEventBase & {\n type: \"request.error\";\n method: string;\n pathname: string;\n durationMs: number;\n error: unknown;\n });\n\nexport type FarmServerEvent =\n | (FarmEventBase & {\n type: \"server.start\";\n mode: \"dev\" | \"preview\" | \"production\";\n port?: number;\n })\n | (FarmEventBase & { type: \"server.ready\"; url?: string })\n | (FarmEventBase & { type: \"server.shutdown\"; reason?: string });\n\nexport type FarmRouteEvent =\n | (FarmEventBase & { type: \"route.discovered\"; route: string; filePath: string })\n | (FarmEventBase & {\n type: \"route.matched\";\n pathname: string;\n route: string;\n params?: Record<string, string>;\n })\n | (FarmEventBase & { type: \"route.notFound\"; pathname: string })\n | (FarmEventBase & { type: \"route.redirect\"; from: string; to: string; status?: number })\n | (FarmEventBase & { type: \"route.rewrite\"; from: string; to: string });\n\nexport type FarmRenderEvent =\n | (FarmEventBase & { type: \"render.start\"; route: string; pathname?: string })\n | (FarmEventBase & {\n type: \"render.complete\";\n route: string;\n durationMs: number;\n status?: number;\n })\n | (FarmEventBase & { type: \"render.error\"; route?: string; error: unknown })\n | (FarmEventBase & { type: \"render.stream.start\"; route: string })\n | (FarmEventBase & { type: \"render.stream.shellReady\"; route: string; durationMs: number })\n | (FarmEventBase & { type: \"render.stream.complete\"; route: string; durationMs: number });\n\nexport type FarmCacheEvent =\n | (FarmEventBase & {\n type: \"cache.hit\";\n key: string;\n route?: string;\n tags?: readonly string[];\n revalidate?: number | false;\n stale?: boolean;\n })\n | (FarmEventBase & { type: \"cache.miss\"; key: string; route?: string; reason?: string })\n | (FarmEventBase & {\n type: \"cache.set\";\n key: string;\n route?: string;\n tags?: readonly string[];\n revalidate?: number | false;\n })\n | (FarmEventBase & { type: \"cache.dedupe\"; key: string })\n | (FarmEventBase & { type: \"cache.bypass\"; key?: string; route?: string; reason: string })\n | (FarmEventBase & {\n type: \"cache.stale\";\n key: string;\n route?: string;\n tags?: readonly string[];\n revalidate?: number | false;\n })\n | (FarmEventBase & { type: \"cache.revalidatePath\"; path: string; count: number })\n | (FarmEventBase & {\n type: \"cache.revalidateTag\";\n tag: string;\n profile?: unknown;\n count: number;\n })\n | (FarmEventBase & { type: \"cache.updateTag\"; tag: string; count: number })\n | (FarmEventBase & {\n type: \"cache.invalidated\";\n key?: string;\n route?: string;\n tag?: string;\n reason?: string;\n count?: number;\n })\n | (FarmEventBase & { type: \"cache.delete\"; key: string; deleted: boolean })\n | (FarmEventBase & { type: \"cache.clear\"; count: number })\n | (FarmEventBase & {\n type: \"cache.error\";\n key?: string;\n operation: \"get\" | \"set\" | \"delete\" | \"revalidate\";\n error: unknown;\n });\n\nexport type FarmPPREvent =\n | (FarmEventBase & { type: \"ppr.shell.hit\"; route: string; key: string })\n | (FarmEventBase & { type: \"ppr.shell.miss\"; route: string; key: string })\n | (FarmEventBase & {\n type: \"ppr.shell.cached\";\n route: string;\n key: string;\n revalidate?: number;\n })\n | (FarmEventBase & { type: \"ppr.shell.bypass\"; route: string; reason: string })\n | (FarmEventBase & {\n type: \"ppr.shell.invalidated\";\n route: string;\n reason?: string;\n count?: number;\n })\n | (FarmEventBase & { type: \"ppr.suspense.holeDetected\"; route: string })\n | (FarmEventBase & { type: \"ppr.refresh.start\"; route: string })\n | (FarmEventBase & { type: \"ppr.refresh.complete\"; route: string; durationMs: number })\n | (FarmEventBase & { type: \"ppr.refresh.error\"; route: string; error: unknown });\n\nexport type FarmAPIEvent =\n | (FarmEventBase & { type: \"api.request.start\"; route: string; method: string })\n | (FarmEventBase & {\n type: \"api.request.complete\";\n route: string;\n method: string;\n status: number;\n durationMs: number;\n })\n | (FarmEventBase & {\n type: \"api.validation.failed\";\n route: string;\n method: string;\n issues?: unknown;\n })\n | (FarmEventBase & {\n type: \"api.error\";\n route: string;\n method: string;\n durationMs: number;\n error: unknown;\n });\n\nexport type FarmIntegrationEvent =\n | (FarmEventBase & { type: \"integration.registered\"; name: string })\n | (FarmEventBase & { type: \"integration.config.validated\"; name: string })\n | (FarmEventBase & { type: \"integration.ready\"; name: string })\n | (FarmEventBase & { type: \"integration.disposed\"; name: string })\n | (FarmEventBase & {\n type: \"integration.api.call.start\";\n integration: string;\n operation: string;\n })\n | (FarmEventBase & {\n type: \"integration.api.call.complete\";\n integration: string;\n operation: string;\n durationMs: number;\n })\n | (FarmEventBase & {\n type: \"integration.api.call.error\";\n integration: string;\n operation: string;\n error: unknown;\n })\n | (FarmEventBase & { type: \"integration.webhook.received\"; integration: string; event?: string })\n | (FarmEventBase & { type: \"integration.webhook.verified\"; integration: string; event?: string })\n | (FarmEventBase & { type: \"integration.webhook.failed\"; integration: string; reason: string });\n\nexport type FarmMiddlewareEvent =\n | (FarmEventBase & { type: \"middleware.start\"; route?: string; name?: string })\n | (FarmEventBase & {\n type: \"middleware.complete\";\n route?: string;\n name?: string;\n durationMs: number;\n })\n | (FarmEventBase & {\n type: \"middleware.shortCircuit\";\n route?: string;\n name?: string;\n status?: number;\n })\n | (FarmEventBase & { type: \"middleware.error\"; route?: string; name?: string; error: unknown });\n\nexport type FarmStorageEvent =\n | (FarmEventBase & { type: \"storage.query.start\"; integration?: string; operation: string })\n | (FarmEventBase & {\n type: \"storage.query.complete\";\n integration?: string;\n operation: string;\n durationMs: number;\n })\n | (FarmEventBase & {\n type: \"storage.query.error\";\n integration?: string;\n operation: string;\n error: unknown;\n })\n | (FarmEventBase & { type: \"storage.schema.ready\"; integration?: string })\n | (FarmEventBase & { type: \"storage.schema.error\"; integration?: string; error: unknown });\n\nexport type FarmBuildEvent =\n | (FarmEventBase & { type: \"build.start\"; target?: string })\n | (FarmEventBase & { type: \"build.complete\"; target?: string; durationMs: number })\n | (FarmEventBase & { type: \"build.error\"; target?: string; error: unknown })\n | (FarmEventBase & { type: \"routes.generated\"; pageCount: number; apiCount?: number })\n | (FarmEventBase & { type: \"types.generated\"; filePath: string })\n | (FarmEventBase & { type: \"manifest.generated\"; routeCount: number });\n\nexport type FarmPluginEvent =\n | (FarmEventBase & { type: \"plugin.hook.start\"; plugin: string; hook: string })\n | (FarmEventBase & {\n type: \"plugin.hook.complete\";\n plugin: string;\n hook: string;\n durationMs: number;\n })\n | (FarmEventBase & { type: \"plugin.hook.error\"; plugin: string; hook: string; error: unknown });\n\nexport type FarmErrorEvent = FarmEventBase & {\n type: \"error\";\n source: string;\n error: unknown;\n route?: string;\n};\n\nexport type FarmEvent =\n | FarmRequestEvent\n | FarmServerEvent\n | FarmRouteEvent\n | FarmRenderEvent\n | FarmCacheEvent\n | FarmPPREvent\n | FarmAPIEvent\n | FarmIntegrationEvent\n | FarmMiddlewareEvent\n | FarmStorageEvent\n | FarmBuildEvent\n | FarmPluginEvent\n | FarmErrorEvent;\n\nexport type FarmEventType = FarmEvent[\"type\"];\nexport type FarmEventHandler = (event: FarmEvent) => void | Promise<void>;\n\nexport type FarmEventInput = FarmEvent extends infer T\n ? T extends FarmEvent\n ? Omit<T, \"timestamp\" | \"level\"> & Partial<Pick<T, \"timestamp\" | \"level\">>\n : never\n : never;\n\nexport type FarmObservabilityUserConfig =\n | boolean\n | {\n logs?: boolean;\n onEvent?: FarmEventHandler | readonly FarmEventHandler[];\n events?: readonly FarmEventType[];\n tracing?: FarmTracingUserConfig;\n };\n\nexport interface FarmResolvedObservabilityConfig {\n logs: boolean;\n handlers: FarmEventHandler[];\n events?: Set<FarmEventType>;\n tracing: FarmResolvedTracingConfig;\n}\n\nconst runtimeHandlers = new Set<FarmEventHandler>();\nlet observabilityState: FarmResolvedObservabilityConfig = {\n logs: false,\n handlers: [],\n tracing: normalizeFarmTracingConfig(false),\n};\n\nexport function configureFarmObservability(config: FarmObservabilityUserConfig | undefined): void {\n observabilityState = normalizeFarmObservabilityConfig(config);\n configureFarmTracing(observabilityState.tracing);\n}\n\nexport function normalizeFarmObservabilityConfig(\n config: FarmObservabilityUserConfig | undefined,\n): FarmResolvedObservabilityConfig {\n if (config === undefined || config === false) {\n return { logs: false, handlers: [], tracing: normalizeFarmTracingConfig(false) };\n }\n\n if (config === true) {\n return { logs: true, handlers: [], tracing: normalizeFarmTracingConfig(false) };\n }\n\n const handlers = config.onEvent\n ? Array.isArray(config.onEvent)\n ? [...config.onEvent]\n : [config.onEvent]\n : [];\n\n return {\n logs: config.logs ?? false,\n handlers,\n events: config.events ? new Set(config.events) : undefined,\n tracing: normalizeFarmTracingConfig(config.tracing),\n };\n}\n\nexport function onFarmEvent(handler: FarmEventHandler): () => void {\n runtimeHandlers.add(handler);\n return () => {\n runtimeHandlers.delete(handler);\n };\n}\n\nexport function resetFarmObservability(): void {\n runtimeHandlers.clear();\n observabilityState = {\n logs: false,\n handlers: [],\n tracing: normalizeFarmTracingConfig(false),\n };\n resetFarmTracing();\n}\n\nexport function emitFarmEvent(input: FarmEventInput): FarmEvent {\n const event = {\n timestamp: Date.now(),\n level: inferFarmEventLevel(input.type),\n ...input,\n } as FarmEvent;\n\n const traceContext = recordFarmEventTrace(event);\n if (traceContext) {\n event.traceId = traceContext.traceId;\n event.spanId = traceContext.spanId;\n event.traceSampled = traceContext.traceSampled;\n }\n\n if (!shouldEmitFarmEvent(event)) {\n return event;\n }\n\n if (observabilityState.logs) {\n logFarmEvent(event);\n }\n\n for (const handler of [...observabilityState.handlers, ...runtimeHandlers]) {\n try {\n Promise.resolve(handler(event)).catch((error) => {\n console.warn(`[farm:observability] event handler failed: ${formatError(error)}`);\n });\n } catch (error) {\n console.warn(`[farm:observability] event handler failed: ${formatError(error)}`);\n }\n }\n\n return event;\n}\n\nexport async function runWithFarmRequestSpan<T>(\n request: Request,\n handler: () => T | Promise<T>,\n options: FarmRequestSpanOptions = {},\n): Promise<T> {\n const url = new URL(request.url);\n const method = request.method || \"GET\";\n return await _runWithFarmRequestSpan(request, handler, {\n ...options,\n onStart() {\n emitFarmEvent({ type: \"request.start\", method, pathname: url.pathname });\n options.onStart?.();\n },\n onComplete(status, durationMs) {\n emitFarmEvent({\n type: \"request.complete\",\n method,\n pathname: url.pathname,\n status,\n durationMs,\n });\n options.onComplete?.(status, durationMs);\n },\n onError(error, durationMs) {\n emitFarmEvent({\n type: \"request.error\",\n method,\n pathname: url.pathname,\n durationMs,\n error,\n });\n options.onError?.(error, durationMs);\n },\n });\n}\n\nexport { configureFarmTracing, getFarmTraceContext, normalizeFarmTracingConfig, runWithFarmSpan };\nexport type {\n FarmRequestSpanOptions,\n FarmResolvedTracingConfig,\n FarmSpanOptions,\n FarmTraceContext,\n FarmTraceSpanKind,\n FarmTracingConfig,\n FarmTracingUserConfig,\n};\n\nfunction shouldEmitFarmEvent(event: FarmEvent): boolean {\n if (\n !observabilityState.logs &&\n observabilityState.handlers.length === 0 &&\n runtimeHandlers.size === 0\n ) {\n return false;\n }\n\n if (observabilityState.events && !observabilityState.events.has(event.type)) {\n return false;\n }\n\n return true;\n}\n\nfunction inferFarmEventLevel(type: FarmEventType): FarmEventLevel {\n if (type === \"error\" || type.endsWith(\".error\") || type.endsWith(\".failed\")) {\n return \"error\";\n }\n if (\n type.endsWith(\".bypass\") ||\n type.endsWith(\".invalidated\") ||\n type.endsWith(\".stale\") ||\n type.endsWith(\".notFound\")\n ) {\n return \"warn\";\n }\n if (\n type.endsWith(\".hit\") ||\n type.endsWith(\".miss\") ||\n type.endsWith(\".start\") ||\n type.endsWith(\".shellReady\")\n ) {\n return \"debug\";\n }\n return \"info\";\n}\n\nfunction logFarmEvent(event: FarmEvent): void {\n const message = `[farm:${event.level}] ${event.type}${formatFarmEventDetails(event)}`;\n switch (event.level) {\n case \"error\":\n console.error(message);\n break;\n case \"warn\":\n console.warn(message);\n break;\n default:\n console.log(message);\n break;\n }\n}\n\nfunction formatFarmEventDetails(event: FarmEvent): string {\n const details: string[] = [];\n const record = event as unknown as Record<string, unknown>;\n\n for (const key of [\n \"route\",\n \"pathname\",\n \"method\",\n \"status\",\n \"key\",\n \"tag\",\n \"path\",\n \"reason\",\n \"durationMs\",\n \"integration\",\n \"operation\",\n \"plugin\",\n \"hook\",\n \"target\",\n \"count\",\n ]) {\n const value = record[key];\n if (value !== undefined) {\n details.push(`${key}=${formatDetailValue(value)}`);\n }\n }\n\n return details.length > 0 ? ` ${details.join(\" \")}` : \"\";\n}\n\nfunction formatDetailValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import {\n context,\n createContextKey,\n isSpanContextValid,\n propagation,\n SpanKind,\n SpanStatusCode,\n trace,\n type Attributes,\n type Context,\n type Span,\n} from \"@opentelemetry/api\";\nimport type { FarmEvent } from \"./observability\";\n\nexport const FARM_TRACER_NAME = \"@farm.js/core\";\n\nexport type FarmTraceSpanKind =\n | \"request\"\n | \"render\"\n | \"middleware\"\n | \"api\"\n | \"integration\"\n | \"storage\"\n | \"ppr\"\n | \"build\"\n | \"plugin\";\n\nexport interface FarmTracingConfig {\n /** Enable Farm's OpenTelemetry spans. */\n enabled?: boolean;\n /** Span families to record. All families are enabled by default. */\n spans?: readonly FarmTraceSpanKind[];\n /** Add Farm lifecycle events to the active span. Defaults to true. */\n recordEvents?: boolean;\n /** Static attributes added to every Farm-created span. */\n attributes?: Attributes;\n /** Path prefixes that should not create request spans. */\n ignorePaths?: readonly string[];\n}\n\nexport type FarmTracingUserConfig = boolean | FarmTracingConfig;\n\nexport interface FarmResolvedTracingConfig {\n enabled: boolean;\n spans: ReadonlySet<FarmTraceSpanKind>;\n recordEvents: boolean;\n attributes: Attributes;\n ignorePaths: readonly string[];\n}\n\nexport interface FarmTraceContext {\n traceId: string;\n spanId: string;\n traceSampled: boolean;\n}\n\nexport interface FarmRequestSpanOptions {\n getStatusCode?: () => number | undefined;\n onStart?: () => void;\n onComplete?: (status: number, durationMs: number) => void;\n onError?: (error: unknown, durationMs: number) => void;\n}\n\nexport interface FarmSpanOptions {\n kind?: FarmTraceSpanKind;\n attributes?: Attributes;\n spanKind?: SpanKind;\n}\n\nconst ALL_SPAN_KINDS: readonly FarmTraceSpanKind[] = [\n \"request\",\n \"render\",\n \"middleware\",\n \"api\",\n \"integration\",\n \"storage\",\n \"ppr\",\n \"build\",\n \"plugin\",\n];\n\nconst DEFAULT_IGNORED_PATHS = [\n \"/@vite/\",\n \"/@fs/\",\n \"/@id/\",\n \"/@react-refresh\",\n \"/node_modules/\",\n \"/__vite\",\n \"/.well-known/appspecific/\",\n];\nconst FARM_REQUEST_METHOD_CONTEXT_KEY = createContextKey(\"@farm.js/core/request-method\");\n\nlet tracingState: FarmResolvedTracingConfig = normalizeFarmTracingConfig(false);\n\nexport function normalizeFarmTracingConfig(\n config: FarmTracingUserConfig | undefined,\n): FarmResolvedTracingConfig {\n if (!config) {\n return {\n enabled: false,\n spans: new Set(ALL_SPAN_KINDS),\n recordEvents: true,\n attributes: {},\n ignorePaths: DEFAULT_IGNORED_PATHS,\n };\n }\n\n if (config === true) {\n return {\n enabled: true,\n spans: new Set(ALL_SPAN_KINDS),\n recordEvents: true,\n attributes: {},\n ignorePaths: DEFAULT_IGNORED_PATHS,\n };\n }\n\n return {\n enabled: config.enabled ?? true,\n spans: new Set(config.spans ?? ALL_SPAN_KINDS),\n recordEvents: config.recordEvents ?? true,\n attributes: { ...config.attributes },\n ignorePaths: [...DEFAULT_IGNORED_PATHS, ...(config.ignorePaths ?? [])],\n };\n}\n\nexport function configureFarmTracing(\n config: FarmTracingUserConfig | FarmResolvedTracingConfig | undefined,\n): void {\n if (isResolvedFarmTracingConfig(config)) {\n tracingState = {\n ...config,\n spans: new Set(config.spans),\n attributes: { ...config.attributes },\n ignorePaths: [...config.ignorePaths],\n };\n return;\n }\n tracingState = normalizeFarmTracingConfig(config as FarmTracingUserConfig | undefined);\n}\n\nfunction isResolvedFarmTracingConfig(\n config: FarmTracingUserConfig | FarmResolvedTracingConfig | undefined,\n): config is FarmResolvedTracingConfig {\n return (\n !!config &&\n typeof config === \"object\" &&\n typeof config.enabled === \"boolean\" &&\n config.spans instanceof Set &&\n typeof config.recordEvents === \"boolean\" &&\n Array.isArray(config.ignorePaths)\n );\n}\n\nexport function getFarmTracingConfig(): FarmResolvedTracingConfig {\n return tracingState;\n}\n\nexport function resetFarmTracing(): void {\n tracingState = normalizeFarmTracingConfig(false);\n}\n\nexport function getFarmTraceContext(): FarmTraceContext | undefined {\n return getSpanTraceContext(trace.getSpan(context.active()));\n}\n\nexport async function runWithFarmSpan<T>(\n name: string,\n handler: () => T | Promise<T>,\n options: FarmSpanOptions = {},\n): Promise<T> {\n const spanFamily = options.kind;\n if (!tracingState.enabled || (spanFamily !== undefined && !tracingState.spans.has(spanFamily))) {\n return await handler();\n }\n\n const tracer = trace.getTracer(FARM_TRACER_NAME);\n return await tracer.startActiveSpan(\n name,\n {\n kind: options.spanKind ?? SpanKind.INTERNAL,\n attributes: {\n ...tracingState.attributes,\n ...options.attributes,\n },\n },\n async (span) => {\n try {\n return await handler();\n } catch (error) {\n recordSpanError(span, error);\n throw error;\n } finally {\n span.end();\n }\n },\n );\n}\n\nexport async function _runWithFarmRequestSpan<T>(\n request: Request,\n handler: () => T | Promise<T>,\n options: FarmRequestSpanOptions = {},\n): Promise<T> {\n const startedAt = Date.now();\n const url = new URL(request.url);\n const shouldTrace =\n tracingState.enabled &&\n tracingState.spans.has(\"request\") &&\n !tracingState.ignorePaths.some((prefix) => url.pathname.startsWith(prefix));\n\n if (!shouldTrace) {\n options.onStart?.();\n try {\n const result = await handler();\n options.onComplete?.(resolveResultStatus(result, options), Date.now() - startedAt);\n return result;\n } catch (error) {\n options.onError?.(error, Date.now() - startedAt);\n throw error;\n }\n }\n\n const extractedContext = propagation.extract(context.active(), request.headers, {\n keys(carrier) {\n return Array.from(carrier.keys());\n },\n get(carrier, key) {\n return carrier.get(key) ?? undefined;\n },\n });\n const requestContext = extractedContext.setValue(FARM_REQUEST_METHOD_CONTEXT_KEY, request.method);\n const tracer = trace.getTracer(FARM_TRACER_NAME);\n const attributes: Attributes = {\n ...tracingState.attributes,\n \"http.request.method\": request.method,\n \"url.path\": url.pathname,\n \"url.scheme\": url.protocol.replace(/:$/, \"\"),\n \"server.address\": url.hostname,\n };\n if (url.port) attributes[\"server.port\"] = Number(url.port);\n\n return await tracer.startActiveSpan(\n `${request.method} ${url.pathname}`,\n { kind: SpanKind.SERVER, attributes },\n requestContext,\n async (span) => {\n options.onStart?.();\n try {\n const result = await handler();\n const status = resolveResultStatus(result, options);\n setResponseStatus(span, status);\n options.onComplete?.(status, Date.now() - startedAt);\n return result;\n } catch (error) {\n recordSpanError(span, error);\n options.onError?.(error, Date.now() - startedAt);\n throw error;\n } finally {\n span.end();\n }\n },\n );\n}\n\nexport function recordFarmEventTrace(event: FarmEvent): FarmTraceContext | undefined {\n if (!tracingState.enabled) return undefined;\n\n const activeContext = context.active();\n const activeSpan = trace.getSpan(activeContext);\n const traceContext = getSpanTraceContext(activeSpan);\n if (activeSpan && traceContext) {\n if (event.type === \"route.matched\") {\n const method =\n (activeContext.getValue(FARM_REQUEST_METHOD_CONTEXT_KEY) as string | undefined) ?? \"HTTP\";\n activeSpan.updateName(`${method} ${event.route}`);\n activeSpan.setAttribute(\"http.route\", event.route);\n activeSpan.setAttribute(\"farm.route\", event.route);\n }\n\n if (tracingState.recordEvents) {\n activeSpan.addEvent(event.type, toEventAttributes(event), event.timestamp);\n }\n\n const error = event.type === \"request.error\" ? undefined : getEventError(event);\n if (error !== undefined) recordSpanError(activeSpan, error);\n }\n\n const completedTraceContext = recordCompletedEventSpan(event, activeContext);\n return traceContext ?? completedTraceContext;\n}\n\nfunction recordCompletedEventSpan(\n event: FarmEvent,\n parentContext: Context,\n): FarmTraceContext | undefined {\n const descriptor = getCompletedSpanDescriptor(event);\n if (!descriptor || !tracingState.spans.has(descriptor.kind)) return undefined;\n\n const tracer = trace.getTracer(FARM_TRACER_NAME);\n const span = tracer.startSpan(\n descriptor.name,\n {\n kind: SpanKind.INTERNAL,\n startTime: event.timestamp - descriptor.durationMs,\n attributes: {\n ...tracingState.attributes,\n ...toEventAttributes(event),\n \"farm.event.type\": event.type,\n },\n },\n parentContext,\n );\n\n const status = \"status\" in event && typeof event.status === \"number\" ? event.status : undefined;\n if (status !== undefined) setResponseStatus(span, status);\n const error = getEventError(event);\n if (error !== undefined) recordSpanError(span, error);\n const traceContext = getSpanTraceContext(span);\n span.end(event.timestamp);\n return traceContext;\n}\n\nfunction getCompletedSpanDescriptor(\n event: FarmEvent,\n): { kind: FarmTraceSpanKind; name: string; durationMs: number } | undefined {\n if (!(\"durationMs\" in event) || typeof event.durationMs !== \"number\") return undefined;\n\n switch (event.type) {\n case \"render.complete\":\n return { kind: \"render\", name: `farm.render ${event.route}`, durationMs: event.durationMs };\n case \"render.stream.shellReady\":\n return {\n kind: \"render\",\n name: `farm.render.shell ${event.route}`,\n durationMs: event.durationMs,\n };\n case \"render.stream.complete\":\n return {\n kind: \"render\",\n name: `farm.render.stream ${event.route}`,\n durationMs: event.durationMs,\n };\n case \"middleware.complete\":\n return {\n kind: \"middleware\",\n name: `farm.middleware ${event.name ?? event.route ?? \"anonymous\"}`,\n durationMs: event.durationMs,\n };\n case \"api.request.complete\":\n case \"api.error\":\n return {\n kind: \"api\",\n name: `farm.api ${event.method} ${event.route}`,\n durationMs: event.durationMs,\n };\n case \"integration.api.call.complete\":\n return {\n kind: \"integration\",\n name: `farm.integration ${event.integration}.${event.operation}`,\n durationMs: event.durationMs,\n };\n case \"storage.query.complete\":\n return {\n kind: \"storage\",\n name: `farm.storage ${event.operation}`,\n durationMs: event.durationMs,\n };\n case \"ppr.refresh.complete\":\n return {\n kind: \"ppr\",\n name: `farm.ppr.refresh ${event.route}`,\n durationMs: event.durationMs,\n };\n case \"build.complete\":\n return {\n kind: \"build\",\n name: `farm.build${event.target ? ` ${event.target}` : \"\"}`,\n durationMs: event.durationMs,\n };\n case \"plugin.hook.complete\":\n return {\n kind: \"plugin\",\n name: `farm.plugin ${event.plugin}.${event.hook}`,\n durationMs: event.durationMs,\n };\n default:\n return undefined;\n }\n}\n\nfunction toEventAttributes(event: FarmEvent): Attributes {\n const attributes: Attributes = {};\n for (const [key, value] of Object.entries(event)) {\n if (\n key === \"timestamp\" ||\n key === \"level\" ||\n key === \"error\" ||\n key === \"traceId\" ||\n key === \"spanId\" ||\n key === \"traceSampled\" ||\n value === undefined\n ) {\n continue;\n }\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n attributes[`farm.${key}`] = value;\n } else if (Array.isArray(value)) {\n if (value.every((entry) => typeof entry === \"string\")) {\n attributes[`farm.${key}`] = value as string[];\n } else if (value.every((entry) => typeof entry === \"number\")) {\n attributes[`farm.${key}`] = value as number[];\n } else if (value.every((entry) => typeof entry === \"boolean\")) {\n attributes[`farm.${key}`] = value as boolean[];\n }\n }\n }\n return attributes;\n}\n\nfunction getEventError(event: FarmEvent): unknown {\n return \"error\" in event ? event.error : undefined;\n}\n\nfunction recordSpanError(span: Span, error: unknown): void {\n const normalized = error instanceof Error ? error : new Error(String(error));\n span.recordException(normalized);\n span.setStatus({ code: SpanStatusCode.ERROR, message: normalized.message });\n}\n\nfunction setResponseStatus(span: Span, status: number): void {\n span.setAttribute(\"http.response.status_code\", status);\n if (status >= 500) {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n}\n\nfunction resolveResultStatus<T>(result: T, options: FarmRequestSpanOptions): number {\n if (result instanceof Response) return result.status;\n return options.getStatusCode?.() ?? 200;\n}\n\nfunction getSpanTraceContext(span: Span | undefined): FarmTraceContext | undefined {\n if (!span) return undefined;\n const spanContext = span.spanContext();\n if (!isSpanContextValid(spanContext)) return undefined;\n return {\n traceId: spanContext.traceId,\n spanId: spanContext.spanId,\n traceSampled: (spanContext.traceFlags & 0x01) === 0x01,\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/observability.ts","../src/tracing.ts"],"sourcesContent":["import {\n _runWithFarmRequestSpan,\n configureFarmTracing,\n getFarmTraceContext,\n normalizeFarmTracingConfig,\n recordFarmEventTrace,\n resetFarmTracing,\n runWithFarmSpan,\n type FarmRequestSpanOptions,\n type FarmResolvedTracingConfig,\n type FarmSpanOptions,\n type FarmTraceContext,\n type FarmTraceSpanKind,\n type FarmTracingConfig,\n type FarmTracingUserConfig,\n} from \"./tracing\";\n\nexport type FarmEventLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport interface FarmEventBase {\n type: string;\n timestamp: number;\n level: FarmEventLevel;\n requestId?: string;\n traceId?: string;\n spanId?: string;\n traceSampled?: boolean;\n route?: string;\n pathname?: string;\n}\n\nexport type FarmRequestEvent =\n | (FarmEventBase & { type: \"request.start\"; method: string; pathname: string })\n | (FarmEventBase & {\n type: \"request.complete\";\n method: string;\n pathname: string;\n status: number;\n durationMs: number;\n })\n | (FarmEventBase & {\n type: \"request.error\";\n method: string;\n pathname: string;\n durationMs: number;\n error: unknown;\n });\n\nexport type FarmServerEvent =\n | (FarmEventBase & {\n type: \"server.start\";\n mode: \"dev\" | \"preview\" | \"production\";\n port?: number;\n })\n | (FarmEventBase & { type: \"server.ready\"; url?: string })\n | (FarmEventBase & { type: \"server.shutdown\"; reason?: string });\n\nexport type FarmRouteEvent =\n | (FarmEventBase & { type: \"route.discovered\"; route: string; filePath: string })\n | (FarmEventBase & {\n type: \"route.matched\";\n pathname: string;\n route: string;\n params?: Record<string, string>;\n })\n | (FarmEventBase & { type: \"route.notFound\"; pathname: string })\n | (FarmEventBase & { type: \"route.redirect\"; from: string; to: string; status?: number })\n | (FarmEventBase & { type: \"route.rewrite\"; from: string; to: string });\n\nexport type FarmRenderEvent =\n | (FarmEventBase & { type: \"render.start\"; route: string; pathname?: string })\n | (FarmEventBase & {\n type: \"render.complete\";\n route: string;\n durationMs: number;\n status?: number;\n })\n | (FarmEventBase & { type: \"render.error\"; route?: string; error: unknown })\n | (FarmEventBase & { type: \"render.stream.start\"; route: string })\n | (FarmEventBase & { type: \"render.stream.shellReady\"; route: string; durationMs: number })\n | (FarmEventBase & { type: \"render.stream.complete\"; route: string; durationMs: number });\n\nexport type FarmCacheEvent =\n | (FarmEventBase & {\n type: \"cache.hit\";\n key: string;\n route?: string;\n tags?: readonly string[];\n revalidate?: number | false;\n stale?: boolean;\n })\n | (FarmEventBase & { type: \"cache.miss\"; key: string; route?: string; reason?: string })\n | (FarmEventBase & {\n type: \"cache.set\";\n key: string;\n route?: string;\n tags?: readonly string[];\n revalidate?: number | false;\n })\n | (FarmEventBase & { type: \"cache.dedupe\"; key: string })\n | (FarmEventBase & { type: \"cache.bypass\"; key?: string; route?: string; reason: string })\n | (FarmEventBase & {\n type: \"cache.stale\";\n key: string;\n route?: string;\n tags?: readonly string[];\n revalidate?: number | false;\n })\n | (FarmEventBase & { type: \"cache.revalidatePath\"; path: string; count: number })\n | (FarmEventBase & {\n type: \"cache.revalidateTag\";\n tag: string;\n profile?: unknown;\n count: number;\n })\n | (FarmEventBase & { type: \"cache.updateTag\"; tag: string; count: number })\n | (FarmEventBase & {\n type: \"cache.invalidated\";\n key?: string;\n route?: string;\n tag?: string;\n reason?: string;\n count?: number;\n })\n | (FarmEventBase & { type: \"cache.delete\"; key: string; deleted: boolean })\n | (FarmEventBase & { type: \"cache.clear\"; count: number })\n | (FarmEventBase & {\n type: \"cache.error\";\n key?: string;\n operation: \"get\" | \"set\" | \"delete\" | \"revalidate\";\n error: unknown;\n });\n\nexport type FarmPPREvent =\n | (FarmEventBase & { type: \"ppr.shell.hit\"; route: string; key: string })\n | (FarmEventBase & { type: \"ppr.shell.miss\"; route: string; key: string })\n | (FarmEventBase & {\n type: \"ppr.shell.cached\";\n route: string;\n key: string;\n revalidate?: number;\n })\n | (FarmEventBase & { type: \"ppr.shell.bypass\"; route: string; reason: string })\n | (FarmEventBase & {\n type: \"ppr.shell.invalidated\";\n route: string;\n reason?: string;\n count?: number;\n })\n | (FarmEventBase & { type: \"ppr.suspense.holeDetected\"; route: string })\n | (FarmEventBase & { type: \"ppr.refresh.start\"; route: string })\n | (FarmEventBase & { type: \"ppr.refresh.complete\"; route: string; durationMs: number })\n | (FarmEventBase & { type: \"ppr.refresh.error\"; route: string; error: unknown });\n\nexport type FarmAPIEvent =\n | (FarmEventBase & { type: \"api.request.start\"; route: string; method: string })\n | (FarmEventBase & {\n type: \"api.request.complete\";\n route: string;\n method: string;\n status: number;\n durationMs: number;\n })\n | (FarmEventBase & {\n type: \"api.validation.failed\";\n route: string;\n method: string;\n issues?: unknown;\n })\n | (FarmEventBase & {\n type: \"api.error\";\n route: string;\n method: string;\n durationMs: number;\n error: unknown;\n });\n\nexport type FarmIntegrationEvent =\n | (FarmEventBase & { type: \"integration.registered\"; name: string })\n | (FarmEventBase & { type: \"integration.config.validated\"; name: string })\n | (FarmEventBase & { type: \"integration.ready\"; name: string })\n | (FarmEventBase & { type: \"integration.disposed\"; name: string })\n | (FarmEventBase & {\n type: \"integration.api.call.start\";\n integration: string;\n operation: string;\n })\n | (FarmEventBase & {\n type: \"integration.api.call.complete\";\n integration: string;\n operation: string;\n durationMs: number;\n })\n | (FarmEventBase & {\n type: \"integration.api.call.error\";\n integration: string;\n operation: string;\n error: unknown;\n })\n | (FarmEventBase & { type: \"integration.webhook.received\"; integration: string; event?: string })\n | (FarmEventBase & { type: \"integration.webhook.verified\"; integration: string; event?: string })\n | (FarmEventBase & { type: \"integration.webhook.failed\"; integration: string; reason: string });\n\nexport type FarmMiddlewareEvent =\n | (FarmEventBase & { type: \"middleware.start\"; route?: string; name?: string })\n | (FarmEventBase & {\n type: \"middleware.complete\";\n route?: string;\n name?: string;\n durationMs: number;\n })\n | (FarmEventBase & {\n type: \"middleware.shortCircuit\";\n route?: string;\n name?: string;\n status?: number;\n })\n | (FarmEventBase & { type: \"middleware.error\"; route?: string; name?: string; error: unknown });\n\nexport type FarmStorageEvent =\n | (FarmEventBase & { type: \"storage.query.start\"; integration?: string; operation: string })\n | (FarmEventBase & {\n type: \"storage.query.complete\";\n integration?: string;\n operation: string;\n durationMs: number;\n })\n | (FarmEventBase & {\n type: \"storage.query.error\";\n integration?: string;\n operation: string;\n error: unknown;\n })\n | (FarmEventBase & { type: \"storage.schema.ready\"; integration?: string })\n | (FarmEventBase & { type: \"storage.schema.error\"; integration?: string; error: unknown });\n\nexport type FarmBuildEvent =\n | (FarmEventBase & { type: \"build.start\"; target?: string })\n | (FarmEventBase & { type: \"build.complete\"; target?: string; durationMs: number })\n | (FarmEventBase & { type: \"build.error\"; target?: string; error: unknown })\n | (FarmEventBase & { type: \"routes.generated\"; pageCount: number; apiCount?: number })\n | (FarmEventBase & { type: \"types.generated\"; filePath: string })\n | (FarmEventBase & { type: \"manifest.generated\"; routeCount: number });\n\nexport type FarmPluginEvent =\n | (FarmEventBase & { type: \"plugin.hook.start\"; plugin: string; hook: string })\n | (FarmEventBase & {\n type: \"plugin.hook.complete\";\n plugin: string;\n hook: string;\n durationMs: number;\n })\n | (FarmEventBase & { type: \"plugin.hook.error\"; plugin: string; hook: string; error: unknown });\n\nexport type FarmErrorEvent = FarmEventBase & {\n type: \"error\";\n source: string;\n error: unknown;\n route?: string;\n};\n\nexport type FarmEvent =\n | FarmRequestEvent\n | FarmServerEvent\n | FarmRouteEvent\n | FarmRenderEvent\n | FarmCacheEvent\n | FarmPPREvent\n | FarmAPIEvent\n | FarmIntegrationEvent\n | FarmMiddlewareEvent\n | FarmStorageEvent\n | FarmBuildEvent\n | FarmPluginEvent\n | FarmErrorEvent;\n\nexport type FarmEventType = FarmEvent[\"type\"];\nexport type FarmEventHandler = (event: FarmEvent) => void | Promise<void>;\n\nexport type FarmEventInput = FarmEvent extends infer T\n ? T extends FarmEvent\n ? Omit<T, \"timestamp\" | \"level\"> & Partial<Pick<T, \"timestamp\" | \"level\">>\n : never\n : never;\n\nexport type FarmObservabilityUserConfig =\n | boolean\n | {\n logs?: boolean;\n onEvent?: FarmEventHandler | readonly FarmEventHandler[];\n events?: readonly FarmEventType[];\n tracing?: FarmTracingUserConfig;\n };\n\nexport interface FarmResolvedObservabilityConfig {\n logs: boolean;\n handlers: FarmEventHandler[];\n events?: Set<FarmEventType>;\n tracing: FarmResolvedTracingConfig;\n}\n\nexport interface FarmEventSubscriptionOptions {\n /** Receive events even when they are excluded by `observability.events`. */\n unfiltered?: boolean;\n}\n\nconst runtimeHandlers = new Set<FarmEventHandler>();\nconst unfilteredRuntimeHandlers = new Set<FarmEventHandler>();\nlet observabilityState: FarmResolvedObservabilityConfig = {\n logs: false,\n handlers: [],\n tracing: normalizeFarmTracingConfig(false),\n};\n\nexport function configureFarmObservability(config: FarmObservabilityUserConfig | undefined): void {\n observabilityState = normalizeFarmObservabilityConfig(config);\n configureFarmTracing(observabilityState.tracing);\n}\n\nexport function normalizeFarmObservabilityConfig(\n config: FarmObservabilityUserConfig | undefined,\n): FarmResolvedObservabilityConfig {\n if (config === undefined || config === false) {\n return { logs: false, handlers: [], tracing: normalizeFarmTracingConfig(false) };\n }\n\n if (config === true) {\n return { logs: true, handlers: [], tracing: normalizeFarmTracingConfig(false) };\n }\n\n const handlers = config.onEvent\n ? Array.isArray(config.onEvent)\n ? [...config.onEvent]\n : [config.onEvent]\n : [];\n\n return {\n logs: config.logs ?? false,\n handlers,\n events: config.events ? new Set(config.events) : undefined,\n tracing: normalizeFarmTracingConfig(config.tracing),\n };\n}\n\nexport function onFarmEvent(\n handler: FarmEventHandler,\n options: FarmEventSubscriptionOptions = {},\n): () => void {\n const handlers = options.unfiltered ? unfilteredRuntimeHandlers : runtimeHandlers;\n handlers.add(handler);\n return () => {\n handlers.delete(handler);\n };\n}\n\nexport function resetFarmObservability(): void {\n runtimeHandlers.clear();\n unfilteredRuntimeHandlers.clear();\n observabilityState = {\n logs: false,\n handlers: [],\n tracing: normalizeFarmTracingConfig(false),\n };\n resetFarmTracing();\n}\n\nexport function emitFarmEvent(input: FarmEventInput): FarmEvent {\n const event = {\n timestamp: Date.now(),\n level: inferFarmEventLevel(input.type),\n ...input,\n } as FarmEvent;\n\n const traceContext = recordFarmEventTrace(event);\n if (traceContext) {\n event.traceId = traceContext.traceId;\n event.spanId = traceContext.spanId;\n event.traceSampled = traceContext.traceSampled;\n }\n\n notifyFarmEventHandlers(event, unfilteredRuntimeHandlers);\n\n if (!shouldEmitFarmEvent(event)) return event;\n\n if (observabilityState.logs) {\n logFarmEvent(event);\n }\n\n notifyFarmEventHandlers(event, [...observabilityState.handlers, ...runtimeHandlers]);\n\n return event;\n}\n\nfunction notifyFarmEventHandlers(event: FarmEvent, handlers: Iterable<FarmEventHandler>): void {\n for (const handler of handlers) {\n try {\n Promise.resolve(handler(event)).catch((error) => {\n console.warn(`[farm:observability] event handler failed: ${formatError(error)}`);\n });\n } catch (error) {\n console.warn(`[farm:observability] event handler failed: ${formatError(error)}`);\n }\n }\n}\n\nexport async function runWithFarmRequestSpan<T>(\n request: Request,\n handler: () => T | Promise<T>,\n options: FarmRequestSpanOptions = {},\n): Promise<T> {\n const url = new URL(request.url);\n const method = request.method || \"GET\";\n return await _runWithFarmRequestSpan(request, handler, {\n ...options,\n onStart() {\n emitFarmEvent({ type: \"request.start\", method, pathname: url.pathname });\n options.onStart?.();\n },\n onComplete(status, durationMs) {\n emitFarmEvent({\n type: \"request.complete\",\n method,\n pathname: url.pathname,\n status,\n durationMs,\n });\n options.onComplete?.(status, durationMs);\n },\n onError(error, durationMs) {\n emitFarmEvent({\n type: \"request.error\",\n method,\n pathname: url.pathname,\n durationMs,\n error,\n });\n options.onError?.(error, durationMs);\n },\n });\n}\n\nexport { configureFarmTracing, getFarmTraceContext, normalizeFarmTracingConfig, runWithFarmSpan };\nexport type {\n FarmRequestSpanOptions,\n FarmResolvedTracingConfig,\n FarmSpanOptions,\n FarmTraceContext,\n FarmTraceSpanKind,\n FarmTracingConfig,\n FarmTracingUserConfig,\n};\n\nfunction shouldEmitFarmEvent(event: FarmEvent): boolean {\n if (\n !observabilityState.logs &&\n observabilityState.handlers.length === 0 &&\n runtimeHandlers.size === 0\n ) {\n return false;\n }\n\n if (observabilityState.events && !observabilityState.events.has(event.type)) {\n return false;\n }\n\n return true;\n}\n\nfunction inferFarmEventLevel(type: FarmEventType): FarmEventLevel {\n if (type === \"error\" || type.endsWith(\".error\") || type.endsWith(\".failed\")) {\n return \"error\";\n }\n if (\n type.endsWith(\".bypass\") ||\n type.endsWith(\".invalidated\") ||\n type.endsWith(\".stale\") ||\n type.endsWith(\".notFound\")\n ) {\n return \"warn\";\n }\n if (\n type.endsWith(\".hit\") ||\n type.endsWith(\".miss\") ||\n type.endsWith(\".start\") ||\n type.endsWith(\".shellReady\")\n ) {\n return \"debug\";\n }\n return \"info\";\n}\n\nfunction logFarmEvent(event: FarmEvent): void {\n const message = `[farm:${event.level}] ${event.type}${formatFarmEventDetails(event)}`;\n switch (event.level) {\n case \"error\":\n console.error(message);\n break;\n case \"warn\":\n console.warn(message);\n break;\n default:\n console.log(message);\n break;\n }\n}\n\nfunction formatFarmEventDetails(event: FarmEvent): string {\n const details: string[] = [];\n const record = event as unknown as Record<string, unknown>;\n\n for (const key of [\n \"route\",\n \"pathname\",\n \"method\",\n \"status\",\n \"key\",\n \"tag\",\n \"path\",\n \"reason\",\n \"durationMs\",\n \"integration\",\n \"operation\",\n \"plugin\",\n \"hook\",\n \"target\",\n \"count\",\n ]) {\n const value = record[key];\n if (value !== undefined) {\n details.push(`${key}=${formatDetailValue(value)}`);\n }\n }\n\n return details.length > 0 ? ` ${details.join(\" \")}` : \"\";\n}\n\nfunction formatDetailValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import {\n context,\n createContextKey,\n isSpanContextValid,\n propagation,\n SpanKind,\n SpanStatusCode,\n trace,\n type Attributes,\n type Context,\n type Span,\n} from \"@opentelemetry/api\";\nimport type { FarmEvent } from \"./observability\";\n\nexport const FARM_TRACER_NAME = \"@farm.js/core\";\n\nexport type FarmTraceSpanKind =\n | \"request\"\n | \"render\"\n | \"middleware\"\n | \"api\"\n | \"integration\"\n | \"storage\"\n | \"ppr\"\n | \"build\"\n | \"plugin\";\n\nexport interface FarmTracingConfig {\n /** Enable Farm's OpenTelemetry spans. */\n enabled?: boolean;\n /** Span families to record. All families are enabled by default. */\n spans?: readonly FarmTraceSpanKind[];\n /** Add Farm lifecycle events to the active span. Defaults to true. */\n recordEvents?: boolean;\n /** Static attributes added to every Farm-created span. */\n attributes?: Attributes;\n /** Path prefixes that should not create request spans. */\n ignorePaths?: readonly string[];\n}\n\nexport type FarmTracingUserConfig = boolean | FarmTracingConfig;\n\nexport interface FarmResolvedTracingConfig {\n enabled: boolean;\n spans: ReadonlySet<FarmTraceSpanKind>;\n recordEvents: boolean;\n attributes: Attributes;\n ignorePaths: readonly string[];\n}\n\nexport interface FarmTraceContext {\n traceId: string;\n spanId: string;\n traceSampled: boolean;\n}\n\nexport interface FarmRequestSpanOptions {\n getStatusCode?: () => number | undefined;\n onStart?: () => void;\n onComplete?: (status: number, durationMs: number) => void;\n onError?: (error: unknown, durationMs: number) => void;\n}\n\nexport interface FarmSpanOptions {\n kind?: FarmTraceSpanKind;\n attributes?: Attributes;\n spanKind?: SpanKind;\n}\n\nconst ALL_SPAN_KINDS: readonly FarmTraceSpanKind[] = [\n \"request\",\n \"render\",\n \"middleware\",\n \"api\",\n \"integration\",\n \"storage\",\n \"ppr\",\n \"build\",\n \"plugin\",\n];\n\nconst DEFAULT_IGNORED_PATHS = [\n \"/@vite/\",\n \"/@fs/\",\n \"/@id/\",\n \"/@react-refresh\",\n \"/node_modules/\",\n \"/__vite\",\n \"/.well-known/appspecific/\",\n];\nconst FARM_REQUEST_METHOD_CONTEXT_KEY = createContextKey(\"@farm.js/core/request-method\");\n\nlet tracingState: FarmResolvedTracingConfig = normalizeFarmTracingConfig(false);\n\nexport function normalizeFarmTracingConfig(\n config: FarmTracingUserConfig | undefined,\n): FarmResolvedTracingConfig {\n if (!config) {\n return {\n enabled: false,\n spans: new Set(ALL_SPAN_KINDS),\n recordEvents: true,\n attributes: {},\n ignorePaths: DEFAULT_IGNORED_PATHS,\n };\n }\n\n if (config === true) {\n return {\n enabled: true,\n spans: new Set(ALL_SPAN_KINDS),\n recordEvents: true,\n attributes: {},\n ignorePaths: DEFAULT_IGNORED_PATHS,\n };\n }\n\n return {\n enabled: config.enabled ?? true,\n spans: new Set(config.spans ?? ALL_SPAN_KINDS),\n recordEvents: config.recordEvents ?? true,\n attributes: { ...config.attributes },\n ignorePaths: [...DEFAULT_IGNORED_PATHS, ...(config.ignorePaths ?? [])],\n };\n}\n\nexport function configureFarmTracing(\n config: FarmTracingUserConfig | FarmResolvedTracingConfig | undefined,\n): void {\n if (isResolvedFarmTracingConfig(config)) {\n tracingState = {\n ...config,\n spans: new Set(config.spans),\n attributes: { ...config.attributes },\n ignorePaths: [...config.ignorePaths],\n };\n return;\n }\n tracingState = normalizeFarmTracingConfig(config as FarmTracingUserConfig | undefined);\n}\n\nfunction isResolvedFarmTracingConfig(\n config: FarmTracingUserConfig | FarmResolvedTracingConfig | undefined,\n): config is FarmResolvedTracingConfig {\n return (\n !!config &&\n typeof config === \"object\" &&\n typeof config.enabled === \"boolean\" &&\n config.spans instanceof Set &&\n typeof config.recordEvents === \"boolean\" &&\n Array.isArray(config.ignorePaths)\n );\n}\n\nexport function getFarmTracingConfig(): FarmResolvedTracingConfig {\n return tracingState;\n}\n\nexport function resetFarmTracing(): void {\n tracingState = normalizeFarmTracingConfig(false);\n}\n\nexport function getFarmTraceContext(): FarmTraceContext | undefined {\n return getSpanTraceContext(trace.getSpan(context.active()));\n}\n\nexport async function runWithFarmSpan<T>(\n name: string,\n handler: () => T | Promise<T>,\n options: FarmSpanOptions = {},\n): Promise<T> {\n const spanFamily = options.kind;\n if (!tracingState.enabled || (spanFamily !== undefined && !tracingState.spans.has(spanFamily))) {\n return await handler();\n }\n\n const tracer = trace.getTracer(FARM_TRACER_NAME);\n return await tracer.startActiveSpan(\n name,\n {\n kind: options.spanKind ?? SpanKind.INTERNAL,\n attributes: {\n ...tracingState.attributes,\n ...options.attributes,\n },\n },\n async (span) => {\n try {\n return await handler();\n } catch (error) {\n recordSpanError(span, error);\n throw error;\n } finally {\n span.end();\n }\n },\n );\n}\n\nexport async function _runWithFarmRequestSpan<T>(\n request: Request,\n handler: () => T | Promise<T>,\n options: FarmRequestSpanOptions = {},\n): Promise<T> {\n const startedAt = Date.now();\n const url = new URL(request.url);\n const shouldTrace =\n tracingState.enabled &&\n tracingState.spans.has(\"request\") &&\n !tracingState.ignorePaths.some((prefix) => url.pathname.startsWith(prefix));\n\n if (!shouldTrace) {\n options.onStart?.();\n try {\n const result = await handler();\n options.onComplete?.(resolveResultStatus(result, options), Date.now() - startedAt);\n return result;\n } catch (error) {\n options.onError?.(error, Date.now() - startedAt);\n throw error;\n }\n }\n\n const extractedContext = propagation.extract(context.active(), request.headers, {\n keys(carrier) {\n return Array.from(carrier.keys());\n },\n get(carrier, key) {\n return carrier.get(key) ?? undefined;\n },\n });\n const requestContext = extractedContext.setValue(FARM_REQUEST_METHOD_CONTEXT_KEY, request.method);\n const tracer = trace.getTracer(FARM_TRACER_NAME);\n const attributes: Attributes = {\n ...tracingState.attributes,\n \"http.request.method\": request.method,\n \"url.path\": url.pathname,\n \"url.scheme\": url.protocol.replace(/:$/, \"\"),\n \"server.address\": url.hostname,\n };\n if (url.port) attributes[\"server.port\"] = Number(url.port);\n\n return await tracer.startActiveSpan(\n `${request.method} ${url.pathname}`,\n { kind: SpanKind.SERVER, attributes },\n requestContext,\n async (span) => {\n options.onStart?.();\n try {\n const result = await handler();\n const status = resolveResultStatus(result, options);\n setResponseStatus(span, status);\n options.onComplete?.(status, Date.now() - startedAt);\n return result;\n } catch (error) {\n recordSpanError(span, error);\n options.onError?.(error, Date.now() - startedAt);\n throw error;\n } finally {\n span.end();\n }\n },\n );\n}\n\nexport function recordFarmEventTrace(event: FarmEvent): FarmTraceContext | undefined {\n if (!tracingState.enabled) return undefined;\n\n const activeContext = context.active();\n const activeSpan = trace.getSpan(activeContext);\n const traceContext = getSpanTraceContext(activeSpan);\n if (activeSpan && traceContext) {\n if (event.type === \"route.matched\") {\n const method =\n (activeContext.getValue(FARM_REQUEST_METHOD_CONTEXT_KEY) as string | undefined) ?? \"HTTP\";\n activeSpan.updateName(`${method} ${event.route}`);\n activeSpan.setAttribute(\"http.route\", event.route);\n activeSpan.setAttribute(\"farm.route\", event.route);\n }\n\n if (tracingState.recordEvents) {\n activeSpan.addEvent(event.type, toEventAttributes(event), event.timestamp);\n }\n\n const error = event.type === \"request.error\" ? undefined : getEventError(event);\n if (error !== undefined) recordSpanError(activeSpan, error);\n }\n\n const completedTraceContext = recordCompletedEventSpan(event, activeContext);\n return traceContext ?? completedTraceContext;\n}\n\nfunction recordCompletedEventSpan(\n event: FarmEvent,\n parentContext: Context,\n): FarmTraceContext | undefined {\n const descriptor = getCompletedSpanDescriptor(event);\n if (!descriptor || !tracingState.spans.has(descriptor.kind)) return undefined;\n\n const tracer = trace.getTracer(FARM_TRACER_NAME);\n const span = tracer.startSpan(\n descriptor.name,\n {\n kind: SpanKind.INTERNAL,\n startTime: event.timestamp - descriptor.durationMs,\n attributes: {\n ...tracingState.attributes,\n ...toEventAttributes(event),\n \"farm.event.type\": event.type,\n },\n },\n parentContext,\n );\n\n const status = \"status\" in event && typeof event.status === \"number\" ? event.status : undefined;\n if (status !== undefined) setResponseStatus(span, status);\n const error = getEventError(event);\n if (error !== undefined) recordSpanError(span, error);\n const traceContext = getSpanTraceContext(span);\n span.end(event.timestamp);\n return traceContext;\n}\n\nfunction getCompletedSpanDescriptor(\n event: FarmEvent,\n): { kind: FarmTraceSpanKind; name: string; durationMs: number } | undefined {\n if (!(\"durationMs\" in event) || typeof event.durationMs !== \"number\") return undefined;\n\n switch (event.type) {\n case \"render.complete\":\n return { kind: \"render\", name: `farm.render ${event.route}`, durationMs: event.durationMs };\n case \"render.stream.shellReady\":\n return {\n kind: \"render\",\n name: `farm.render.shell ${event.route}`,\n durationMs: event.durationMs,\n };\n case \"render.stream.complete\":\n return {\n kind: \"render\",\n name: `farm.render.stream ${event.route}`,\n durationMs: event.durationMs,\n };\n case \"middleware.complete\":\n return {\n kind: \"middleware\",\n name: `farm.middleware ${event.name ?? event.route ?? \"anonymous\"}`,\n durationMs: event.durationMs,\n };\n case \"api.request.complete\":\n case \"api.error\":\n return {\n kind: \"api\",\n name: `farm.api ${event.method} ${event.route}`,\n durationMs: event.durationMs,\n };\n case \"integration.api.call.complete\":\n return {\n kind: \"integration\",\n name: `farm.integration ${event.integration}.${event.operation}`,\n durationMs: event.durationMs,\n };\n case \"storage.query.complete\":\n return {\n kind: \"storage\",\n name: `farm.storage ${event.operation}`,\n durationMs: event.durationMs,\n };\n case \"ppr.refresh.complete\":\n return {\n kind: \"ppr\",\n name: `farm.ppr.refresh ${event.route}`,\n durationMs: event.durationMs,\n };\n case \"build.complete\":\n return {\n kind: \"build\",\n name: `farm.build${event.target ? ` ${event.target}` : \"\"}`,\n durationMs: event.durationMs,\n };\n case \"plugin.hook.complete\":\n return {\n kind: \"plugin\",\n name: `farm.plugin ${event.plugin}.${event.hook}`,\n durationMs: event.durationMs,\n };\n default:\n return undefined;\n }\n}\n\nfunction toEventAttributes(event: FarmEvent): Attributes {\n const attributes: Attributes = {};\n for (const [key, value] of Object.entries(event)) {\n if (\n key === \"timestamp\" ||\n key === \"level\" ||\n key === \"error\" ||\n key === \"traceId\" ||\n key === \"spanId\" ||\n key === \"traceSampled\" ||\n value === undefined\n ) {\n continue;\n }\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n attributes[`farm.${key}`] = value;\n } else if (Array.isArray(value)) {\n if (value.every((entry) => typeof entry === \"string\")) {\n attributes[`farm.${key}`] = value as string[];\n } else if (value.every((entry) => typeof entry === \"number\")) {\n attributes[`farm.${key}`] = value as number[];\n } else if (value.every((entry) => typeof entry === \"boolean\")) {\n attributes[`farm.${key}`] = value as boolean[];\n }\n }\n }\n return attributes;\n}\n\nfunction getEventError(event: FarmEvent): unknown {\n return \"error\" in event ? event.error : undefined;\n}\n\nfunction recordSpanError(span: Span, error: unknown): void {\n const normalized = error instanceof Error ? error : new Error(String(error));\n span.recordException(normalized);\n span.setStatus({ code: SpanStatusCode.ERROR, message: normalized.message });\n}\n\nfunction setResponseStatus(span: Span, status: number): void {\n span.setAttribute(\"http.response.status_code\", status);\n if (status >= 500) {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n}\n\nfunction resolveResultStatus<T>(result: T, options: FarmRequestSpanOptions): number {\n if (result instanceof Response) return result.status;\n return options.getStatusCode?.() ?? 200;\n}\n\nfunction getSpanTraceContext(span: Span | undefined): FarmTraceContext | undefined {\n if (!span) return undefined;\n const spanContext = span.spanContext();\n if (!isSpanContextValid(spanContext)) return undefined;\n return {\n traceId: spanContext.traceId,\n spanId: spanContext.spanId,\n traceSampled: (spanContext.traceFlags & 0x01) === 0x01,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,iBAWO;AAGA,IAAM,mBAAmB;AAuDhC,IAAM,iBAA+C;AAAA,EACnD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,wBAAwB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,sCAAkC,6BAAiB,8BAA8B;AAEvF,IAAI,eAA0C,2BAA2B,KAAK;AAEvE,SAAS,2BACd,QAC2B;AAC3B,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,IAAI,IAAI,cAAc;AAAA,MAC7B,cAAc;AAAA,MACd,YAAY,CAAC;AAAA,MACb,aAAa;AAAA,IACf;AAAA,EACF;AAEA,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,IAAI,IAAI,cAAc;AAAA,MAC7B,cAAc;AAAA,MACd,YAAY,CAAC;AAAA,MACb,aAAa;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS,OAAO,WAAW;AAAA,IAC3B,OAAO,IAAI,IAAI,OAAO,SAAS,cAAc;AAAA,IAC7C,cAAc,OAAO,gBAAgB;AAAA,IACrC,YAAY,EAAE,GAAG,OAAO,WAAW;AAAA,IACnC,aAAa,CAAC,GAAG,uBAAuB,GAAI,OAAO,eAAe,CAAC,CAAE;AAAA,EACvE;AACF;AA9BgB;AAgCT,SAAS,qBACd,QACM;AACN,MAAI,4BAA4B,MAAM,GAAG;AACvC,mBAAe;AAAA,MACb,GAAG;AAAA,MACH,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,MAC3B,YAAY,EAAE,GAAG,OAAO,WAAW;AAAA,MACnC,aAAa,CAAC,GAAG,OAAO,WAAW;AAAA,IACrC;AACA;AAAA,EACF;AACA,iBAAe,2BAA2B,MAA2C;AACvF;AAbgB;AAehB,SAAS,4BACP,QACqC;AACrC,SACE,CAAC,CAAC,UACF,OAAO,WAAW,YAClB,OAAO,OAAO,YAAY,aAC1B,OAAO,iBAAiB,OACxB,OAAO,OAAO,iBAAiB,aAC/B,MAAM,QAAQ,OAAO,WAAW;AAEpC;AAXS;AAiBF,SAAS,mBAAyB;AACvC,iBAAe,2BAA2B,KAAK;AACjD;AAFgB;AAIT,SAAS,sBAAoD;AAClE,SAAO,oBAAoB,iBAAM,QAAQ,mBAAQ,OAAO,CAAC,CAAC;AAC5D;AAFgB;AAIhB,eAAsB,gBACpB,MACA,SACA,UAA2B,CAAC,GAChB;AACZ,QAAM,aAAa,QAAQ;AAC3B,MAAI,CAAC,aAAa,WAAY,eAAe,UAAa,CAAC,aAAa,MAAM,IAAI,UAAU,GAAI;AAC9F,WAAO,MAAM,QAAQ;AAAA,EACvB;AAEA,QAAM,SAAS,iBAAM,UAAU,gBAAgB;AAC/C,SAAO,MAAM,OAAO;AAAA,IAClB;AAAA,IACA;AAAA,MACE,MAAM,QAAQ,YAAY,oBAAS;AAAA,MACnC,YAAY;AAAA,QACV,GAAG,aAAa;AAAA,QAChB,GAAG,QAAQ;AAAA,MACb;AAAA,IACF;AAAA,IACA,OAAO,SAAS;AACd,UAAI;AACF,eAAO,MAAM,QAAQ;AAAA,MACvB,SAAS,OAAO;AACd,wBAAgB,MAAM,KAAK;AAC3B,cAAM;AAAA,MACR,UAAE;AACA,aAAK,IAAI;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;AA/BsB;AAiCtB,eAAsB,wBACpB,SACA,SACA,UAAkC,CAAC,GACvB;AACZ,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAC/B,QAAM,cACJ,aAAa,WACb,aAAa,MAAM,IAAI,SAAS,KAChC,CAAC,aAAa,YAAY,KAAK,CAAC,WAAW,IAAI,SAAS,WAAW,MAAM,CAAC;AAE5E,MAAI,CAAC,aAAa;AAChB,YAAQ,UAAU;AAClB,QAAI;AACF,YAAM,SAAS,MAAM,QAAQ;AAC7B,cAAQ,aAAa,oBAAoB,QAAQ,OAAO,GAAG,KAAK,IAAI,IAAI,SAAS;AACjF,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,UAAU,OAAO,KAAK,IAAI,IAAI,SAAS;AAC/C,YAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,mBAAmB,uBAAY,QAAQ,mBAAQ,OAAO,GAAG,QAAQ,SAAS;AAAA,IAC9E,KAAK,SAAS;AACZ,aAAO,MAAM,KAAK,QAAQ,KAAK,CAAC;AAAA,IAClC;AAAA,IACA,IAAI,SAAS,KAAK;AAChB,aAAO,QAAQ,IAAI,GAAG,KAAK;AAAA,IAC7B;AAAA,EACF,CAAC;AACD,QAAM,iBAAiB,iBAAiB,SAAS,iCAAiC,QAAQ,MAAM;AAChG,QAAM,SAAS,iBAAM,UAAU,gBAAgB;AAC/C,QAAM,aAAyB;AAAA,IAC7B,GAAG,aAAa;AAAA,IAChB,uBAAuB,QAAQ;AAAA,IAC/B,YAAY,IAAI;AAAA,IAChB,cAAc,IAAI,SAAS,QAAQ,MAAM,EAAE;AAAA,IAC3C,kBAAkB,IAAI;AAAA,EACxB;AACA,MAAI,IAAI,KAAM,YAAW,aAAa,IAAI,OAAO,IAAI,IAAI;AAEzD,SAAO,MAAM,OAAO;AAAA,IAClB,GAAG,QAAQ,MAAM,IAAI,IAAI,QAAQ;AAAA,IACjC,EAAE,MAAM,oBAAS,QAAQ,WAAW;AAAA,IACpC;AAAA,IACA,OAAO,SAAS;AACd,cAAQ,UAAU;AAClB,UAAI;AACF,cAAM,SAAS,MAAM,QAAQ;AAC7B,cAAM,SAAS,oBAAoB,QAAQ,OAAO;AAClD,0BAAkB,MAAM,MAAM;AAC9B,gBAAQ,aAAa,QAAQ,KAAK,IAAI,IAAI,SAAS;AACnD,eAAO;AAAA,MACT,SAAS,OAAO;AACd,wBAAgB,MAAM,KAAK;AAC3B,gBAAQ,UAAU,OAAO,KAAK,IAAI,IAAI,SAAS;AAC/C,cAAM;AAAA,MACR,UAAE;AACA,aAAK,IAAI;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;AAhEsB;AAkEf,SAAS,qBAAqB,OAAgD;AACnF,MAAI,CAAC,aAAa,QAAS,QAAO;AAElC,QAAM,gBAAgB,mBAAQ,OAAO;AACrC,QAAM,aAAa,iBAAM,QAAQ,aAAa;AAC9C,QAAM,eAAe,oBAAoB,UAAU;AACnD,MAAI,cAAc,cAAc;AAC9B,QAAI,MAAM,SAAS,iBAAiB;AAClC,YAAM,SACH,cAAc,SAAS,+BAA+B,KAA4B;AACrF,iBAAW,WAAW,GAAG,MAAM,IAAI,MAAM,KAAK,EAAE;AAChD,iBAAW,aAAa,cAAc,MAAM,KAAK;AACjD,iBAAW,aAAa,cAAc,MAAM,KAAK;AAAA,IACnD;AAEA,QAAI,aAAa,cAAc;AAC7B,iBAAW,SAAS,MAAM,MAAM,kBAAkB,KAAK,GAAG,MAAM,SAAS;AAAA,IAC3E;AAEA,UAAM,QAAQ,MAAM,SAAS,kBAAkB,SAAY,cAAc,KAAK;AAC9E,QAAI,UAAU,OAAW,iBAAgB,YAAY,KAAK;AAAA,EAC5D;AAEA,QAAM,wBAAwB,yBAAyB,OAAO,aAAa;AAC3E,SAAO,gBAAgB;AACzB;AAzBgB;AA2BhB,SAAS,yBACP,OACA,eAC8B;AAC9B,QAAM,aAAa,2BAA2B,KAAK;AACnD,MAAI,CAAC,cAAc,CAAC,aAAa,MAAM,IAAI,WAAW,IAAI,EAAG,QAAO;AAEpE,QAAM,SAAS,iBAAM,UAAU,gBAAgB;AAC/C,QAAM,OAAO,OAAO;AAAA,IAClB,WAAW;AAAA,IACX;AAAA,MACE,MAAM,oBAAS;AAAA,MACf,WAAW,MAAM,YAAY,WAAW;AAAA,MACxC,YAAY;AAAA,QACV,GAAG,aAAa;AAAA,QAChB,GAAG,kBAAkB,KAAK;AAAA,QAC1B,mBAAmB,MAAM;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,EACF;AAEA,QAAM,SAAS,YAAY,SAAS,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AACtF,MAAI,WAAW,OAAW,mBAAkB,MAAM,MAAM;AACxD,QAAM,QAAQ,cAAc,KAAK;AACjC,MAAI,UAAU,OAAW,iBAAgB,MAAM,KAAK;AACpD,QAAM,eAAe,oBAAoB,IAAI;AAC7C,OAAK,IAAI,MAAM,SAAS;AACxB,SAAO;AACT;AA7BS;AA+BT,SAAS,2BACP,OAC2E;AAC3E,MAAI,EAAE,gBAAgB,UAAU,OAAO,MAAM,eAAe,SAAU,QAAO;AAE7E,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO,EAAE,MAAM,UAAU,MAAM,eAAe,MAAM,KAAK,IAAI,YAAY,MAAM,WAAW;AAAA,IAC5F,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,qBAAqB,MAAM,KAAK;AAAA,QACtC,YAAY,MAAM;AAAA,MACpB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,sBAAsB,MAAM,KAAK;AAAA,QACvC,YAAY,MAAM;AAAA,MACpB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,mBAAmB,MAAM,QAAQ,MAAM,SAAS,WAAW;AAAA,QACjE,YAAY,MAAM;AAAA,MACpB;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,YAAY,MAAM,MAAM,IAAI,MAAM,KAAK;AAAA,QAC7C,YAAY,MAAM;AAAA,MACpB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,oBAAoB,MAAM,WAAW,IAAI,MAAM,SAAS;AAAA,QAC9D,YAAY,MAAM;AAAA,MACpB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,gBAAgB,MAAM,SAAS;AAAA,QACrC,YAAY,MAAM;AAAA,MACpB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,oBAAoB,MAAM,KAAK;AAAA,QACrC,YAAY,MAAM;AAAA,MACpB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,aAAa,MAAM,SAAS,IAAI,MAAM,MAAM,KAAK,EAAE;AAAA,QACzD,YAAY,MAAM;AAAA,MACpB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,eAAe,MAAM,MAAM,IAAI,MAAM,IAAI;AAAA,QAC/C,YAAY,MAAM;AAAA,MACpB;AAAA,IACF;AACE,aAAO;AAAA,EACX;AACF;AAlES;AAoET,SAAS,kBAAkB,OAA8B;AACvD,QAAM,aAAyB,CAAC;AAChC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QACE,QAAQ,eACR,QAAQ,WACR,QAAQ,WACR,QAAQ,aACR,QAAQ,YACR,QAAQ,kBACR,UAAU,QACV;AACA;AAAA,IACF;AACA,QAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW;AACxF,iBAAW,QAAQ,GAAG,EAAE,IAAI;AAAA,IAC9B,WAAW,MAAM,QAAQ,KAAK,GAAG;AAC/B,UAAI,MAAM,MAAM,CAAC,UAAU,OAAO,UAAU,QAAQ,GAAG;AACrD,mBAAW,QAAQ,GAAG,EAAE,IAAI;AAAA,MAC9B,WAAW,MAAM,MAAM,CAAC,UAAU,OAAO,UAAU,QAAQ,GAAG;AAC5D,mBAAW,QAAQ,GAAG,EAAE,IAAI;AAAA,MAC9B,WAAW,MAAM,MAAM,CAAC,UAAU,OAAO,UAAU,SAAS,GAAG;AAC7D,mBAAW,QAAQ,GAAG,EAAE,IAAI;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AA3BS;AA6BT,SAAS,cAAc,OAA2B;AAChD,SAAO,WAAW,QAAQ,MAAM,QAAQ;AAC1C;AAFS;AAIT,SAAS,gBAAgB,MAAY,OAAsB;AACzD,QAAM,aAAa,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAC3E,OAAK,gBAAgB,UAAU;AAC/B,OAAK,UAAU,EAAE,MAAM,0BAAe,OAAO,SAAS,WAAW,QAAQ,CAAC;AAC5E;AAJS;AAMT,SAAS,kBAAkB,MAAY,QAAsB;AAC3D,OAAK,aAAa,6BAA6B,MAAM;AACrD,MAAI,UAAU,KAAK;AACjB,SAAK,UAAU,EAAE,MAAM,0BAAe,MAAM,CAAC;AAAA,EAC/C;AACF;AALS;AAOT,SAAS,oBAAuB,QAAW,SAAyC;AAClF,MAAI,kBAAkB,SAAU,QAAO,OAAO;AAC9C,SAAO,QAAQ,gBAAgB,KAAK;AACtC;AAHS;AAKT,SAAS,oBAAoB,MAAsD;AACjF,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,cAAc,KAAK,YAAY;AACrC,MAAI,KAAC,+BAAmB,WAAW,EAAG,QAAO;AAC7C,SAAO;AAAA,IACL,SAAS,YAAY;AAAA,IACrB,QAAQ,YAAY;AAAA,IACpB,eAAe,YAAY,aAAa,OAAU;AAAA,EACpD;AACF;AATS;;;ADxIT,IAAM,kBAAkB,oBAAI,IAAsB;AAClD,IAAM,4BAA4B,oBAAI,IAAsB;AAC5D,IAAI,qBAAsD;AAAA,EACxD,MAAM;AAAA,EACN,UAAU,CAAC;AAAA,EACX,SAAS,2BAA2B,KAAK;AAC3C;AAEO,SAAS,2BAA2B,QAAuD;AAChG,uBAAqB,iCAAiC,MAAM;AAC5D,uBAAqB,mBAAmB,OAAO;AACjD;AAHgB;AAKT,SAAS,iCACd,QACiC;AACjC,MAAI,WAAW,UAAa,WAAW,OAAO;AAC5C,WAAO,EAAE,MAAM,OAAO,UAAU,CAAC,GAAG,SAAS,2BAA2B,KAAK,EAAE;AAAA,EACjF;AAEA,MAAI,WAAW,MAAM;AACnB,WAAO,EAAE,MAAM,MAAM,UAAU,CAAC,GAAG,SAAS,2BAA2B,KAAK,EAAE;AAAA,EAChF;AAEA,QAAM,WAAW,OAAO,UACpB,MAAM,QAAQ,OAAO,OAAO,IAC1B,CAAC,GAAG,OAAO,OAAO,IAClB,CAAC,OAAO,OAAO,IACjB,CAAC;AAEL,SAAO;AAAA,IACL,MAAM,OAAO,QAAQ;AAAA,IACrB;AAAA,IACA,QAAQ,OAAO,SAAS,IAAI,IAAI,OAAO,MAAM,IAAI;AAAA,IACjD,SAAS,2BAA2B,OAAO,OAAO;AAAA,EACpD;AACF;AAvBgB;AAyBT,SAAS,YACd,SACA,UAAwC,CAAC,GAC7B;AACZ,QAAM,WAAW,QAAQ,aAAa,4BAA4B;AAClE,WAAS,IAAI,OAAO;AACpB,SAAO,MAAM;AACX,aAAS,OAAO,OAAO;AAAA,EACzB;AACF;AATgB;AAWT,SAAS,yBAA+B;AAC7C,kBAAgB,MAAM;AACtB,4BAA0B,MAAM;AAChC,uBAAqB;AAAA,IACnB,MAAM;AAAA,IACN,UAAU,CAAC;AAAA,IACX,SAAS,2BAA2B,KAAK;AAAA,EAC3C;AACA,mBAAiB;AACnB;AATgB;AAWT,SAAS,cAAc,OAAkC;AAC9D,QAAM,QAAQ;AAAA,IACZ,WAAW,KAAK,IAAI;AAAA,IACpB,OAAO,oBAAoB,MAAM,IAAI;AAAA,IACrC,GAAG;AAAA,EACL;AAEA,QAAM,eAAe,qBAAqB,KAAK;AAC/C,MAAI,cAAc;AAChB,UAAM,UAAU,aAAa;AAC7B,UAAM,SAAS,aAAa;AAC5B,UAAM,eAAe,aAAa;AAAA,EACpC;AAEA,0BAAwB,OAAO,yBAAyB;AAExD,MAAI,CAAC,oBAAoB,KAAK,EAAG,QAAO;AAExC,MAAI,mBAAmB,MAAM;AAC3B,iBAAa,KAAK;AAAA,EACpB;AAEA,0BAAwB,OAAO,CAAC,GAAG,mBAAmB,UAAU,GAAG,eAAe,CAAC;AAEnF,SAAO;AACT;AAzBgB;AA2BhB,SAAS,wBAAwB,OAAkB,UAA4C;AAC7F,aAAW,WAAW,UAAU;AAC9B,QAAI;AACF,cAAQ,QAAQ,QAAQ,KAAK,CAAC,EAAE,MAAM,CAAC,UAAU;AAC/C,gBAAQ,KAAK,8CAA8C,YAAY,KAAK,CAAC,EAAE;AAAA,MACjF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,KAAK,8CAA8C,YAAY,KAAK,CAAC,EAAE;AAAA,IACjF;AAAA,EACF;AACF;AAVS;AAYT,eAAsB,uBACpB,SACA,SACA,UAAkC,CAAC,GACvB;AACZ,QAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAC/B,QAAM,SAAS,QAAQ,UAAU;AACjC,SAAO,MAAM,wBAAwB,SAAS,SAAS;AAAA,IACrD,GAAG;AAAA,IACH,UAAU;AACR,oBAAc,EAAE,MAAM,iBAAiB,QAAQ,UAAU,IAAI,SAAS,CAAC;AACvE,cAAQ,UAAU;AAAA,IACpB;AAAA,IACA,WAAW,QAAQ,YAAY;AAC7B,oBAAc;AAAA,QACZ,MAAM;AAAA,QACN;AAAA,QACA,UAAU,IAAI;AAAA,QACd;AAAA,QACA;AAAA,MACF,CAAC;AACD,cAAQ,aAAa,QAAQ,UAAU;AAAA,IACzC;AAAA,IACA,QAAQ,OAAO,YAAY;AACzB,oBAAc;AAAA,QACZ,MAAM;AAAA,QACN;AAAA,QACA,UAAU,IAAI;AAAA,QACd;AAAA,QACA;AAAA,MACF,CAAC;AACD,cAAQ,UAAU,OAAO,UAAU;AAAA,IACrC;AAAA,EACF,CAAC;AACH;AAlCsB;AA+CtB,SAAS,oBAAoB,OAA2B;AACtD,MACE,CAAC,mBAAmB,QACpB,mBAAmB,SAAS,WAAW,KACvC,gBAAgB,SAAS,GACzB;AACA,WAAO;AAAA,EACT;AAEA,MAAI,mBAAmB,UAAU,CAAC,mBAAmB,OAAO,IAAI,MAAM,IAAI,GAAG;AAC3E,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAdS;AAgBT,SAAS,oBAAoB,MAAqC;AAChE,MAAI,SAAS,WAAW,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,SAAS,GAAG;AAC3E,WAAO;AAAA,EACT;AACA,MACE,KAAK,SAAS,SAAS,KACvB,KAAK,SAAS,cAAc,KAC5B,KAAK,SAAS,QAAQ,KACtB,KAAK,SAAS,WAAW,GACzB;AACA,WAAO;AAAA,EACT;AACA,MACE,KAAK,SAAS,MAAM,KACpB,KAAK,SAAS,OAAO,KACrB,KAAK,SAAS,QAAQ,KACtB,KAAK,SAAS,aAAa,GAC3B;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AArBS;AAuBT,SAAS,aAAa,OAAwB;AAC5C,QAAM,UAAU,SAAS,MAAM,KAAK,KAAK,MAAM,IAAI,GAAG,uBAAuB,KAAK,CAAC;AACnF,UAAQ,MAAM,OAAO;AAAA,IACnB,KAAK;AACH,cAAQ,MAAM,OAAO;AACrB;AAAA,IACF,KAAK;AACH,cAAQ,KAAK,OAAO;AACpB;AAAA,IACF;AACE,cAAQ,IAAI,OAAO;AACnB;AAAA,EACJ;AACF;AAbS;AAeT,SAAS,uBAAuB,OAA0B;AACxD,QAAM,UAAoB,CAAC;AAC3B,QAAM,SAAS;AAEf,aAAW,OAAO;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAG;AACD,UAAM,QAAQ,OAAO,GAAG;AACxB,QAAI,UAAU,QAAW;AACvB,cAAQ,KAAK,GAAG,GAAG,IAAI,kBAAkB,KAAK,CAAC,EAAE;AAAA,IACnD;AAAA,EACF;AAEA,SAAO,QAAQ,SAAS,IAAI,IAAI,QAAQ,KAAK,GAAG,CAAC,KAAK;AACxD;AA5BS;AA8BT,SAAS,kBAAkB,OAAwB;AACjD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW;AAC3D,WAAO,OAAO,KAAK;AAAA,EACrB;AACA,MAAI;AACF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAZS;AAcT,SAAS,YAAY,OAAwB;AAC3C,SAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;AAFS;","names":[]}
@@ -393,11 +393,15 @@ interface FarmResolvedObservabilityConfig {
393
393
  events?: Set<FarmEventType>;
394
394
  tracing: FarmResolvedTracingConfig;
395
395
  }
396
+ interface FarmEventSubscriptionOptions {
397
+ /** Receive events even when they are excluded by `observability.events`. */
398
+ unfiltered?: boolean;
399
+ }
396
400
  declare function configureFarmObservability(config: FarmObservabilityUserConfig | undefined): void;
397
401
  declare function normalizeFarmObservabilityConfig(config: FarmObservabilityUserConfig | undefined): FarmResolvedObservabilityConfig;
398
- declare function onFarmEvent(handler: FarmEventHandler): () => void;
402
+ declare function onFarmEvent(handler: FarmEventHandler, options?: FarmEventSubscriptionOptions): () => void;
399
403
  declare function resetFarmObservability(): void;
400
404
  declare function emitFarmEvent(input: FarmEventInput): FarmEvent;
401
405
  declare function runWithFarmRequestSpan<T>(request: Request, handler: () => T | Promise<T>, options?: FarmRequestSpanOptions): Promise<T>;
402
406
 
403
- export { type FarmAPIEvent, type FarmBuildEvent, type FarmCacheEvent, type FarmErrorEvent, type FarmEvent, type FarmEventBase, type FarmEventHandler, type FarmEventInput, type FarmEventLevel, type FarmEventType, type FarmIntegrationEvent, type FarmMiddlewareEvent, type FarmObservabilityUserConfig, type FarmPPREvent, type FarmPluginEvent, type FarmRenderEvent, type FarmRequestEvent, type FarmRequestSpanOptions, type FarmResolvedObservabilityConfig, type FarmResolvedTracingConfig, type FarmRouteEvent, type FarmServerEvent, type FarmSpanOptions, type FarmStorageEvent, type FarmTraceContext, type FarmTraceSpanKind, type FarmTracingConfig, type FarmTracingUserConfig, configureFarmObservability, configureFarmTracing, emitFarmEvent, getFarmTraceContext, normalizeFarmObservabilityConfig, normalizeFarmTracingConfig, onFarmEvent, resetFarmObservability, runWithFarmRequestSpan, runWithFarmSpan };
407
+ export { type FarmAPIEvent, type FarmBuildEvent, type FarmCacheEvent, type FarmErrorEvent, type FarmEvent, type FarmEventBase, type FarmEventHandler, type FarmEventInput, type FarmEventLevel, type FarmEventSubscriptionOptions, type FarmEventType, type FarmIntegrationEvent, type FarmMiddlewareEvent, type FarmObservabilityUserConfig, type FarmPPREvent, type FarmPluginEvent, type FarmRenderEvent, type FarmRequestEvent, type FarmRequestSpanOptions, type FarmResolvedObservabilityConfig, type FarmResolvedTracingConfig, type FarmRouteEvent, type FarmServerEvent, type FarmSpanOptions, type FarmStorageEvent, type FarmTraceContext, type FarmTraceSpanKind, type FarmTracingConfig, type FarmTracingUserConfig, configureFarmObservability, configureFarmTracing, emitFarmEvent, getFarmTraceContext, normalizeFarmObservabilityConfig, normalizeFarmTracingConfig, onFarmEvent, resetFarmObservability, runWithFarmRequestSpan, runWithFarmSpan };
@@ -393,11 +393,15 @@ interface FarmResolvedObservabilityConfig {
393
393
  events?: Set<FarmEventType>;
394
394
  tracing: FarmResolvedTracingConfig;
395
395
  }
396
+ interface FarmEventSubscriptionOptions {
397
+ /** Receive events even when they are excluded by `observability.events`. */
398
+ unfiltered?: boolean;
399
+ }
396
400
  declare function configureFarmObservability(config: FarmObservabilityUserConfig | undefined): void;
397
401
  declare function normalizeFarmObservabilityConfig(config: FarmObservabilityUserConfig | undefined): FarmResolvedObservabilityConfig;
398
- declare function onFarmEvent(handler: FarmEventHandler): () => void;
402
+ declare function onFarmEvent(handler: FarmEventHandler, options?: FarmEventSubscriptionOptions): () => void;
399
403
  declare function resetFarmObservability(): void;
400
404
  declare function emitFarmEvent(input: FarmEventInput): FarmEvent;
401
405
  declare function runWithFarmRequestSpan<T>(request: Request, handler: () => T | Promise<T>, options?: FarmRequestSpanOptions): Promise<T>;
402
406
 
403
- export { type FarmAPIEvent, type FarmBuildEvent, type FarmCacheEvent, type FarmErrorEvent, type FarmEvent, type FarmEventBase, type FarmEventHandler, type FarmEventInput, type FarmEventLevel, type FarmEventType, type FarmIntegrationEvent, type FarmMiddlewareEvent, type FarmObservabilityUserConfig, type FarmPPREvent, type FarmPluginEvent, type FarmRenderEvent, type FarmRequestEvent, type FarmRequestSpanOptions, type FarmResolvedObservabilityConfig, type FarmResolvedTracingConfig, type FarmRouteEvent, type FarmServerEvent, type FarmSpanOptions, type FarmStorageEvent, type FarmTraceContext, type FarmTraceSpanKind, type FarmTracingConfig, type FarmTracingUserConfig, configureFarmObservability, configureFarmTracing, emitFarmEvent, getFarmTraceContext, normalizeFarmObservabilityConfig, normalizeFarmTracingConfig, onFarmEvent, resetFarmObservability, runWithFarmRequestSpan, runWithFarmSpan };
407
+ export { type FarmAPIEvent, type FarmBuildEvent, type FarmCacheEvent, type FarmErrorEvent, type FarmEvent, type FarmEventBase, type FarmEventHandler, type FarmEventInput, type FarmEventLevel, type FarmEventSubscriptionOptions, type FarmEventType, type FarmIntegrationEvent, type FarmMiddlewareEvent, type FarmObservabilityUserConfig, type FarmPPREvent, type FarmPluginEvent, type FarmRenderEvent, type FarmRequestEvent, type FarmRequestSpanOptions, type FarmResolvedObservabilityConfig, type FarmResolvedTracingConfig, type FarmRouteEvent, type FarmServerEvent, type FarmSpanOptions, type FarmStorageEvent, type FarmTraceContext, type FarmTraceSpanKind, type FarmTracingConfig, type FarmTracingUserConfig, configureFarmObservability, configureFarmTracing, emitFarmEvent, getFarmTraceContext, normalizeFarmObservabilityConfig, normalizeFarmTracingConfig, onFarmEvent, resetFarmObservability, runWithFarmRequestSpan, runWithFarmSpan };
@@ -9,7 +9,7 @@ import {
9
9
  resetFarmObservability,
10
10
  runWithFarmRequestSpan,
11
11
  runWithFarmSpan
12
- } from "./chunk-7ZMKVETU.mjs";
12
+ } from "./chunk-ZRBCBOEX.mjs";
13
13
  import "./chunk-CGILA3WO.mjs";
14
14
  export {
15
15
  configureFarmObservability,
package/dist/plugin.cjs CHANGED
@@ -2535,13 +2535,16 @@ function emitFarmEvent(input) {
2535
2535
  event.spanId = traceContext.spanId;
2536
2536
  event.traceSampled = traceContext.traceSampled;
2537
2537
  }
2538
- if (!shouldEmitFarmEvent(event)) {
2539
- return event;
2540
- }
2538
+ notifyFarmEventHandlers(event, unfilteredRuntimeHandlers);
2539
+ if (!shouldEmitFarmEvent(event)) return event;
2541
2540
  if (observabilityState.logs) {
2542
2541
  logFarmEvent(event);
2543
2542
  }
2544
- for (const handler of [...observabilityState.handlers, ...runtimeHandlers]) {
2543
+ notifyFarmEventHandlers(event, [...observabilityState.handlers, ...runtimeHandlers]);
2544
+ return event;
2545
+ }
2546
+ function notifyFarmEventHandlers(event, handlers) {
2547
+ for (const handler of handlers) {
2545
2548
  try {
2546
2549
  Promise.resolve(handler(event)).catch((error) => {
2547
2550
  console.warn(`[farm:observability] event handler failed: ${formatError(error)}`);
@@ -2550,7 +2553,6 @@ function emitFarmEvent(input) {
2550
2553
  console.warn(`[farm:observability] event handler failed: ${formatError(error)}`);
2551
2554
  }
2552
2555
  }
2553
- return event;
2554
2556
  }
2555
2557
  async function runWithFarmRequestSpan(request, handler, options = {}) {
2556
2558
  const url = new URL(request.url);
@@ -2661,12 +2663,13 @@ function formatDetailValue(value) {
2661
2663
  function formatError(error) {
2662
2664
  return error instanceof Error ? error.message : String(error);
2663
2665
  }
2664
- var runtimeHandlers, observabilityState;
2666
+ var runtimeHandlers, unfilteredRuntimeHandlers, observabilityState;
2665
2667
  var init_observability = __esm({
2666
2668
  "src/observability.ts"() {
2667
2669
  "use strict";
2668
2670
  init_tracing();
2669
2671
  runtimeHandlers = /* @__PURE__ */ new Set();
2672
+ unfilteredRuntimeHandlers = /* @__PURE__ */ new Set();
2670
2673
  observabilityState = {
2671
2674
  logs: false,
2672
2675
  handlers: [],
@@ -2675,6 +2678,7 @@ var init_observability = __esm({
2675
2678
  __name(configureFarmObservability, "configureFarmObservability");
2676
2679
  __name(normalizeFarmObservabilityConfig, "normalizeFarmObservabilityConfig");
2677
2680
  __name(emitFarmEvent, "emitFarmEvent");
2681
+ __name(notifyFarmEventHandlers, "notifyFarmEventHandlers");
2678
2682
  __name(runWithFarmRequestSpan, "runWithFarmRequestSpan");
2679
2683
  __name(shouldEmitFarmEvent, "shouldEmitFarmEvent");
2680
2684
  __name(inferFarmEventLevel, "inferFarmEventLevel");
@@ -19190,7 +19194,7 @@ _setFarmThemeServerSnapshotResolver(() => {
19190
19194
  });
19191
19195
 
19192
19196
  // package.json
19193
- var version = "0.1.0-beta.67";
19197
+ var version = "0.1.0-beta.68";
19194
19198
 
19195
19199
  // src/version.ts
19196
19200
  var FARM_VERSION = version;