@blyp/core 0.1.2 → 0.1.21

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 (124) hide show
  1. package/README.md +56 -3
  2. package/dist/astro.js +4602 -0
  3. package/dist/astro.js.map +1 -0
  4. package/dist/astro.mjs +4574 -0
  5. package/dist/astro.mjs.map +1 -0
  6. package/dist/client.js +7 -0
  7. package/dist/client.js.map +1 -1
  8. package/dist/client.mjs +7 -0
  9. package/dist/client.mjs.map +1 -1
  10. package/dist/connectors/betterstack.js +24 -0
  11. package/dist/connectors/betterstack.js.map +1 -1
  12. package/dist/connectors/betterstack.mjs +24 -0
  13. package/dist/connectors/betterstack.mjs.map +1 -1
  14. package/dist/connectors/databuddy/index.d.ts +7 -0
  15. package/dist/connectors/databuddy/sender.d.ts +5 -0
  16. package/dist/connectors/databuddy.js +1456 -0
  17. package/dist/connectors/databuddy.js.map +1 -0
  18. package/dist/connectors/databuddy.mjs +1451 -0
  19. package/dist/connectors/databuddy.mjs.map +1 -0
  20. package/dist/connectors/otlp.js +24 -0
  21. package/dist/connectors/otlp.js.map +1 -1
  22. package/dist/connectors/otlp.mjs +24 -0
  23. package/dist/connectors/otlp.mjs.map +1 -1
  24. package/dist/connectors/posthog.js +24 -0
  25. package/dist/connectors/posthog.js.map +1 -1
  26. package/dist/connectors/posthog.mjs +24 -0
  27. package/dist/connectors/posthog.mjs.map +1 -1
  28. package/dist/connectors/sentry.js +24 -0
  29. package/dist/connectors/sentry.js.map +1 -1
  30. package/dist/connectors/sentry.mjs +24 -0
  31. package/dist/connectors/sentry.mjs.map +1 -1
  32. package/dist/core/config.d.ts +1 -1
  33. package/dist/core/logger.d.ts +3 -0
  34. package/dist/elysia.js +455 -30
  35. package/dist/elysia.js.map +1 -1
  36. package/dist/elysia.mjs +455 -30
  37. package/dist/elysia.mjs.map +1 -1
  38. package/dist/expo.js +7 -0
  39. package/dist/expo.js.map +1 -1
  40. package/dist/expo.mjs +7 -0
  41. package/dist/expo.mjs.map +1 -1
  42. package/dist/express.js +455 -30
  43. package/dist/express.js.map +1 -1
  44. package/dist/express.mjs +455 -30
  45. package/dist/express.mjs.map +1 -1
  46. package/dist/fastify.js +455 -30
  47. package/dist/fastify.js.map +1 -1
  48. package/dist/fastify.mjs +455 -30
  49. package/dist/fastify.mjs.map +1 -1
  50. package/dist/frameworks/astro/index.d.ts +2 -0
  51. package/dist/frameworks/astro/logger.d.ts +3 -0
  52. package/dist/frameworks/nitro/index.d.ts +2 -0
  53. package/dist/frameworks/nitro/logger.d.ts +6 -0
  54. package/dist/frameworks/nuxt/index.d.ts +2 -0
  55. package/dist/frameworks/nuxt/logger.d.ts +3 -0
  56. package/dist/frameworks/react-router/index.d.ts +2 -0
  57. package/dist/frameworks/react-router/logger.d.ts +3 -0
  58. package/dist/frameworks/shared/h3.d.ts +19 -0
  59. package/dist/hono.js +455 -30
  60. package/dist/hono.js.map +1 -1
  61. package/dist/hono.mjs +455 -30
  62. package/dist/hono.mjs.map +1 -1
  63. package/dist/index.d.ts +11 -1
  64. package/dist/index.js +1142 -78
  65. package/dist/index.js.map +1 -1
  66. package/dist/index.mjs +1135 -79
  67. package/dist/index.mjs.map +1 -1
  68. package/dist/nestjs.js +455 -30
  69. package/dist/nestjs.js.map +1 -1
  70. package/dist/nestjs.mjs +455 -30
  71. package/dist/nestjs.mjs.map +1 -1
  72. package/dist/nextjs.js +455 -30
  73. package/dist/nextjs.js.map +1 -1
  74. package/dist/nextjs.mjs +455 -30
  75. package/dist/nextjs.mjs.map +1 -1
  76. package/dist/nitro.js +4726 -0
  77. package/dist/nitro.js.map +1 -0
  78. package/dist/nitro.mjs +4698 -0
  79. package/dist/nitro.mjs.map +1 -0
  80. package/dist/nuxt.js +4733 -0
  81. package/dist/nuxt.js.map +1 -0
  82. package/dist/nuxt.mjs +4705 -0
  83. package/dist/nuxt.mjs.map +1 -0
  84. package/dist/react-router.js +4644 -0
  85. package/dist/react-router.js.map +1 -0
  86. package/dist/react-router.mjs +4616 -0
  87. package/dist/react-router.mjs.map +1 -0
  88. package/dist/standalone.js +423 -53
  89. package/dist/standalone.js.map +1 -1
  90. package/dist/standalone.mjs +423 -53
  91. package/dist/standalone.mjs.map +1 -1
  92. package/dist/sveltekit.js +455 -30
  93. package/dist/sveltekit.js.map +1 -1
  94. package/dist/sveltekit.mjs +455 -30
  95. package/dist/sveltekit.mjs.map +1 -1
  96. package/dist/tanstack-start.js +455 -30
  97. package/dist/tanstack-start.js.map +1 -1
  98. package/dist/tanstack-start.mjs +455 -30
  99. package/dist/tanstack-start.mjs.map +1 -1
  100. package/dist/types/connectors/databuddy.d.ts +52 -0
  101. package/dist/types/core/config.d.ts +32 -0
  102. package/dist/types/core/logger.d.ts +2 -0
  103. package/dist/types/frameworks/astro.d.ts +32 -0
  104. package/dist/types/frameworks/nitro.d.ts +62 -0
  105. package/dist/types/frameworks/nuxt.d.ts +12 -0
  106. package/dist/types/frameworks/react-router.d.ts +33 -0
  107. package/dist/types/frameworks/shared.d.ts +24 -0
  108. package/dist/types/shared/client-log.d.ts +1 -1
  109. package/exports/connectors/databuddy.js +1 -0
  110. package/exports/connectors/databuddy.mjs +1 -0
  111. package/exports/frameworks/astro.js +1 -0
  112. package/exports/frameworks/astro.mjs +1 -0
  113. package/exports/frameworks/nitro.js +1 -0
  114. package/exports/frameworks/nitro.mjs +1 -0
  115. package/exports/frameworks/nuxt.js +1 -0
  116. package/exports/frameworks/nuxt.mjs +1 -0
  117. package/exports/frameworks/react-router.js +1 -0
  118. package/exports/frameworks/react-router.mjs +1 -0
  119. package/package.json +59 -2
  120. package/types/connectors/databuddy.d.ts +1 -0
  121. package/types/frameworks/astro.d.ts +1 -0
  122. package/types/frameworks/nitro.d.ts +1 -0
  123. package/types/frameworks/nuxt.d.ts +1 -0
  124. package/types/frameworks/react-router.d.ts +1 -0
package/dist/index.js CHANGED
@@ -10,6 +10,7 @@ var fflate = require('fflate');
10
10
  var crypto = require('crypto');
11
11
  var Sentry = require('@sentry/node');
12
12
  var node = require('@logtail/node');
13
+ var node$1 = require('@databuddy/sdk/node');
13
14
  var apiLogs = require('@opentelemetry/api-logs');
14
15
  var exporterLogsOtlpHttp = require('@opentelemetry/exporter-logs-otlp-http');
15
16
  var resources = require('@opentelemetry/resources');
@@ -225,6 +226,7 @@ var CLIENT_LOG_LEVELS = [
225
226
  ];
226
227
  var clientConnectorRequestSchema = zod.z.union([
227
228
  zod.z.literal("betterstack"),
229
+ zod.z.literal("databuddy"),
228
230
  zod.z.literal("posthog"),
229
231
  zod.z.literal("sentry"),
230
232
  zod.z.undefined(),
@@ -265,16 +267,16 @@ function normalizeEndpointPath(path3) {
265
267
  }
266
268
 
267
269
  // src/shared/once.ts
268
- function createConsoleOnceLogger(method, warnedKeys6 = /* @__PURE__ */ new Set()) {
270
+ function createConsoleOnceLogger(method, warnedKeys7 = /* @__PURE__ */ new Set()) {
269
271
  return (key, message, error) => {
270
- if (warnedKeys6.has(key) || typeof console === "undefined") {
272
+ if (warnedKeys7.has(key) || typeof console === "undefined") {
271
273
  return;
272
274
  }
273
275
  const writer = console[method];
274
276
  if (typeof writer !== "function") {
275
277
  return;
276
278
  }
277
- warnedKeys6.add(key);
279
+ warnedKeys7.add(key);
278
280
  if (error === void 0) {
279
281
  writer.call(console, message);
280
282
  return;
@@ -282,11 +284,11 @@ function createConsoleOnceLogger(method, warnedKeys6 = /* @__PURE__ */ new Set()
282
284
  writer.call(console, message, error);
283
285
  };
284
286
  }
285
- function createWarnOnceLogger(warnedKeys6) {
286
- return createConsoleOnceLogger("warn", warnedKeys6);
287
+ function createWarnOnceLogger(warnedKeys7) {
288
+ return createConsoleOnceLogger("warn", warnedKeys7);
287
289
  }
288
- function createErrorOnceLogger(warnedKeys6) {
289
- return createConsoleOnceLogger("error", warnedKeys6);
290
+ function createErrorOnceLogger(warnedKeys7) {
291
+ return createConsoleOnceLogger("error", warnedKeys7);
290
292
  }
291
293
 
292
294
  // src/core/config.ts
@@ -652,6 +654,28 @@ function mergePostHogConnectorConfig(base, override) {
652
654
  }
653
655
  };
654
656
  }
657
+ function mergeDatabuddyConnectorConfig(base, override) {
658
+ const enabled = override?.enabled ?? base?.enabled ?? false;
659
+ const apiKey = override?.apiKey ?? base?.apiKey;
660
+ const websiteId = override?.websiteId ?? base?.websiteId;
661
+ const ready = enabled && hasNonEmptyString(apiKey) && hasNonEmptyString(websiteId);
662
+ return {
663
+ enabled,
664
+ mode: override?.mode ?? base?.mode ?? "auto",
665
+ apiKey,
666
+ websiteId,
667
+ namespace: override?.namespace ?? base?.namespace,
668
+ source: override?.source ?? base?.source,
669
+ apiUrl: override?.apiUrl ?? base?.apiUrl,
670
+ debug: override?.debug ?? base?.debug ?? false,
671
+ enableBatching: override?.enableBatching ?? base?.enableBatching ?? true,
672
+ batchSize: override?.batchSize ?? base?.batchSize,
673
+ batchTimeout: override?.batchTimeout ?? base?.batchTimeout,
674
+ maxQueueSize: override?.maxQueueSize ?? base?.maxQueueSize,
675
+ ready,
676
+ status: ready ? "enabled" : "missing"
677
+ };
678
+ }
655
679
  function mergeBetterStackConnectorConfig(base, override) {
656
680
  const sourceToken = override?.sourceToken ?? base?.sourceToken;
657
681
  const ingestingHost = override?.ingestingHost ?? base?.ingestingHost;
@@ -742,6 +766,7 @@ function mergeOTLPConnectorsConfig(base, override) {
742
766
  function mergeConnectorsConfig(base, override) {
743
767
  return {
744
768
  betterstack: mergeBetterStackConnectorConfig(base?.betterstack, override?.betterstack),
769
+ databuddy: mergeDatabuddyConnectorConfig(base?.databuddy, override?.databuddy),
745
770
  posthog: mergePostHogConnectorConfig(base?.posthog, override?.posthog),
746
771
  sentry: mergeSentryConnectorConfig(base?.sentry, override?.sentry),
747
772
  otlp: mergeOTLPConnectorsConfig(base?.otlp, override?.otlp)
@@ -1858,10 +1883,318 @@ function createBetterStackSender(config) {
1858
1883
  }
1859
1884
  };
1860
1885
  }
1861
- var PREVIOUSLY_CAPTURED_ERROR_KEY2 = "__posthog_previously_captured_error";
1862
1886
  var warnedKeys3 = /* @__PURE__ */ new Set();
1887
+ var senderCache = /* @__PURE__ */ new Map();
1863
1888
  var testHooks2 = {};
1864
1889
  var warnOnce4 = createErrorOnceLogger(warnedKeys3);
1890
+ function registerShutdownHooks2(key, shutdown) {
1891
+ const handlers = ["beforeExit", "SIGINT", "SIGTERM"];
1892
+ for (const event of handlers) {
1893
+ process.once(event, () => {
1894
+ void shutdown().catch((error) => {
1895
+ warnOnce4(
1896
+ `${key}:shutdown`,
1897
+ "[Blyp] Failed to flush Databuddy telemetry during shutdown.",
1898
+ error
1899
+ );
1900
+ });
1901
+ });
1902
+ }
1903
+ }
1904
+ function resolveConnectorConfig2(config) {
1905
+ const connector = isBlypConfig(config) ? config.connectors?.databuddy : config;
1906
+ const enabled = connector?.enabled ?? false;
1907
+ const apiKey = connector?.apiKey;
1908
+ const websiteId = connector?.websiteId;
1909
+ const ready = enabled && hasNonEmptyString(apiKey) && hasNonEmptyString(websiteId);
1910
+ return {
1911
+ enabled,
1912
+ mode: connector?.mode ?? "auto",
1913
+ apiKey,
1914
+ websiteId,
1915
+ namespace: connector?.namespace,
1916
+ source: connector?.source,
1917
+ apiUrl: connector?.apiUrl,
1918
+ debug: connector?.debug ?? false,
1919
+ enableBatching: connector?.enableBatching ?? true,
1920
+ batchSize: connector?.batchSize,
1921
+ batchTimeout: connector?.batchTimeout,
1922
+ maxQueueSize: connector?.maxQueueSize,
1923
+ ready,
1924
+ status: ready ? "enabled" : "missing"
1925
+ };
1926
+ }
1927
+ function createDefaultClient2(connector) {
1928
+ return new node$1.Databuddy({
1929
+ apiKey: connector.apiKey ?? "",
1930
+ ...connector.websiteId ? { websiteId: connector.websiteId } : {},
1931
+ ...connector.namespace ? { namespace: connector.namespace } : {},
1932
+ ...connector.source ? { source: connector.source } : {},
1933
+ ...connector.apiUrl ? { apiUrl: connector.apiUrl } : {},
1934
+ debug: connector.debug,
1935
+ enableBatching: connector.enableBatching,
1936
+ ...connector.batchSize !== void 0 ? { batchSize: connector.batchSize } : {},
1937
+ ...connector.batchTimeout !== void 0 ? { batchTimeout: connector.batchTimeout } : {},
1938
+ ...connector.maxQueueSize !== void 0 ? { maxQueueSize: connector.maxQueueSize } : {}
1939
+ });
1940
+ }
1941
+ function getDatabuddySenderKey(connector) {
1942
+ return JSON.stringify({
1943
+ enabled: connector.enabled,
1944
+ mode: connector.mode,
1945
+ apiKey: connector.apiKey ?? null,
1946
+ websiteId: connector.websiteId ?? null,
1947
+ namespace: connector.namespace ?? null,
1948
+ source: connector.source ?? null,
1949
+ apiUrl: connector.apiUrl ?? null,
1950
+ debug: connector.debug,
1951
+ enableBatching: connector.enableBatching,
1952
+ batchSize: connector.batchSize ?? null,
1953
+ batchTimeout: connector.batchTimeout ?? null,
1954
+ maxQueueSize: connector.maxQueueSize ?? null
1955
+ });
1956
+ }
1957
+ function getSessionId(record) {
1958
+ const direct = getField(record, "sessionId");
1959
+ if (hasNonEmptyString(direct)) {
1960
+ return direct;
1961
+ }
1962
+ return getClientSessionField(record, "sessionId");
1963
+ }
1964
+ function getAnonymousId(record) {
1965
+ const direct = getField(record, "anonymousId");
1966
+ if (hasNonEmptyString(direct)) {
1967
+ return direct;
1968
+ }
1969
+ const payload = getPrimaryPayload(record);
1970
+ if (isPlainObject(payload.metadata) && hasNonEmptyString(payload.metadata.databuddyAnonymousId)) {
1971
+ return payload.metadata.databuddyAnonymousId;
1972
+ }
1973
+ return void 0;
1974
+ }
1975
+ function getDatabuddyEventName(record) {
1976
+ const recordType = getRecordType(record);
1977
+ if (hasNonEmptyString(recordType)) {
1978
+ return recordType;
1979
+ }
1980
+ return "log";
1981
+ }
1982
+ function buildRecordProperties(record, source) {
1983
+ const properties = {
1984
+ blyp_level: record.level,
1985
+ blyp_source: source,
1986
+ blyp_payload: serializeLogRecord(record),
1987
+ message: typeof record.message === "string" ? record.message : String(record.message)
1988
+ };
1989
+ const caller = typeof record.caller === "string" ? record.caller : void 0;
1990
+ const groupId = getField(record, "groupId");
1991
+ const method = getField(record, "method");
1992
+ const path3 = getField(record, "path");
1993
+ const status = getField(record, "status");
1994
+ const duration = getField(record, "duration");
1995
+ const pagePath = getClientPageField(record, "pathname");
1996
+ const pageUrl = getClientPageField(record, "url");
1997
+ const sessionId = getClientSessionField(record, "sessionId");
1998
+ const pageId = getClientSessionField(record, "pageId");
1999
+ const ifTruthy = [
2000
+ ["blyp_type", getRecordType(record)],
2001
+ ["caller", caller],
2002
+ ["group_id", groupId],
2003
+ ["method", method],
2004
+ ["path", path3],
2005
+ ["page_path", pagePath],
2006
+ ["page_url", pageUrl],
2007
+ ["session_id", sessionId],
2008
+ ["page_id", pageId]
2009
+ ];
2010
+ const ifDefined = [
2011
+ ["status_code", status],
2012
+ ["duration_ms", duration]
2013
+ ];
2014
+ for (const [key, value] of ifTruthy) {
2015
+ if (value) {
2016
+ properties[key] = value;
2017
+ }
2018
+ }
2019
+ for (const [key, value] of ifDefined) {
2020
+ if (value !== void 0) {
2021
+ properties[key] = value;
2022
+ }
2023
+ }
2024
+ return properties;
2025
+ }
2026
+ function createTrackEvent(record, source) {
2027
+ return {
2028
+ name: getDatabuddyEventName(record),
2029
+ anonymousId: getAnonymousId(record),
2030
+ sessionId: getSessionId(record),
2031
+ properties: buildRecordProperties(record, source)
2032
+ };
2033
+ }
2034
+ function normalizeExceptionProperties(value) {
2035
+ if (!isPlainObject(value)) {
2036
+ return {};
2037
+ }
2038
+ return normalizeLogValue(value);
2039
+ }
2040
+ function normalizeExceptionInput2(value, fallbackMessage) {
2041
+ if (value instanceof Error) {
2042
+ return {
2043
+ message: value.message || fallbackMessage,
2044
+ properties: {
2045
+ error_type: value.name,
2046
+ ...value.stack ? { stack: value.stack } : {},
2047
+ ...normalizeExceptionProperties(value)
2048
+ }
2049
+ };
2050
+ }
2051
+ if (isPlainObject(value)) {
2052
+ const message = hasNonEmptyString(value.message) ? value.message : hasNonEmptyString(value.error) ? value.error : fallbackMessage;
2053
+ return {
2054
+ message,
2055
+ properties: normalizeExceptionProperties(value)
2056
+ };
2057
+ }
2058
+ if (typeof value === "string") {
2059
+ return {
2060
+ message: value,
2061
+ properties: {
2062
+ message: value
2063
+ }
2064
+ };
2065
+ }
2066
+ return {
2067
+ message: fallbackMessage,
2068
+ properties: {
2069
+ value: normalizeLogValue(value)
2070
+ }
2071
+ };
2072
+ }
2073
+ function createDatabuddySender(config) {
2074
+ const connector = resolveConnectorConfig2(config);
2075
+ const senderKey = getDatabuddySenderKey(connector);
2076
+ const cached = senderCache.get(senderKey);
2077
+ if (cached) {
2078
+ return cached;
2079
+ }
2080
+ const key = `${connector.apiUrl ?? "default"}:${connector.mode}:${connector.apiKey ?? "missing"}`;
2081
+ const client = connector.ready ? testHooks2.createClient?.(connector) ?? createDefaultClient2(connector) : void 0;
2082
+ if (client) {
2083
+ registerShutdownHooks2(key, async () => {
2084
+ await client.flush();
2085
+ });
2086
+ }
2087
+ const emitUnavailableWarning = () => {
2088
+ warnOnce4(
2089
+ `databuddy-unavailable:${key}`,
2090
+ "[Blyp] Databuddy connector is not configured. Databuddy requires both apiKey and websiteId. Skipping Databuddy delivery."
2091
+ );
2092
+ };
2093
+ const emitExceptionUnavailableWarning = () => {
2094
+ warnOnce4(
2095
+ `databuddy-exception-unavailable:${key}`,
2096
+ "[Blyp] Databuddy error tracking is not configured. Databuddy requires both apiKey and websiteId. Skipping Databuddy exception capture."
2097
+ );
2098
+ };
2099
+ const sender = {
2100
+ enabled: connector.enabled,
2101
+ ready: connector.ready,
2102
+ mode: connector.mode,
2103
+ status: connector.status,
2104
+ shouldAutoForwardServerLogs() {
2105
+ return connector.ready && connector.mode === "auto";
2106
+ },
2107
+ shouldAutoCaptureExceptions() {
2108
+ return connector.ready && connector.mode === "auto";
2109
+ },
2110
+ send(record, options = {}) {
2111
+ if (!connector.ready || !client) {
2112
+ if (options.warnIfUnavailable) {
2113
+ emitUnavailableWarning();
2114
+ }
2115
+ return;
2116
+ }
2117
+ try {
2118
+ const result = client.track(createTrackEvent(record, options.source ?? "server"));
2119
+ if (result && typeof result.catch === "function") {
2120
+ void result.catch((error) => {
2121
+ warnOnce4(
2122
+ `databuddy-send:${key}`,
2123
+ "[Blyp] Failed to deliver log to Databuddy.",
2124
+ error
2125
+ );
2126
+ });
2127
+ }
2128
+ } catch (error) {
2129
+ warnOnce4(
2130
+ `databuddy-send:${key}`,
2131
+ "[Blyp] Failed to deliver log to Databuddy.",
2132
+ error
2133
+ );
2134
+ }
2135
+ },
2136
+ captureException(error, options = {}) {
2137
+ if (!connector.ready || !client) {
2138
+ if (options.warnIfUnavailable) {
2139
+ emitExceptionUnavailableWarning();
2140
+ }
2141
+ return;
2142
+ }
2143
+ const normalized = normalizeExceptionInput2(
2144
+ error,
2145
+ options.source === "client" ? "Client error" : "Server error"
2146
+ );
2147
+ try {
2148
+ const result = client.track({
2149
+ name: "error",
2150
+ anonymousId: options.anonymousId,
2151
+ sessionId: options.sessionId,
2152
+ properties: {
2153
+ message: normalized.message,
2154
+ blyp_source: options.source ?? "server",
2155
+ blyp_level: "error",
2156
+ ...normalized.properties,
2157
+ ...options.properties ?? {}
2158
+ }
2159
+ });
2160
+ if (result && typeof result.catch === "function") {
2161
+ void result.catch((captureError) => {
2162
+ warnOnce4(
2163
+ `databuddy-capture:${key}`,
2164
+ "[Blyp] Failed to capture exception in Databuddy.",
2165
+ captureError
2166
+ );
2167
+ });
2168
+ }
2169
+ } catch (captureError) {
2170
+ warnOnce4(
2171
+ `databuddy-capture:${key}`,
2172
+ "[Blyp] Failed to capture exception in Databuddy.",
2173
+ captureError
2174
+ );
2175
+ }
2176
+ },
2177
+ async flush() {
2178
+ try {
2179
+ if (client) {
2180
+ await client.flush();
2181
+ }
2182
+ } catch (error) {
2183
+ warnOnce4(
2184
+ `databuddy-flush:${key}`,
2185
+ "[Blyp] Failed to flush Databuddy telemetry.",
2186
+ error
2187
+ );
2188
+ }
2189
+ }
2190
+ };
2191
+ senderCache.set(senderKey, sender);
2192
+ return sender;
2193
+ }
2194
+ var PREVIOUSLY_CAPTURED_ERROR_KEY2 = "__posthog_previously_captured_error";
2195
+ var warnedKeys4 = /* @__PURE__ */ new Set();
2196
+ var testHooks3 = {};
2197
+ var warnOnce5 = createErrorOnceLogger(warnedKeys4);
1865
2198
  function normalizeHost(host) {
1866
2199
  const trimmed = (host || "https://us.i.posthog.com").trim();
1867
2200
  return trimmed.replace(/\/+$/, "");
@@ -1902,7 +2235,7 @@ function buildRecordAttributes(record, source) {
1902
2235
  for (const [k, v] of ifDefined) if (v !== void 0) attributes[k] = v;
1903
2236
  return attributes;
1904
2237
  }
1905
- function normalizeExceptionProperties(value) {
2238
+ function normalizeExceptionProperties2(value) {
1906
2239
  if (!isPlainObject(value)) {
1907
2240
  return {};
1908
2241
  }
@@ -1934,18 +2267,18 @@ function createSyntheticError(message, source) {
1934
2267
  assignExceptionField(error, "details", source.details);
1935
2268
  return error;
1936
2269
  }
1937
- function normalizeExceptionInput2(input, fallbackMessage = "Unknown error") {
2270
+ function normalizeExceptionInput3(input, fallbackMessage = "Unknown error") {
1938
2271
  if (input instanceof Error) {
1939
2272
  return {
1940
2273
  error: input,
1941
- properties: normalizeExceptionProperties(input)
2274
+ properties: normalizeExceptionProperties2(input)
1942
2275
  };
1943
2276
  }
1944
2277
  if (isPlainObject(input)) {
1945
2278
  const message = hasNonEmptyString(input.message) ? input.message : hasNonEmptyString(input.error) ? input.error : fallbackMessage;
1946
2279
  return {
1947
2280
  error: createSyntheticError(message, input),
1948
- properties: normalizeExceptionProperties(input)
2281
+ properties: normalizeExceptionProperties2(input)
1949
2282
  };
1950
2283
  }
1951
2284
  if (typeof input === "string") {
@@ -2021,12 +2354,12 @@ function resolveSeverity(level) {
2021
2354
  return { text: "info", number: apiLogs.SeverityNumber.INFO };
2022
2355
  }
2023
2356
  }
2024
- function registerShutdownHooks2(key, shutdown) {
2357
+ function registerShutdownHooks3(key, shutdown) {
2025
2358
  const handlers = ["beforeExit", "SIGINT", "SIGTERM"];
2026
2359
  for (const event of handlers) {
2027
2360
  process.once(event, () => {
2028
2361
  void shutdown().catch((error) => {
2029
- warnOnce4(
2362
+ warnOnce5(
2030
2363
  `${key}:shutdown`,
2031
2364
  "[Blyp] Failed to flush PostHog telemetry during shutdown.",
2032
2365
  error
@@ -2080,7 +2413,7 @@ function createDefaultExceptionClient(connector) {
2080
2413
  }
2081
2414
  };
2082
2415
  }
2083
- function resolveConnectorConfig2(config) {
2416
+ function resolveConnectorConfig3(config) {
2084
2417
  const connector = isBlypConfig(config) ? config.connectors?.posthog : config;
2085
2418
  const enabled = connector?.enabled ?? false;
2086
2419
  const projectKey = connector?.projectKey;
@@ -2103,11 +2436,11 @@ function resolveConnectorConfig2(config) {
2103
2436
  };
2104
2437
  }
2105
2438
  function createPostHogSender(config) {
2106
- const connector = resolveConnectorConfig2(config);
2439
+ const connector = resolveConnectorConfig3(config);
2107
2440
  const key = `${connector.serviceName}:${connector.host}:${connector.mode}`;
2108
2441
  const ready = connector.enabled === true && hasNonEmptyString(connector.projectKey);
2109
- const transport = ready ? testHooks2.createTransport?.(connector) ?? createDefaultTransport(connector) : void 0;
2110
- const exceptionClient = connector.errorTracking.ready ? testHooks2.createExceptionClient?.(connector) ?? createDefaultExceptionClient(connector) : void 0;
2442
+ const transport = ready ? testHooks3.createTransport?.(connector) ?? createDefaultTransport(connector) : void 0;
2443
+ const exceptionClient = connector.errorTracking.ready ? testHooks3.createExceptionClient?.(connector) ?? createDefaultExceptionClient(connector) : void 0;
2111
2444
  const shutdown = async () => {
2112
2445
  if (transport?.shutdown) {
2113
2446
  await transport.shutdown();
@@ -2119,16 +2452,16 @@ function createPostHogSender(config) {
2119
2452
  }
2120
2453
  };
2121
2454
  if (transport || exceptionClient) {
2122
- registerShutdownHooks2(key, shutdown);
2455
+ registerShutdownHooks3(key, shutdown);
2123
2456
  }
2124
2457
  const emitUnavailableWarning = () => {
2125
- warnOnce4(
2458
+ warnOnce5(
2126
2459
  `posthog-unavailable:${key}`,
2127
2460
  "[Blyp] PostHog connector is not configured. Skipping PostHog delivery."
2128
2461
  );
2129
2462
  };
2130
2463
  const emitExceptionUnavailableWarning = () => {
2131
- warnOnce4(
2464
+ warnOnce5(
2132
2465
  `posthog-exception-unavailable:${key}`,
2133
2466
  "[Blyp] PostHog error tracking is not configured. Skipping PostHog exception capture."
2134
2467
  );
@@ -2166,7 +2499,7 @@ function createPostHogSender(config) {
2166
2499
  const result = transport.emit(normalized);
2167
2500
  if (result && typeof result.catch === "function") {
2168
2501
  void result.catch((error) => {
2169
- warnOnce4(
2502
+ warnOnce5(
2170
2503
  `posthog-emit:${key}`,
2171
2504
  "[Blyp] Failed to deliver log to PostHog.",
2172
2505
  error
@@ -2174,7 +2507,7 @@ function createPostHogSender(config) {
2174
2507
  });
2175
2508
  }
2176
2509
  } catch (error) {
2177
- warnOnce4(
2510
+ warnOnce5(
2178
2511
  `posthog-emit:${key}`,
2179
2512
  "[Blyp] Failed to deliver log to PostHog.",
2180
2513
  error
@@ -2191,7 +2524,7 @@ function createPostHogSender(config) {
2191
2524
  if (isPreviouslyCapturedPostHogError(error)) {
2192
2525
  return;
2193
2526
  }
2194
- const normalized = normalizeExceptionInput2(
2527
+ const normalized = normalizeExceptionInput3(
2195
2528
  error,
2196
2529
  options.source === "client" ? "Client error" : "Server error"
2197
2530
  );
@@ -2210,7 +2543,7 @@ function createPostHogSender(config) {
2210
2543
  markPostHogCapturedError(normalized.error);
2211
2544
  if (result && typeof result.catch === "function") {
2212
2545
  void result.catch((captureError) => {
2213
- warnOnce4(
2546
+ warnOnce5(
2214
2547
  `posthog-capture:${key}`,
2215
2548
  "[Blyp] Failed to capture exception in PostHog.",
2216
2549
  captureError
@@ -2218,7 +2551,7 @@ function createPostHogSender(config) {
2218
2551
  });
2219
2552
  }
2220
2553
  } catch (captureError) {
2221
- warnOnce4(
2554
+ warnOnce5(
2222
2555
  `posthog-capture:${key}`,
2223
2556
  "[Blyp] Failed to capture exception in PostHog.",
2224
2557
  captureError
@@ -2231,7 +2564,7 @@ function createPostHogSender(config) {
2231
2564
  await transport.flush();
2232
2565
  }
2233
2566
  } catch (error) {
2234
- warnOnce4(
2567
+ warnOnce5(
2235
2568
  `posthog-flush:${key}`,
2236
2569
  "[Blyp] Failed to flush PostHog telemetry.",
2237
2570
  error
@@ -2246,13 +2579,13 @@ function buildPostHogExceptionProperties(record, source, properties = {}) {
2246
2579
  ...properties
2247
2580
  };
2248
2581
  }
2249
- var warnedKeys4 = /* @__PURE__ */ new Set();
2250
- var testHooks3 = {};
2251
- var warnOnce5 = createErrorOnceLogger(warnedKeys4);
2582
+ var warnedKeys5 = /* @__PURE__ */ new Set();
2583
+ var testHooks4 = {};
2584
+ var warnOnce6 = createErrorOnceLogger(warnedKeys5);
2252
2585
  function getSentryModule2() {
2253
- return testHooks3.module ?? Sentry__namespace;
2586
+ return testHooks4.module ?? Sentry__namespace;
2254
2587
  }
2255
- function resolveConnectorConfig3(config) {
2588
+ function resolveConnectorConfig4(config) {
2256
2589
  const connector = isBlypConfig(config) ? config.connectors?.sentry : config;
2257
2590
  const enabled = connector?.enabled ?? false;
2258
2591
  const dsn = connector?.dsn;
@@ -2397,7 +2730,7 @@ function hasConfigMismatch(connector, client) {
2397
2730
  return hasNonEmptyString(connector.dsn) && connector.dsn !== options.dsn || hasNonEmptyString(connector.environment) && connector.environment !== options.environment || hasNonEmptyString(connector.release) && connector.release !== options.release;
2398
2731
  }
2399
2732
  function createSentrySender(config) {
2400
- const connector = resolveConnectorConfig3(config);
2733
+ const connector = resolveConnectorConfig4(config);
2401
2734
  const key = `${connector.mode}:${connector.dsn ?? "missing"}`;
2402
2735
  const module = getSentryModule2();
2403
2736
  let client = connector.enabled ? module.getClient() : void 0;
@@ -2411,7 +2744,7 @@ function createSentrySender(config) {
2411
2744
  });
2412
2745
  client = module.getClient();
2413
2746
  } catch (error) {
2414
- warnOnce5(
2747
+ warnOnce6(
2415
2748
  `sentry-init:${key}`,
2416
2749
  "[Blyp] Failed to initialize Sentry. Skipping Sentry delivery.",
2417
2750
  error
@@ -2419,14 +2752,14 @@ function createSentrySender(config) {
2419
2752
  }
2420
2753
  }
2421
2754
  if (client && hasConfigMismatch(connector, client)) {
2422
- warnOnce5(
2755
+ warnOnce6(
2423
2756
  `sentry-mismatch:${key}`,
2424
2757
  "[Blyp] Sentry is already initialized with different options. Reusing the existing Sentry client."
2425
2758
  );
2426
2759
  }
2427
2760
  const ready = connector.enabled && client !== void 0;
2428
2761
  const emitUnavailableWarning = () => {
2429
- warnOnce5(
2762
+ warnOnce6(
2430
2763
  `sentry-unavailable:${key}`,
2431
2764
  "[Blyp] Sentry connector is not configured. Skipping Sentry delivery."
2432
2765
  );
@@ -2452,7 +2785,7 @@ function createSentrySender(config) {
2452
2785
  try {
2453
2786
  logMethod(record.message, attributes);
2454
2787
  } catch (error) {
2455
- warnOnce5(
2788
+ warnOnce6(
2456
2789
  `sentry-log:${key}`,
2457
2790
  "[Blyp] Failed to deliver log to Sentry.",
2458
2791
  error
@@ -2470,7 +2803,7 @@ function createSentrySender(config) {
2470
2803
  module.captureException(exception);
2471
2804
  });
2472
2805
  } catch (error) {
2473
- warnOnce5(
2806
+ warnOnce6(
2474
2807
  `sentry-exception:${key}`,
2475
2808
  "[Blyp] Failed to capture exception in Sentry.",
2476
2809
  error
@@ -2481,7 +2814,7 @@ function createSentrySender(config) {
2481
2814
  try {
2482
2815
  await module.flush(2e3);
2483
2816
  } catch (error) {
2484
- warnOnce5(
2817
+ warnOnce6(
2485
2818
  `sentry-flush:${key}`,
2486
2819
  "[Blyp] Failed to flush Sentry logs.",
2487
2820
  error
@@ -2490,9 +2823,9 @@ function createSentrySender(config) {
2490
2823
  }
2491
2824
  };
2492
2825
  }
2493
- var warnedKeys5 = /* @__PURE__ */ new Set();
2494
- var testHooks4 = {};
2495
- var warnOnce6 = createErrorOnceLogger(warnedKeys5);
2826
+ var warnedKeys6 = /* @__PURE__ */ new Set();
2827
+ var testHooks5 = {};
2828
+ var warnOnce7 = createErrorOnceLogger(warnedKeys6);
2496
2829
  function normalizeOTLPRecord(record, connector, source = "server") {
2497
2830
  const severity = resolveSeverity2(record.level);
2498
2831
  const body = typeof record.message === "string" ? record.message : String(record.message);
@@ -2557,14 +2890,14 @@ function resolveSeverity2(level) {
2557
2890
  return { text: "info", number: apiLogs.SeverityNumber.INFO };
2558
2891
  }
2559
2892
  }
2560
- function registerShutdownHooks3(key, shutdown) {
2893
+ function registerShutdownHooks4(key, shutdown) {
2561
2894
  const handlers = ["beforeExit", "SIGINT", "SIGTERM"];
2562
2895
  for (const event of handlers) {
2563
2896
  process.once(event, async () => {
2564
2897
  try {
2565
2898
  await shutdown();
2566
2899
  } catch (error) {
2567
- warnOnce6(
2900
+ warnOnce7(
2568
2901
  `${key}:shutdown`,
2569
2902
  "[Blyp] Failed to flush OTLP logs during shutdown.",
2570
2903
  error
@@ -2641,7 +2974,7 @@ function createUnavailableSender(name, connector) {
2641
2974
  const senderName = name || connector?.name || "otlp";
2642
2975
  const key = `${senderName}:${connector?.serviceName ?? "blyp-app"}:${connector?.endpoint ?? "missing"}`;
2643
2976
  const emitUnavailableWarning = () => {
2644
- warnOnce6(
2977
+ warnOnce7(
2645
2978
  `otlp-unavailable:${key}`,
2646
2979
  `[Blyp] OTLP target "${senderName}" is not configured or not ready. Skipping OTLP delivery.`
2647
2980
  );
@@ -2672,7 +3005,7 @@ function createSender(connector) {
2672
3005
  ...connector,
2673
3006
  headers: resolveTransportHeaders(connector)
2674
3007
  };
2675
- const transport = testHooks4.createTransport?.(transportConnector) ?? createDefaultTransport2(transportConnector);
3008
+ const transport = testHooks5.createTransport?.(transportConnector) ?? createDefaultTransport2(transportConnector);
2676
3009
  return {
2677
3010
  name: connector.name,
2678
3011
  enabled: connector.enabled,
@@ -2688,7 +3021,7 @@ function createSender(connector) {
2688
3021
  const result = transport.emit(normalized);
2689
3022
  if (result && typeof result.catch === "function") {
2690
3023
  void result.catch((error) => {
2691
- warnOnce6(
3024
+ warnOnce7(
2692
3025
  `otlp-emit:${key}`,
2693
3026
  `[Blyp] Failed to deliver log to OTLP target "${connector.name}".`,
2694
3027
  error
@@ -2696,7 +3029,7 @@ function createSender(connector) {
2696
3029
  });
2697
3030
  }
2698
3031
  } catch (error) {
2699
- warnOnce6(
3032
+ warnOnce7(
2700
3033
  `otlp-emit:${key}`,
2701
3034
  `[Blyp] Failed to deliver log to OTLP target "${connector.name}".`,
2702
3035
  error
@@ -2709,7 +3042,7 @@ function createSender(connector) {
2709
3042
  await transport.flush();
2710
3043
  }
2711
3044
  } catch (error) {
2712
- warnOnce6(
3045
+ warnOnce7(
2713
3046
  `otlp-flush:${key}`,
2714
3047
  `[Blyp] Failed to flush OTLP logs for target "${connector.name}".`,
2715
3048
  error
@@ -2738,7 +3071,7 @@ function createOTLPRegistry(config) {
2738
3071
  await Promise.all(Array.from(senders.values()).map((sender) => sender.flush()));
2739
3072
  }
2740
3073
  };
2741
- registerShutdownHooks3("otlp-registry", () => registry.flush());
3074
+ registerShutdownHooks4("otlp-registry", () => registry.flush());
2742
3075
  return registry;
2743
3076
  }
2744
3077
  var _RuntimeDetector = class _RuntimeDetector {
@@ -3136,6 +3469,9 @@ function getPostHogSender(logger3) {
3136
3469
  function getBetterStackSender(logger3) {
3137
3470
  return getLoggerFactory(logger3).betterstack;
3138
3471
  }
3472
+ function getDatabuddySender(logger3) {
3473
+ return getLoggerFactory(logger3).databuddy;
3474
+ }
3139
3475
  function tryGetPostHogSender(logger3) {
3140
3476
  try {
3141
3477
  return getPostHogSender(logger3);
@@ -3150,6 +3486,13 @@ function tryGetBetterStackSender(logger3) {
3150
3486
  return null;
3151
3487
  }
3152
3488
  }
3489
+ function tryGetDatabuddySender(logger3) {
3490
+ try {
3491
+ return getDatabuddySender(logger3);
3492
+ } catch {
3493
+ return null;
3494
+ }
3495
+ }
3153
3496
  function getSentrySender(logger3) {
3154
3497
  return getLoggerFactory(logger3).sentry;
3155
3498
  }
@@ -3209,6 +3552,18 @@ function maybeSendToBetterStack(betterstack, record) {
3209
3552
  }
3210
3553
  betterstack.send(record, { source: "server", warnIfUnavailable: true });
3211
3554
  }
3555
+ function maybeSendToDatabuddy(databuddy, record) {
3556
+ if (isClientLogRecord(record)) {
3557
+ return;
3558
+ }
3559
+ if (!databuddy.shouldAutoForwardServerLogs()) {
3560
+ if (databuddy.enabled && !databuddy.ready) {
3561
+ databuddy.send(record, { source: "server", warnIfUnavailable: true });
3562
+ }
3563
+ return;
3564
+ }
3565
+ databuddy.send(record, { source: "server", warnIfUnavailable: true });
3566
+ }
3212
3567
  function maybeSendToSentry(sentry, record) {
3213
3568
  if (isClientLogRecord(record)) {
3214
3569
  return;
@@ -3229,7 +3584,7 @@ function maybeSendToOTLP(otlp, record) {
3229
3584
  sender.send(record, { source: "server", warnIfUnavailable: true });
3230
3585
  }
3231
3586
  }
3232
- function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry, otlp, bindings = {}, source = "root") {
3587
+ function createLoggerInstance(rootRawLogger, sink, betterstack, databuddy, posthog, sentry, otlp, bindings = {}, source = "root") {
3233
3588
  const rawLogger = Object.keys(bindings).length > 0 ? rootRawLogger.child(bindings) : rootRawLogger;
3234
3589
  const writeRecord = (level, message, args, writeSource = source) => {
3235
3590
  if (writeSource === "root" && shouldDropRootLogWrite()) {
@@ -3255,6 +3610,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
3255
3610
  );
3256
3611
  sink.write(record);
3257
3612
  maybeSendToBetterStack(betterstack, record);
3613
+ maybeSendToDatabuddy(databuddy, record);
3258
3614
  maybeSendToPostHog(posthog, record);
3259
3615
  maybeSendToSentry(sentry, record);
3260
3616
  maybeSendToOTLP(otlp, record);
@@ -3278,6 +3634,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
3278
3634
  sink.write(record);
3279
3635
  }
3280
3636
  maybeSendToBetterStack(betterstack, record);
3637
+ maybeSendToDatabuddy(databuddy, record);
3281
3638
  maybeSendToPostHog(posthog, record);
3282
3639
  maybeSendToSentry(sentry, record);
3283
3640
  maybeSendToOTLP(otlp, record);
@@ -3311,8 +3668,26 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
3311
3668
  }
3312
3669
  writeRecord("table", message, data === void 0 ? [] : [data]);
3313
3670
  },
3314
- flush: () => sink.flush(),
3315
- shutdown: () => sink.shutdown(),
3671
+ flush: async () => {
3672
+ await sink.flush();
3673
+ await Promise.allSettled([
3674
+ betterstack.flush(),
3675
+ databuddy.flush(),
3676
+ posthog.flush(),
3677
+ sentry.flush(),
3678
+ otlp.flush()
3679
+ ]);
3680
+ },
3681
+ shutdown: async () => {
3682
+ await sink.shutdown();
3683
+ await Promise.allSettled([
3684
+ betterstack.flush(),
3685
+ databuddy.flush(),
3686
+ posthog.flush(),
3687
+ sentry.flush(),
3688
+ otlp.flush()
3689
+ ]);
3690
+ },
3316
3691
  createStructuredLog: (groupId, initial) => {
3317
3692
  return createStructuredLogForLogger(logger3, groupId, {
3318
3693
  initialFields: initial
@@ -3324,6 +3699,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
3324
3699
  rootRawLogger,
3325
3700
  sink,
3326
3701
  betterstack,
3702
+ databuddy,
3327
3703
  posthog,
3328
3704
  sentry,
3329
3705
  otlp,
@@ -3334,6 +3710,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
3334
3710
  [LOGGER_FACTORY]: {
3335
3711
  bindings,
3336
3712
  betterstack,
3713
+ databuddy,
3337
3714
  posthog,
3338
3715
  sentry,
3339
3716
  otlp,
@@ -3343,6 +3720,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
3343
3720
  rootRawLogger,
3344
3721
  sink,
3345
3722
  betterstack,
3723
+ databuddy,
3346
3724
  posthog,
3347
3725
  sentry,
3348
3726
  otlp,
@@ -3366,6 +3744,7 @@ function createBaseLogger(config) {
3366
3744
  const rawLogger = createPinoLogger(resolvedConfig);
3367
3745
  const sink = createPrimarySink(resolvedConfig);
3368
3746
  const betterstack = createBetterStackSender(resolvedConfig);
3747
+ const databuddy = createDatabuddySender(resolvedConfig);
3369
3748
  const posthog = createPostHogSender(resolvedConfig);
3370
3749
  const sentry = createSentrySender(resolvedConfig);
3371
3750
  const otlp = createOTLPRegistry(resolvedConfig);
@@ -3373,6 +3752,7 @@ function createBaseLogger(config) {
3373
3752
  rawLogger,
3374
3753
  sink,
3375
3754
  betterstack,
3755
+ databuddy,
3376
3756
  posthog,
3377
3757
  sentry,
3378
3758
  otlp
@@ -3988,11 +4368,28 @@ function createError(input) {
3988
4368
  }
3989
4369
  });
3990
4370
  }
3991
- }
3992
- return error;
3993
- }
3994
- var HTTP_CODES2 = buildHttpCodeRegistry((definition, overrides = {}) => {
3995
- return createError({
4371
+ const databuddy = tryGetDatabuddySender(input.logger ?? logger);
4372
+ if (databuddy?.shouldAutoCaptureExceptions()) {
4373
+ databuddy.captureException(error, {
4374
+ source: "server",
4375
+ warnIfUnavailable: true,
4376
+ properties: {
4377
+ blyp_type: "application_error",
4378
+ status: error.status,
4379
+ status_code: error.statusCode,
4380
+ ...error.code !== void 0 ? { code: error.code } : {},
4381
+ ...error.why !== void 0 ? { why: error.why } : {},
4382
+ ...error.fix !== void 0 ? { fix: error.fix } : {},
4383
+ ...error.link !== void 0 ? { link: error.link } : {},
4384
+ ...error.details !== void 0 ? { details: error.details } : {}
4385
+ }
4386
+ });
4387
+ }
4388
+ }
4389
+ return error;
4390
+ }
4391
+ var HTTP_CODES2 = buildHttpCodeRegistry((definition, overrides = {}) => {
4392
+ return createError({
3996
4393
  status: definition.status,
3997
4394
  message: definition.message,
3998
4395
  code: definition.code,
@@ -4372,8 +4769,132 @@ function createStructuredBetterStackLogger(groupId, initial, config = {}) {
4372
4769
  });
4373
4770
  }
4374
4771
 
4375
- // src/connectors/posthog/index.ts
4772
+ // src/connectors/databuddy/index.ts
4376
4773
  function resolveSender2(config = {}) {
4774
+ return createDatabuddySender(resolveConfig({
4775
+ ...config.connectors ? { connectors: config.connectors } : {}
4776
+ }));
4777
+ }
4778
+ function createDatabuddyLoggerInstance(sender, bindings = {}) {
4779
+ const writeRecord = (level, message, args) => {
4780
+ sender.send(buildRecord(level, message, args, bindings), {
4781
+ source: "server",
4782
+ warnIfUnavailable: true
4783
+ });
4784
+ };
4785
+ const writeStructured = (payload, message) => {
4786
+ sender.send(
4787
+ buildStructuredRecord(
4788
+ resolveStructuredWriteLevel(payload.level),
4789
+ message,
4790
+ payload,
4791
+ bindings
4792
+ ),
4793
+ {
4794
+ source: "server",
4795
+ warnIfUnavailable: true
4796
+ }
4797
+ );
4798
+ };
4799
+ return {
4800
+ debug: (message, ...args) => {
4801
+ writeRecord("debug", message, args);
4802
+ },
4803
+ info: (message, ...args) => {
4804
+ writeRecord("info", message, args);
4805
+ },
4806
+ error: (message, ...args) => {
4807
+ writeRecord("error", message, args);
4808
+ },
4809
+ warn: (message, ...args) => {
4810
+ writeRecord("warn", message, args);
4811
+ },
4812
+ warning: (message, ...args) => {
4813
+ writeRecord("warning", message, args);
4814
+ },
4815
+ success: (message, ...args) => {
4816
+ writeRecord("success", message, args);
4817
+ },
4818
+ critical: (message, ...args) => {
4819
+ writeRecord("critical", message, args);
4820
+ },
4821
+ table: (message, data) => {
4822
+ writeRecord("table", message, data === void 0 ? [] : [data]);
4823
+ },
4824
+ flush: async () => {
4825
+ await sender.flush();
4826
+ },
4827
+ shutdown: async () => {
4828
+ await sender.flush();
4829
+ },
4830
+ createStructuredLog: (groupId, initial) => {
4831
+ return createStructuredLog(groupId, {
4832
+ initialFields: initial,
4833
+ write: writeStructured
4834
+ });
4835
+ },
4836
+ child: (childBindings) => {
4837
+ return createDatabuddyLoggerInstance(sender, {
4838
+ ...bindings,
4839
+ ...childBindings
4840
+ });
4841
+ }
4842
+ };
4843
+ }
4844
+ function createDatabuddyErrorTrackerInstance(sender, bindings = {}) {
4845
+ return {
4846
+ capture: (error, options = {}) => {
4847
+ sender.captureException(error, {
4848
+ source: "server",
4849
+ warnIfUnavailable: true,
4850
+ properties: {
4851
+ ...bindings,
4852
+ ...options.properties ?? {},
4853
+ blyp_source: "server",
4854
+ blyp_manual: true
4855
+ }
4856
+ });
4857
+ },
4858
+ child: (childBindings) => {
4859
+ return createDatabuddyErrorTrackerInstance(sender, {
4860
+ ...bindings,
4861
+ ...childBindings
4862
+ });
4863
+ }
4864
+ };
4865
+ }
4866
+ function createDatabuddyLogger(config = {}) {
4867
+ return createDatabuddyLoggerInstance(resolveSender2(config));
4868
+ }
4869
+ function createStructuredDatabuddyLogger(groupId, initial, config = {}) {
4870
+ const sender = resolveSender2(config);
4871
+ return createStructuredLog(groupId, {
4872
+ initialFields: initial,
4873
+ write: (payload, message) => {
4874
+ sender.send(
4875
+ buildStructuredRecord(
4876
+ resolveStructuredWriteLevel(payload.level),
4877
+ message,
4878
+ payload,
4879
+ {}
4880
+ ),
4881
+ {
4882
+ source: "server",
4883
+ warnIfUnavailable: true
4884
+ }
4885
+ );
4886
+ }
4887
+ });
4888
+ }
4889
+ function createDatabuddyErrorTracker(config = {}) {
4890
+ return createDatabuddyErrorTrackerInstance(resolveSender2(config));
4891
+ }
4892
+ function captureDatabuddyException(error, options = {}, config = {}) {
4893
+ createDatabuddyErrorTracker(config).capture(error, options);
4894
+ }
4895
+
4896
+ // src/connectors/posthog/index.ts
4897
+ function resolveSender3(config = {}) {
4377
4898
  return createPostHogSender(resolveConfig({
4378
4899
  ...config.connectors ? { connectors: config.connectors } : {}
4379
4900
  }));
@@ -4466,10 +4987,10 @@ function createPostHogErrorTrackerInstance(sender, bindings = {}) {
4466
4987
  };
4467
4988
  }
4468
4989
  function createPosthogLogger(config = {}) {
4469
- return createPostHogLoggerInstance(resolveSender2(config));
4990
+ return createPostHogLoggerInstance(resolveSender3(config));
4470
4991
  }
4471
4992
  function createStructuredPosthogLogger(groupId, initial, config = {}) {
4472
- const sender = resolveSender2(config);
4993
+ const sender = resolveSender3(config);
4473
4994
  return createStructuredLog(groupId, {
4474
4995
  initialFields: initial,
4475
4996
  write: (payload, message) => {
@@ -4489,14 +5010,14 @@ function createStructuredPosthogLogger(groupId, initial, config = {}) {
4489
5010
  });
4490
5011
  }
4491
5012
  function createPosthogErrorTracker(config = {}) {
4492
- return createPostHogErrorTrackerInstance(resolveSender2(config));
5013
+ return createPostHogErrorTrackerInstance(resolveSender3(config));
4493
5014
  }
4494
5015
  function capturePosthogException(error, options = {}, config = {}) {
4495
5016
  createPosthogErrorTracker(config).capture(error, options);
4496
5017
  }
4497
5018
 
4498
5019
  // src/connectors/sentry/index.ts
4499
- function resolveSender3(config = {}) {
5020
+ function resolveSender4(config = {}) {
4500
5021
  return createSentrySender(resolveConfig({
4501
5022
  ...config.connectors ? { connectors: config.connectors } : {}
4502
5023
  }));
@@ -4566,10 +5087,10 @@ function createSentryLoggerInstance(sender, bindings = {}) {
4566
5087
  };
4567
5088
  }
4568
5089
  function createSentryLogger(config = {}) {
4569
- return createSentryLoggerInstance(resolveSender3(config));
5090
+ return createSentryLoggerInstance(resolveSender4(config));
4570
5091
  }
4571
5092
  function createStructuredSentryLogger(groupId, initial, config = {}) {
4572
- const sender = resolveSender3(config);
5093
+ const sender = resolveSender4(config);
4573
5094
  return createStructuredLog(groupId, {
4574
5095
  initialFields: initial,
4575
5096
  write: (payload, message) => {
@@ -4864,6 +5385,7 @@ function resolveServerLogger(config = {}, loggerOverride) {
4864
5385
  return {
4865
5386
  logger: logger3,
4866
5387
  betterstack: getBetterStackSender(logger3),
5388
+ databuddy: getDatabuddySender(logger3),
4867
5389
  posthog: getPostHogSender(logger3),
4868
5390
  sentry: getSentrySender(logger3),
4869
5391
  otlp: getOtlpRegistry(logger3),
@@ -4983,6 +5505,22 @@ function emitHttpErrorLog(logger3, level, request, path3, statusCode, responseTi
4983
5505
  }
4984
5506
  });
4985
5507
  }
5508
+ const databuddy = tryGetDatabuddySender(logger3);
5509
+ if (databuddy?.shouldAutoCaptureExceptions()) {
5510
+ databuddy.captureException(captureContext.error ?? error ?? message, {
5511
+ source: "server",
5512
+ warnIfUnavailable: true,
5513
+ properties: {
5514
+ method: request.method,
5515
+ path: path3,
5516
+ status_code: statusCode,
5517
+ ...request.url ? { current_url: request.url } : {},
5518
+ ...getHeaderValue(request.headers, "user-agent") ? { user_agent: getHeaderValue(request.headers, "user-agent") } : {},
5519
+ ...errorLogData.ip ? { ip: errorLogData.ip } : {},
5520
+ payload: errorLogData
5521
+ }
5522
+ });
5523
+ }
4986
5524
  return errorLogData;
4987
5525
  }
4988
5526
  async function parseClientLogPayload(request, body) {
@@ -5074,6 +5612,34 @@ async function handleClientLogIngestion(options) {
5074
5612
  });
5075
5613
  }
5076
5614
  }
5615
+ } else if (payload.connector === "databuddy") {
5616
+ headers["x-blyp-databuddy-status"] = config.databuddy.ready ? "enabled" : "missing";
5617
+ if (config.databuddy.ready) {
5618
+ const forwardedRecord = {
5619
+ timestamp: structuredPayload.receivedAt,
5620
+ level: payload.level,
5621
+ message: `[client] ${payload.message}`,
5622
+ data: structuredPayload
5623
+ };
5624
+ config.databuddy.send(forwardedRecord, {
5625
+ source: "client"
5626
+ });
5627
+ if ((payload.level === "error" || payload.level === "critical") && config.databuddy.shouldAutoCaptureExceptions()) {
5628
+ const clientErrorCandidate = payload.data && typeof payload.data === "object" && !Array.isArray(payload.data) && typeof payload.data.message === "string" ? payload.data : payload.message;
5629
+ config.databuddy.captureException(clientErrorCandidate, {
5630
+ source: "client",
5631
+ warnIfUnavailable: true,
5632
+ sessionId: payload.session.sessionId,
5633
+ properties: {
5634
+ page_url: payload.page.url,
5635
+ page_path: payload.page.pathname,
5636
+ client_runtime: payload.device?.runtime,
5637
+ metadata: payload.metadata,
5638
+ payload: structuredPayload
5639
+ }
5640
+ });
5641
+ }
5642
+ }
5077
5643
  } else if (payload.connector === "posthog") {
5078
5644
  headers["x-blyp-posthog-status"] = config.posthog.ready ? "enabled" : "missing";
5079
5645
  if (config.posthog.ready) {
@@ -5740,8 +6306,160 @@ function createNextJsLogger(config = {}) {
5740
6306
  };
5741
6307
  }
5742
6308
 
6309
+ // src/frameworks/react-router/logger.ts
6310
+ var REACT_ROUTER_LOGGER_KEY = /* @__PURE__ */ Symbol.for("blyp.react-router.logger");
6311
+ var REACT_ROUTER_LOGGER_FALLBACK_KEY = "__blypLog";
6312
+ function createContext2(args, response, error) {
6313
+ return {
6314
+ request: args.request,
6315
+ params: args.params,
6316
+ context: args.context,
6317
+ response,
6318
+ error
6319
+ };
6320
+ }
6321
+ function readLoggerValue(context) {
6322
+ if (typeof context.get === "function") {
6323
+ const symbolValue = context.get(REACT_ROUTER_LOGGER_KEY);
6324
+ if (symbolValue) {
6325
+ return symbolValue;
6326
+ }
6327
+ return context.get(REACT_ROUTER_LOGGER_FALLBACK_KEY);
6328
+ }
6329
+ return context[REACT_ROUTER_LOGGER_KEY] ?? context[REACT_ROUTER_LOGGER_FALLBACK_KEY];
6330
+ }
6331
+ function writeLoggerValue(context, logger3) {
6332
+ if (typeof context.set === "function") {
6333
+ context.set(REACT_ROUTER_LOGGER_KEY, logger3);
6334
+ context.set(REACT_ROUTER_LOGGER_FALLBACK_KEY, logger3);
6335
+ return;
6336
+ }
6337
+ context[REACT_ROUTER_LOGGER_KEY] = logger3;
6338
+ context[REACT_ROUTER_LOGGER_FALLBACK_KEY] = logger3;
6339
+ }
6340
+ function resolveThrownStatusCode(error) {
6341
+ const errorLike = toErrorLike(error);
6342
+ return errorLike?.status ?? errorLike?.statusCode ?? 500;
6343
+ }
6344
+ function createReactRouterLogger(config = {}) {
6345
+ const shared = resolveServerLogger(config);
6346
+ const setLogger = (context, logger3) => {
6347
+ writeLoggerValue(context, logger3);
6348
+ };
6349
+ const getLogger = (context) => {
6350
+ const logger3 = readLoggerValue(context);
6351
+ return logger3 && typeof logger3 === "object" ? logger3 : shared.logger;
6352
+ };
6353
+ return {
6354
+ logger: shared.logger,
6355
+ setLogger,
6356
+ getLogger,
6357
+ middleware: async (args, next) => {
6358
+ return runWithRequestContext(async () => {
6359
+ const startTime = performance.now();
6360
+ const path3 = extractPathname(args.request.url);
6361
+ let structuredLogEmitted = false;
6362
+ const scopedLogger = createRequestScopedLogger(shared.logger, {
6363
+ resolveStructuredFields: () => ({
6364
+ method: args.request.method,
6365
+ path: path3,
6366
+ ...resolveAdditionalProps(shared, createContext2(args))
6367
+ }),
6368
+ onStructuredEmit: () => {
6369
+ structuredLogEmitted = true;
6370
+ }
6371
+ });
6372
+ setLogger(args.context, scopedLogger);
6373
+ try {
6374
+ const response = await next();
6375
+ if (structuredLogEmitted) {
6376
+ await flushServerLoggerSafely(shared);
6377
+ return response;
6378
+ }
6379
+ const statusCode = response.status;
6380
+ const loggerContext = createContext2(args, response);
6381
+ const responseTime = Math.round(performance.now() - startTime);
6382
+ const requestLike = createRequestLike(
6383
+ args.request.method,
6384
+ args.request.url,
6385
+ args.request.headers
6386
+ );
6387
+ if (isErrorStatus(statusCode)) {
6388
+ if (!shouldSkipErrorLogging(shared, path3)) {
6389
+ emitHttpErrorLog(
6390
+ shared.logger,
6391
+ shared.level,
6392
+ requestLike,
6393
+ path3,
6394
+ statusCode,
6395
+ responseTime,
6396
+ toErrorLike(void 0, statusCode),
6397
+ resolveAdditionalProps(shared, loggerContext)
6398
+ );
6399
+ }
6400
+ } else if (!shouldSkipAutoLogging(shared, loggerContext, path3)) {
6401
+ emitHttpRequestLog(
6402
+ shared.logger,
6403
+ shared.level,
6404
+ requestLike,
6405
+ path3,
6406
+ statusCode,
6407
+ responseTime,
6408
+ resolveAdditionalProps(shared, loggerContext)
6409
+ );
6410
+ }
6411
+ await flushServerLoggerSafely(shared);
6412
+ return response;
6413
+ } catch (error) {
6414
+ if (!structuredLogEmitted && !shouldSkipErrorLogging(shared, path3)) {
6415
+ const statusCode = resolveThrownStatusCode(error);
6416
+ emitHttpErrorLog(
6417
+ shared.logger,
6418
+ shared.level,
6419
+ createRequestLike(args.request.method, args.request.url, args.request.headers),
6420
+ path3,
6421
+ statusCode,
6422
+ Math.round(performance.now() - startTime),
6423
+ toErrorLike(error, statusCode),
6424
+ resolveAdditionalProps(shared, createContext2(args, void 0, error)),
6425
+ { error }
6426
+ );
6427
+ }
6428
+ await flushServerLoggerSafely(shared);
6429
+ throw error;
6430
+ }
6431
+ });
6432
+ },
6433
+ clientLogHandler: async (request) => {
6434
+ const path3 = extractPathname(request.url);
6435
+ if (path3 !== shared.ingestionPath) {
6436
+ return new Response(
6437
+ JSON.stringify({
6438
+ error: `Mounted route path ${path3} does not match configured client logging path ${shared.ingestionPath}`
6439
+ }),
6440
+ {
6441
+ status: 500,
6442
+ headers: { "content-type": "application/json" }
6443
+ }
6444
+ );
6445
+ }
6446
+ const result = await handleClientLogIngestion({
6447
+ config: shared,
6448
+ ctx: createContext2({ request, context: {} }),
6449
+ request,
6450
+ deliveryPath: path3
6451
+ });
6452
+ await flushServerLoggerSafely(shared);
6453
+ return new Response(null, {
6454
+ status: result.status,
6455
+ headers: result.headers
6456
+ });
6457
+ }
6458
+ };
6459
+ }
6460
+
5743
6461
  // src/frameworks/tanstack-start/logger.ts
5744
- function createContext2(request, context, response, error) {
6462
+ function createContext3(request, context, response, error) {
5745
6463
  return { request, context, response, error };
5746
6464
  }
5747
6465
  function createTanStackStartLogger(config = {}) {
@@ -5760,7 +6478,7 @@ function createTanStackStartLogger(config = {}) {
5760
6478
  resolveStructuredFields: () => ({
5761
6479
  method: request.method,
5762
6480
  path: path3,
5763
- ...resolveAdditionalProps(shared, createContext2(request, nextContext))
6481
+ ...resolveAdditionalProps(shared, createContext3(request, nextContext))
5764
6482
  }),
5765
6483
  onStructuredEmit: () => {
5766
6484
  structuredLogEmitted = true;
@@ -5774,7 +6492,7 @@ function createTanStackStartLogger(config = {}) {
5774
6492
  return response;
5775
6493
  }
5776
6494
  const statusCode = response.status;
5777
- const loggerContext = createContext2(request, nextContext, response);
6495
+ const loggerContext = createContext3(request, nextContext, response);
5778
6496
  const responseTime = Math.round(performance.now() - startTime);
5779
6497
  if (isErrorStatus(statusCode)) {
5780
6498
  if (!shouldSkipErrorLogging(shared, path3)) {
@@ -5812,7 +6530,7 @@ function createTanStackStartLogger(config = {}) {
5812
6530
  500,
5813
6531
  Math.round(performance.now() - startTime),
5814
6532
  toErrorLike(error, 500),
5815
- resolveAdditionalProps(shared, createContext2(request, nextContext, void 0, error)),
6533
+ resolveAdditionalProps(shared, createContext3(request, nextContext, void 0, error)),
5816
6534
  {
5817
6535
  error
5818
6536
  }
@@ -5841,7 +6559,7 @@ function createTanStackStartLogger(config = {}) {
5841
6559
  }
5842
6560
  const result = await handleClientLogIngestion({
5843
6561
  config: shared,
5844
- ctx: createContext2(request, {}),
6562
+ ctx: createContext3(request, {}),
5845
6563
  request,
5846
6564
  deliveryPath: path3
5847
6565
  });
@@ -5856,7 +6574,7 @@ function createTanStackStartLogger(config = {}) {
5856
6574
  }
5857
6575
 
5858
6576
  // src/frameworks/sveltekit/logger.ts
5859
- function createContext3(event, response, error) {
6577
+ function createContext4(event, response, error) {
5860
6578
  return { event, response, error };
5861
6579
  }
5862
6580
  function createSvelteKitLogger(config = {}) {
@@ -5868,7 +6586,7 @@ function createSvelteKitLogger(config = {}) {
5868
6586
  resolveStructuredFields: () => ({
5869
6587
  method: event.request.method,
5870
6588
  path: event.url.pathname,
5871
- ...resolveAdditionalProps(shared, createContext3(event))
6589
+ ...resolveAdditionalProps(shared, createContext4(event))
5872
6590
  }),
5873
6591
  onStructuredEmit: () => {
5874
6592
  structuredLogEmitted = true;
@@ -5888,7 +6606,7 @@ function createSvelteKitLogger(config = {}) {
5888
6606
  return response;
5889
6607
  }
5890
6608
  const statusCode = response.status;
5891
- const loggerContext = createContext3(event, response);
6609
+ const loggerContext = createContext4(event, response);
5892
6610
  const responseTime = Math.round(performance.now() - startTime);
5893
6611
  if (isErrorStatus(statusCode)) {
5894
6612
  if (!shouldSkipErrorLogging(shared, path3)) {
@@ -5926,7 +6644,7 @@ function createSvelteKitLogger(config = {}) {
5926
6644
  500,
5927
6645
  Math.round(performance.now() - startTime),
5928
6646
  toErrorLike(error, 500),
5929
- resolveAdditionalProps(shared, createContext3(event, void 0, error)),
6647
+ resolveAdditionalProps(shared, createContext4(event, void 0, error)),
5930
6648
  {
5931
6649
  error
5932
6650
  }
@@ -5957,7 +6675,7 @@ function createSvelteKitLogger(config = {}) {
5957
6675
  }
5958
6676
  const result = await handleClientLogIngestion({
5959
6677
  config: shared,
5960
- ctx: createContext3(event),
6678
+ ctx: createContext4(event),
5961
6679
  request: event.request,
5962
6680
  deliveryPath: path3
5963
6681
  });
@@ -5970,6 +6688,344 @@ function createSvelteKitLogger(config = {}) {
5970
6688
  };
5971
6689
  }
5972
6690
 
6691
+ // src/frameworks/astro/logger.ts
6692
+ function createContext5(context, response, error) {
6693
+ return { context, response, error };
6694
+ }
6695
+ function createAstroLogger(config = {}) {
6696
+ const shared = resolveServerLogger(config);
6697
+ return {
6698
+ logger: shared.logger,
6699
+ onRequest: async (context, next) => {
6700
+ return runWithRequestContext(async () => {
6701
+ let structuredLogEmitted = false;
6702
+ context.locals.blypLog = createRequestScopedLogger(shared.logger, {
6703
+ resolveStructuredFields: () => ({
6704
+ method: context.request.method,
6705
+ path: context.url.pathname,
6706
+ ...resolveAdditionalProps(shared, createContext5(context))
6707
+ }),
6708
+ onStructuredEmit: () => {
6709
+ structuredLogEmitted = true;
6710
+ }
6711
+ });
6712
+ const startTime = performance.now();
6713
+ const path3 = context.url.pathname;
6714
+ const requestLike = createRequestLike(
6715
+ context.request.method,
6716
+ context.request.url,
6717
+ context.request.headers
6718
+ );
6719
+ try {
6720
+ const response = await next();
6721
+ if (structuredLogEmitted) {
6722
+ await flushServerLoggerSafely(shared);
6723
+ return response;
6724
+ }
6725
+ const statusCode = response.status;
6726
+ const loggerContext = createContext5(context, response);
6727
+ const responseTime = Math.round(performance.now() - startTime);
6728
+ if (isErrorStatus(statusCode)) {
6729
+ if (!shouldSkipErrorLogging(shared, path3)) {
6730
+ emitHttpErrorLog(
6731
+ shared.logger,
6732
+ shared.level,
6733
+ requestLike,
6734
+ path3,
6735
+ statusCode,
6736
+ responseTime,
6737
+ toErrorLike(void 0, statusCode),
6738
+ resolveAdditionalProps(shared, loggerContext)
6739
+ );
6740
+ }
6741
+ } else if (!shouldSkipAutoLogging(shared, loggerContext, path3)) {
6742
+ emitHttpRequestLog(
6743
+ shared.logger,
6744
+ shared.level,
6745
+ requestLike,
6746
+ path3,
6747
+ statusCode,
6748
+ responseTime,
6749
+ resolveAdditionalProps(shared, loggerContext)
6750
+ );
6751
+ }
6752
+ await flushServerLoggerSafely(shared);
6753
+ return response;
6754
+ } catch (error) {
6755
+ if (!structuredLogEmitted && !shouldSkipErrorLogging(shared, path3)) {
6756
+ emitHttpErrorLog(
6757
+ shared.logger,
6758
+ shared.level,
6759
+ requestLike,
6760
+ path3,
6761
+ 500,
6762
+ Math.round(performance.now() - startTime),
6763
+ toErrorLike(error, 500),
6764
+ resolveAdditionalProps(shared, createContext5(context, void 0, error)),
6765
+ { error }
6766
+ );
6767
+ }
6768
+ await flushServerLoggerSafely(shared);
6769
+ throw error;
6770
+ }
6771
+ });
6772
+ },
6773
+ clientLogHandler: async (context) => {
6774
+ const path3 = context.url.pathname;
6775
+ if (path3 !== shared.ingestionPath) {
6776
+ return new Response(
6777
+ JSON.stringify({
6778
+ error: `Mounted route path ${path3} does not match configured client logging path ${shared.ingestionPath}`
6779
+ }),
6780
+ {
6781
+ status: 500,
6782
+ headers: { "content-type": "application/json" }
6783
+ }
6784
+ );
6785
+ }
6786
+ const result = await handleClientLogIngestion({
6787
+ config: shared,
6788
+ ctx: createContext5(context),
6789
+ request: context.request,
6790
+ deliveryPath: path3
6791
+ });
6792
+ await flushServerLoggerSafely(shared);
6793
+ return new Response(null, {
6794
+ status: result.status,
6795
+ headers: result.headers
6796
+ });
6797
+ }
6798
+ };
6799
+ }
6800
+
6801
+ // src/frameworks/shared/h3.ts
6802
+ var BLYP_NITRO_STATE_KEY = /* @__PURE__ */ Symbol.for("blyp.nitro.state");
6803
+ function getNitroState(event) {
6804
+ return event.context[BLYP_NITRO_STATE_KEY];
6805
+ }
6806
+ function setNitroState(event, state) {
6807
+ event.context[BLYP_NITRO_STATE_KEY] = state;
6808
+ return state;
6809
+ }
6810
+ function getNitroMethod(event) {
6811
+ return event.method ?? event.node?.req?.method ?? event.request?.method ?? "GET";
6812
+ }
6813
+ function getNitroHeaders(event) {
6814
+ return event.headers ?? event.node?.req?.headers ?? event.request?.headers;
6815
+ }
6816
+ function getNitroUrl(event) {
6817
+ if (event.request?.url) {
6818
+ return event.request.url;
6819
+ }
6820
+ const path3 = event.url ?? event.path ?? event.node?.req?.url ?? "/";
6821
+ return buildAbsoluteUrl(path3, getNitroHeaders(event));
6822
+ }
6823
+ function getNitroPath(event) {
6824
+ if (typeof event.path === "string" && event.path.length > 0) {
6825
+ return event.path;
6826
+ }
6827
+ if (event.request?.url) {
6828
+ return new URL(event.request.url).pathname;
6829
+ }
6830
+ const requestUrl = event.url ?? event.node?.req?.url ?? "/";
6831
+ if (requestUrl.startsWith("http://") || requestUrl.startsWith("https://")) {
6832
+ return new URL(requestUrl).pathname;
6833
+ }
6834
+ const queryIndex = requestUrl.indexOf("?");
6835
+ return queryIndex >= 0 ? requestUrl.slice(0, queryIndex) : requestUrl;
6836
+ }
6837
+ function createNitroRequestLike(event) {
6838
+ return createRequestLike(getNitroMethod(event), getNitroUrl(event), getNitroHeaders(event));
6839
+ }
6840
+ function getNitroStatus(event, response, fallbackStatus = 200) {
6841
+ if (response instanceof Response) {
6842
+ return response.status;
6843
+ }
6844
+ if (typeof response?.status === "number") {
6845
+ return response.status;
6846
+ }
6847
+ if (typeof response?.statusCode === "number") {
6848
+ return response.statusCode;
6849
+ }
6850
+ if (typeof event.node?.res?.statusCode === "number" && event.node.res.statusCode > 0) {
6851
+ return event.node.res.statusCode;
6852
+ }
6853
+ return fallbackStatus;
6854
+ }
6855
+ async function readNitroBody(event) {
6856
+ if (event.body !== void 0) {
6857
+ return event.body;
6858
+ }
6859
+ if (event.request) {
6860
+ const contentType = event.request.headers.get("content-type") ?? "";
6861
+ if (contentType.includes("application/json")) {
6862
+ const fallbackRequest = event.request.clone();
6863
+ try {
6864
+ return await event.request.json();
6865
+ } catch {
6866
+ return await fallbackRequest.text();
6867
+ }
6868
+ }
6869
+ return await event.request.text();
6870
+ }
6871
+ if (event.node?.req) {
6872
+ return await readNodeRequestBody(event.node.req);
6873
+ }
6874
+ throw new Error("Unable to parse Nitro request body");
6875
+ }
6876
+
6877
+ // src/frameworks/nitro/logger.ts
6878
+ function createContext6(event, response, error) {
6879
+ return { event, response, error };
6880
+ }
6881
+ function buildFactory(shared) {
6882
+ const getLogger = (event) => event.context.blypLog ?? shared.logger;
6883
+ const logSuccess = async (event, response) => {
6884
+ const state = getNitroState(event);
6885
+ if (!state || state.structuredLogEmitted || state.errorLogged) {
6886
+ return;
6887
+ }
6888
+ const requestLike = createNitroRequestLike(event);
6889
+ const statusCode = getNitroStatus(event, response);
6890
+ const responseTime = Math.round(performance.now() - state.startTime);
6891
+ const loggerContext = createContext6(event, response);
6892
+ if (isErrorStatus(statusCode)) {
6893
+ if (!shouldSkipErrorLogging(shared, state.path)) {
6894
+ emitHttpErrorLog(
6895
+ shared.logger,
6896
+ shared.level,
6897
+ requestLike,
6898
+ state.path,
6899
+ statusCode,
6900
+ responseTime,
6901
+ toErrorLike(void 0, statusCode),
6902
+ resolveAdditionalProps(shared, loggerContext)
6903
+ );
6904
+ }
6905
+ } else if (!shouldSkipAutoLogging(shared, loggerContext, state.path)) {
6906
+ emitHttpRequestLog(
6907
+ shared.logger,
6908
+ shared.level,
6909
+ requestLike,
6910
+ state.path,
6911
+ statusCode,
6912
+ responseTime,
6913
+ resolveAdditionalProps(shared, loggerContext)
6914
+ );
6915
+ }
6916
+ };
6917
+ const logError = async (event, error, response) => {
6918
+ const state = getNitroState(event);
6919
+ if (!state || state.structuredLogEmitted || state.errorLogged || shouldSkipErrorLogging(shared, state.path)) {
6920
+ return;
6921
+ }
6922
+ state.errorLogged = true;
6923
+ emitHttpErrorLog(
6924
+ shared.logger,
6925
+ shared.level,
6926
+ createNitroRequestLike(event),
6927
+ state.path,
6928
+ getNitroStatus(event, response, 500),
6929
+ Math.round(performance.now() - state.startTime),
6930
+ toErrorLike(error, 500),
6931
+ resolveAdditionalProps(shared, createContext6(event, response, error)),
6932
+ { error }
6933
+ );
6934
+ };
6935
+ return {
6936
+ logger: shared.logger,
6937
+ getLogger,
6938
+ plugin: async (nitroApp) => {
6939
+ await nitroApp.hooks.hook("request", async (eventArg) => {
6940
+ const event = eventArg;
6941
+ enterRequestContext();
6942
+ const path3 = getNitroPath(event);
6943
+ let state = setNitroState(event, {
6944
+ startTime: performance.now(),
6945
+ path: path3,
6946
+ structuredLogEmitted: false
6947
+ });
6948
+ const scopedLogger = createRequestScopedLogger(shared.logger, {
6949
+ resolveStructuredFields: () => ({
6950
+ method: getNitroMethod(event),
6951
+ path: path3,
6952
+ ...resolveAdditionalProps(shared, createContext6(event))
6953
+ }),
6954
+ onStructuredEmit: () => {
6955
+ const currentState = getNitroState(event);
6956
+ if (currentState) {
6957
+ currentState.structuredLogEmitted = true;
6958
+ }
6959
+ }
6960
+ });
6961
+ event.context.blypLog = scopedLogger;
6962
+ state.scopedLogger = scopedLogger;
6963
+ });
6964
+ await nitroApp.hooks.hook("beforeResponse", async (eventArg, payload) => {
6965
+ await logSuccess(eventArg, payload);
6966
+ });
6967
+ await nitroApp.hooks.hook("afterResponse", async (eventArg) => {
6968
+ await flushServerLoggerSafely(shared);
6969
+ const state = getNitroState(eventArg);
6970
+ if (state) {
6971
+ state.errorLogged = true;
6972
+ }
6973
+ });
6974
+ await nitroApp.hooks.hook("error", async (errorArg, eventArg) => {
6975
+ if (eventArg && typeof eventArg === "object") {
6976
+ await logError(eventArg, errorArg);
6977
+ await flushServerLoggerSafely(shared);
6978
+ }
6979
+ });
6980
+ },
6981
+ clientLogHandler: async (event) => {
6982
+ const path3 = getNitroPath(event);
6983
+ if (path3 !== shared.ingestionPath) {
6984
+ return new Response(
6985
+ JSON.stringify({
6986
+ error: `Mounted route path ${path3} does not match configured client logging path ${shared.ingestionPath}`
6987
+ }),
6988
+ {
6989
+ status: 500,
6990
+ headers: { "content-type": "application/json" }
6991
+ }
6992
+ );
6993
+ }
6994
+ const body = await readNitroBody(event);
6995
+ const result = await handleClientLogIngestion({
6996
+ config: shared,
6997
+ ctx: createContext6(event),
6998
+ request: {
6999
+ ...createNitroRequestLike(event),
7000
+ json: async () => body
7001
+ },
7002
+ body,
7003
+ deliveryPath: path3
7004
+ });
7005
+ await flushServerLoggerSafely(shared);
7006
+ return new Response(null, {
7007
+ status: result.status,
7008
+ headers: result.headers
7009
+ });
7010
+ }
7011
+ };
7012
+ }
7013
+ function createNitroLogger(config = {}) {
7014
+ const shared = resolveServerLogger(config);
7015
+ return buildFactory(shared);
7016
+ }
7017
+
7018
+ // src/frameworks/nuxt/logger.ts
7019
+ function createNuxtLogger(config = {}) {
7020
+ const nitro = buildFactory(resolveServerLogger(config));
7021
+ return {
7022
+ logger: nitro.logger,
7023
+ serverPlugin: nitro.plugin,
7024
+ clientLogHandler: nitro.clientLogHandler,
7025
+ getLogger: (event) => nitro.getLogger(event)
7026
+ };
7027
+ }
7028
+
5973
7029
  // src/frameworks/nestjs/constants.ts
5974
7030
  var BLYP_NEST_LOGGER = /* @__PURE__ */ Symbol("BLYP_NEST_LOGGER");
5975
7031
  var BLYP_NEST_LOGGER_INIT_ERROR = "BlypModule.forRoot() requires createLogger(...) to run before NestFactory.create(AppModule).";
@@ -6417,7 +7473,7 @@ exports.BlypModule = __decorateClass([
6417
7473
  ], exports.BlypModule);
6418
7474
 
6419
7475
  // src/connectors/otlp/index.ts
6420
- function resolveSender4(config = { name: "" }) {
7476
+ function resolveSender5(config = { name: "" }) {
6421
7477
  const registry = createOTLPRegistry(resolveConfig({
6422
7478
  ...config.connectors ? { connectors: config.connectors } : {}
6423
7479
  }));
@@ -6488,10 +7544,10 @@ function createOTLPLoggerInstance(sender, bindings = {}) {
6488
7544
  };
6489
7545
  }
6490
7546
  function createOtlpLogger(config = { name: "" }) {
6491
- return createOTLPLoggerInstance(resolveSender4(config));
7547
+ return createOTLPLoggerInstance(resolveSender5(config));
6492
7548
  }
6493
7549
  function createStructuredOtlpLogger(groupId, initial, config) {
6494
- const sender = resolveSender4(config ?? { name: "" });
7550
+ const sender = resolveSender5(config ?? { name: "" });
6495
7551
  return createStructuredLog(groupId, {
6496
7552
  initialFields: initial,
6497
7553
  write: (payload, message) => {
@@ -6527,11 +7583,15 @@ exports.DEFAULT_FILE_CONFIG = DEFAULT_FILE_CONFIG;
6527
7583
  exports.DEFAULT_ROTATION_CONFIG = DEFAULT_ROTATION_CONFIG;
6528
7584
  exports.HTTP_CODES = HTTP_CODES2;
6529
7585
  exports.captureBetterStackException = captureBetterStackException;
7586
+ exports.captureDatabuddyException = captureDatabuddyException;
6530
7587
  exports.capturePosthogException = capturePosthogException;
6531
7588
  exports.colors = colors;
7589
+ exports.createAstroLogger = createAstroLogger;
6532
7590
  exports.createBaseLogger = createBaseLogger;
6533
7591
  exports.createBetterStackErrorTracker = createBetterStackErrorTracker;
6534
7592
  exports.createBetterStackLogger = createBetterStackLogger;
7593
+ exports.createDatabuddyErrorTracker = createDatabuddyErrorTracker;
7594
+ exports.createDatabuddyLogger = createDatabuddyLogger;
6535
7595
  exports.createDrizzleDatabaseAdapter = createDrizzleDatabaseAdapter;
6536
7596
  exports.createElysiaLogger = createElysiaLogger;
6537
7597
  exports.createError = createError;
@@ -6543,14 +7603,18 @@ exports.createLogDir = createLogDir;
6543
7603
  exports.createLogger = createElysiaLogger;
6544
7604
  exports.createNestLogger = createNestLogger;
6545
7605
  exports.createNextJsLogger = createNextJsLogger;
7606
+ exports.createNitroLogger = createNitroLogger;
7607
+ exports.createNuxtLogger = createNuxtLogger;
6546
7608
  exports.createOtlpLogger = createOtlpLogger;
6547
7609
  exports.createPosthogErrorTracker = createPosthogErrorTracker;
6548
7610
  exports.createPosthogLogger = createPosthogLogger;
6549
7611
  exports.createPrismaDatabaseAdapter = createPrismaDatabaseAdapter;
7612
+ exports.createReactRouterLogger = createReactRouterLogger;
6550
7613
  exports.createRuntimeAdapter = createRuntimeAdapter;
6551
7614
  exports.createSentryLogger = createSentryLogger;
6552
7615
  exports.createStandaloneLogger = createStandaloneLogger;
6553
7616
  exports.createStructuredBetterStackLogger = createStructuredBetterStackLogger;
7617
+ exports.createStructuredDatabuddyLogger = createStructuredDatabuddyLogger;
6554
7618
  exports.createStructuredLog = createStructuredLog2;
6555
7619
  exports.createStructuredOtlpLogger = createStructuredOtlpLogger;
6556
7620
  exports.createStructuredPosthogLogger = createStructuredPosthogLogger;