@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
@@ -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');
@@ -164,6 +165,7 @@ function hasNonEmptyString(value) {
164
165
  var DEFAULT_CLIENT_LOG_ENDPOINT = "/inngest";
165
166
  zod.z.union([
166
167
  zod.z.literal("betterstack"),
168
+ zod.z.literal("databuddy"),
167
169
  zod.z.literal("posthog"),
168
170
  zod.z.literal("sentry"),
169
171
  zod.z.undefined(),
@@ -174,16 +176,16 @@ zod.z.union([
174
176
  ]);
175
177
 
176
178
  // src/shared/once.ts
177
- function createConsoleOnceLogger(method, warnedKeys6 = /* @__PURE__ */ new Set()) {
179
+ function createConsoleOnceLogger(method, warnedKeys7 = /* @__PURE__ */ new Set()) {
178
180
  return (key, message, error) => {
179
- if (warnedKeys6.has(key) || typeof console === "undefined") {
181
+ if (warnedKeys7.has(key) || typeof console === "undefined") {
180
182
  return;
181
183
  }
182
184
  const writer = console[method];
183
185
  if (typeof writer !== "function") {
184
186
  return;
185
187
  }
186
- warnedKeys6.add(key);
188
+ warnedKeys7.add(key);
187
189
  if (error === void 0) {
188
190
  writer.call(console, message);
189
191
  return;
@@ -191,11 +193,11 @@ function createConsoleOnceLogger(method, warnedKeys6 = /* @__PURE__ */ new Set()
191
193
  writer.call(console, message, error);
192
194
  };
193
195
  }
194
- function createWarnOnceLogger(warnedKeys6) {
195
- return createConsoleOnceLogger("warn", warnedKeys6);
196
+ function createWarnOnceLogger(warnedKeys7) {
197
+ return createConsoleOnceLogger("warn", warnedKeys7);
196
198
  }
197
- function createErrorOnceLogger(warnedKeys6) {
198
- return createConsoleOnceLogger("error", warnedKeys6);
199
+ function createErrorOnceLogger(warnedKeys7) {
200
+ return createConsoleOnceLogger("error", warnedKeys7);
199
201
  }
200
202
 
201
203
  // src/core/config.ts
@@ -561,6 +563,28 @@ function mergePostHogConnectorConfig(base, override) {
561
563
  }
562
564
  };
563
565
  }
566
+ function mergeDatabuddyConnectorConfig(base, override) {
567
+ const enabled = override?.enabled ?? base?.enabled ?? false;
568
+ const apiKey = override?.apiKey ?? base?.apiKey;
569
+ const websiteId = override?.websiteId ?? base?.websiteId;
570
+ const ready = enabled && hasNonEmptyString(apiKey) && hasNonEmptyString(websiteId);
571
+ return {
572
+ enabled,
573
+ mode: override?.mode ?? base?.mode ?? "auto",
574
+ apiKey,
575
+ websiteId,
576
+ namespace: override?.namespace ?? base?.namespace,
577
+ source: override?.source ?? base?.source,
578
+ apiUrl: override?.apiUrl ?? base?.apiUrl,
579
+ debug: override?.debug ?? base?.debug ?? false,
580
+ enableBatching: override?.enableBatching ?? base?.enableBatching ?? true,
581
+ batchSize: override?.batchSize ?? base?.batchSize,
582
+ batchTimeout: override?.batchTimeout ?? base?.batchTimeout,
583
+ maxQueueSize: override?.maxQueueSize ?? base?.maxQueueSize,
584
+ ready,
585
+ status: ready ? "enabled" : "missing"
586
+ };
587
+ }
564
588
  function mergeBetterStackConnectorConfig(base, override) {
565
589
  const sourceToken = override?.sourceToken ?? base?.sourceToken;
566
590
  const ingestingHost = override?.ingestingHost ?? base?.ingestingHost;
@@ -651,6 +675,7 @@ function mergeOTLPConnectorsConfig(base, override) {
651
675
  function mergeConnectorsConfig(base, override) {
652
676
  return {
653
677
  betterstack: mergeBetterStackConnectorConfig(base?.betterstack, override?.betterstack),
678
+ databuddy: mergeDatabuddyConnectorConfig(base?.databuddy, override?.databuddy),
654
679
  posthog: mergePostHogConnectorConfig(base?.posthog, override?.posthog),
655
680
  sentry: mergeSentryConnectorConfig(base?.sentry, override?.sentry),
656
681
  otlp: mergeOTLPConnectorsConfig(base?.otlp, override?.otlp)
@@ -1746,10 +1771,318 @@ function createBetterStackSender(config) {
1746
1771
  }
1747
1772
  };
1748
1773
  }
1749
- var PREVIOUSLY_CAPTURED_ERROR_KEY2 = "__posthog_previously_captured_error";
1750
1774
  var warnedKeys3 = /* @__PURE__ */ new Set();
1775
+ var senderCache = /* @__PURE__ */ new Map();
1751
1776
  var testHooks2 = {};
1752
1777
  var warnOnce4 = createErrorOnceLogger(warnedKeys3);
1778
+ function registerShutdownHooks2(key, shutdown) {
1779
+ const handlers = ["beforeExit", "SIGINT", "SIGTERM"];
1780
+ for (const event of handlers) {
1781
+ process.once(event, () => {
1782
+ void shutdown().catch((error) => {
1783
+ warnOnce4(
1784
+ `${key}:shutdown`,
1785
+ "[Blyp] Failed to flush Databuddy telemetry during shutdown.",
1786
+ error
1787
+ );
1788
+ });
1789
+ });
1790
+ }
1791
+ }
1792
+ function resolveConnectorConfig2(config) {
1793
+ const connector = isBlypConfig(config) ? config.connectors?.databuddy : config;
1794
+ const enabled = connector?.enabled ?? false;
1795
+ const apiKey = connector?.apiKey;
1796
+ const websiteId = connector?.websiteId;
1797
+ const ready = enabled && hasNonEmptyString(apiKey) && hasNonEmptyString(websiteId);
1798
+ return {
1799
+ enabled,
1800
+ mode: connector?.mode ?? "auto",
1801
+ apiKey,
1802
+ websiteId,
1803
+ namespace: connector?.namespace,
1804
+ source: connector?.source,
1805
+ apiUrl: connector?.apiUrl,
1806
+ debug: connector?.debug ?? false,
1807
+ enableBatching: connector?.enableBatching ?? true,
1808
+ batchSize: connector?.batchSize,
1809
+ batchTimeout: connector?.batchTimeout,
1810
+ maxQueueSize: connector?.maxQueueSize,
1811
+ ready,
1812
+ status: ready ? "enabled" : "missing"
1813
+ };
1814
+ }
1815
+ function createDefaultClient2(connector) {
1816
+ return new node$1.Databuddy({
1817
+ apiKey: connector.apiKey ?? "",
1818
+ ...connector.websiteId ? { websiteId: connector.websiteId } : {},
1819
+ ...connector.namespace ? { namespace: connector.namespace } : {},
1820
+ ...connector.source ? { source: connector.source } : {},
1821
+ ...connector.apiUrl ? { apiUrl: connector.apiUrl } : {},
1822
+ debug: connector.debug,
1823
+ enableBatching: connector.enableBatching,
1824
+ ...connector.batchSize !== void 0 ? { batchSize: connector.batchSize } : {},
1825
+ ...connector.batchTimeout !== void 0 ? { batchTimeout: connector.batchTimeout } : {},
1826
+ ...connector.maxQueueSize !== void 0 ? { maxQueueSize: connector.maxQueueSize } : {}
1827
+ });
1828
+ }
1829
+ function getDatabuddySenderKey(connector) {
1830
+ return JSON.stringify({
1831
+ enabled: connector.enabled,
1832
+ mode: connector.mode,
1833
+ apiKey: connector.apiKey ?? null,
1834
+ websiteId: connector.websiteId ?? null,
1835
+ namespace: connector.namespace ?? null,
1836
+ source: connector.source ?? null,
1837
+ apiUrl: connector.apiUrl ?? null,
1838
+ debug: connector.debug,
1839
+ enableBatching: connector.enableBatching,
1840
+ batchSize: connector.batchSize ?? null,
1841
+ batchTimeout: connector.batchTimeout ?? null,
1842
+ maxQueueSize: connector.maxQueueSize ?? null
1843
+ });
1844
+ }
1845
+ function getSessionId(record) {
1846
+ const direct = getField(record, "sessionId");
1847
+ if (hasNonEmptyString(direct)) {
1848
+ return direct;
1849
+ }
1850
+ return getClientSessionField(record, "sessionId");
1851
+ }
1852
+ function getAnonymousId(record) {
1853
+ const direct = getField(record, "anonymousId");
1854
+ if (hasNonEmptyString(direct)) {
1855
+ return direct;
1856
+ }
1857
+ const payload = getPrimaryPayload(record);
1858
+ if (isPlainObject(payload.metadata) && hasNonEmptyString(payload.metadata.databuddyAnonymousId)) {
1859
+ return payload.metadata.databuddyAnonymousId;
1860
+ }
1861
+ return void 0;
1862
+ }
1863
+ function getDatabuddyEventName(record) {
1864
+ const recordType = getRecordType(record);
1865
+ if (hasNonEmptyString(recordType)) {
1866
+ return recordType;
1867
+ }
1868
+ return "log";
1869
+ }
1870
+ function buildRecordProperties(record, source) {
1871
+ const properties = {
1872
+ blyp_level: record.level,
1873
+ blyp_source: source,
1874
+ blyp_payload: serializeLogRecord(record),
1875
+ message: typeof record.message === "string" ? record.message : String(record.message)
1876
+ };
1877
+ const caller = typeof record.caller === "string" ? record.caller : void 0;
1878
+ const groupId = getField(record, "groupId");
1879
+ const method = getField(record, "method");
1880
+ const path3 = getField(record, "path");
1881
+ const status = getField(record, "status");
1882
+ const duration = getField(record, "duration");
1883
+ const pagePath = getClientPageField(record, "pathname");
1884
+ const pageUrl = getClientPageField(record, "url");
1885
+ const sessionId = getClientSessionField(record, "sessionId");
1886
+ const pageId = getClientSessionField(record, "pageId");
1887
+ const ifTruthy = [
1888
+ ["blyp_type", getRecordType(record)],
1889
+ ["caller", caller],
1890
+ ["group_id", groupId],
1891
+ ["method", method],
1892
+ ["path", path3],
1893
+ ["page_path", pagePath],
1894
+ ["page_url", pageUrl],
1895
+ ["session_id", sessionId],
1896
+ ["page_id", pageId]
1897
+ ];
1898
+ const ifDefined = [
1899
+ ["status_code", status],
1900
+ ["duration_ms", duration]
1901
+ ];
1902
+ for (const [key, value] of ifTruthy) {
1903
+ if (value) {
1904
+ properties[key] = value;
1905
+ }
1906
+ }
1907
+ for (const [key, value] of ifDefined) {
1908
+ if (value !== void 0) {
1909
+ properties[key] = value;
1910
+ }
1911
+ }
1912
+ return properties;
1913
+ }
1914
+ function createTrackEvent(record, source) {
1915
+ return {
1916
+ name: getDatabuddyEventName(record),
1917
+ anonymousId: getAnonymousId(record),
1918
+ sessionId: getSessionId(record),
1919
+ properties: buildRecordProperties(record, source)
1920
+ };
1921
+ }
1922
+ function normalizeExceptionProperties(value) {
1923
+ if (!isPlainObject(value)) {
1924
+ return {};
1925
+ }
1926
+ return normalizeLogValue(value);
1927
+ }
1928
+ function normalizeExceptionInput2(value, fallbackMessage) {
1929
+ if (value instanceof Error) {
1930
+ return {
1931
+ message: value.message || fallbackMessage,
1932
+ properties: {
1933
+ error_type: value.name,
1934
+ ...value.stack ? { stack: value.stack } : {},
1935
+ ...normalizeExceptionProperties(value)
1936
+ }
1937
+ };
1938
+ }
1939
+ if (isPlainObject(value)) {
1940
+ const message = hasNonEmptyString(value.message) ? value.message : hasNonEmptyString(value.error) ? value.error : fallbackMessage;
1941
+ return {
1942
+ message,
1943
+ properties: normalizeExceptionProperties(value)
1944
+ };
1945
+ }
1946
+ if (typeof value === "string") {
1947
+ return {
1948
+ message: value,
1949
+ properties: {
1950
+ message: value
1951
+ }
1952
+ };
1953
+ }
1954
+ return {
1955
+ message: fallbackMessage,
1956
+ properties: {
1957
+ value: normalizeLogValue(value)
1958
+ }
1959
+ };
1960
+ }
1961
+ function createDatabuddySender(config) {
1962
+ const connector = resolveConnectorConfig2(config);
1963
+ const senderKey = getDatabuddySenderKey(connector);
1964
+ const cached = senderCache.get(senderKey);
1965
+ if (cached) {
1966
+ return cached;
1967
+ }
1968
+ const key = `${connector.apiUrl ?? "default"}:${connector.mode}:${connector.apiKey ?? "missing"}`;
1969
+ const client = connector.ready ? testHooks2.createClient?.(connector) ?? createDefaultClient2(connector) : void 0;
1970
+ if (client) {
1971
+ registerShutdownHooks2(key, async () => {
1972
+ await client.flush();
1973
+ });
1974
+ }
1975
+ const emitUnavailableWarning = () => {
1976
+ warnOnce4(
1977
+ `databuddy-unavailable:${key}`,
1978
+ "[Blyp] Databuddy connector is not configured. Databuddy requires both apiKey and websiteId. Skipping Databuddy delivery."
1979
+ );
1980
+ };
1981
+ const emitExceptionUnavailableWarning = () => {
1982
+ warnOnce4(
1983
+ `databuddy-exception-unavailable:${key}`,
1984
+ "[Blyp] Databuddy error tracking is not configured. Databuddy requires both apiKey and websiteId. Skipping Databuddy exception capture."
1985
+ );
1986
+ };
1987
+ const sender = {
1988
+ enabled: connector.enabled,
1989
+ ready: connector.ready,
1990
+ mode: connector.mode,
1991
+ status: connector.status,
1992
+ shouldAutoForwardServerLogs() {
1993
+ return connector.ready && connector.mode === "auto";
1994
+ },
1995
+ shouldAutoCaptureExceptions() {
1996
+ return connector.ready && connector.mode === "auto";
1997
+ },
1998
+ send(record, options = {}) {
1999
+ if (!connector.ready || !client) {
2000
+ if (options.warnIfUnavailable) {
2001
+ emitUnavailableWarning();
2002
+ }
2003
+ return;
2004
+ }
2005
+ try {
2006
+ const result = client.track(createTrackEvent(record, options.source ?? "server"));
2007
+ if (result && typeof result.catch === "function") {
2008
+ void result.catch((error) => {
2009
+ warnOnce4(
2010
+ `databuddy-send:${key}`,
2011
+ "[Blyp] Failed to deliver log to Databuddy.",
2012
+ error
2013
+ );
2014
+ });
2015
+ }
2016
+ } catch (error) {
2017
+ warnOnce4(
2018
+ `databuddy-send:${key}`,
2019
+ "[Blyp] Failed to deliver log to Databuddy.",
2020
+ error
2021
+ );
2022
+ }
2023
+ },
2024
+ captureException(error, options = {}) {
2025
+ if (!connector.ready || !client) {
2026
+ if (options.warnIfUnavailable) {
2027
+ emitExceptionUnavailableWarning();
2028
+ }
2029
+ return;
2030
+ }
2031
+ const normalized = normalizeExceptionInput2(
2032
+ error,
2033
+ options.source === "client" ? "Client error" : "Server error"
2034
+ );
2035
+ try {
2036
+ const result = client.track({
2037
+ name: "error",
2038
+ anonymousId: options.anonymousId,
2039
+ sessionId: options.sessionId,
2040
+ properties: {
2041
+ message: normalized.message,
2042
+ blyp_source: options.source ?? "server",
2043
+ blyp_level: "error",
2044
+ ...normalized.properties,
2045
+ ...options.properties ?? {}
2046
+ }
2047
+ });
2048
+ if (result && typeof result.catch === "function") {
2049
+ void result.catch((captureError) => {
2050
+ warnOnce4(
2051
+ `databuddy-capture:${key}`,
2052
+ "[Blyp] Failed to capture exception in Databuddy.",
2053
+ captureError
2054
+ );
2055
+ });
2056
+ }
2057
+ } catch (captureError) {
2058
+ warnOnce4(
2059
+ `databuddy-capture:${key}`,
2060
+ "[Blyp] Failed to capture exception in Databuddy.",
2061
+ captureError
2062
+ );
2063
+ }
2064
+ },
2065
+ async flush() {
2066
+ try {
2067
+ if (client) {
2068
+ await client.flush();
2069
+ }
2070
+ } catch (error) {
2071
+ warnOnce4(
2072
+ `databuddy-flush:${key}`,
2073
+ "[Blyp] Failed to flush Databuddy telemetry.",
2074
+ error
2075
+ );
2076
+ }
2077
+ }
2078
+ };
2079
+ senderCache.set(senderKey, sender);
2080
+ return sender;
2081
+ }
2082
+ var PREVIOUSLY_CAPTURED_ERROR_KEY2 = "__posthog_previously_captured_error";
2083
+ var warnedKeys4 = /* @__PURE__ */ new Set();
2084
+ var testHooks3 = {};
2085
+ var warnOnce5 = createErrorOnceLogger(warnedKeys4);
1753
2086
  function normalizeHost(host) {
1754
2087
  const trimmed = (host || "https://us.i.posthog.com").trim();
1755
2088
  return trimmed.replace(/\/+$/, "");
@@ -1790,7 +2123,7 @@ function buildRecordAttributes(record, source) {
1790
2123
  for (const [k, v] of ifDefined) if (v !== void 0) attributes[k] = v;
1791
2124
  return attributes;
1792
2125
  }
1793
- function normalizeExceptionProperties(value) {
2126
+ function normalizeExceptionProperties2(value) {
1794
2127
  if (!isPlainObject(value)) {
1795
2128
  return {};
1796
2129
  }
@@ -1822,18 +2155,18 @@ function createSyntheticError(message, source) {
1822
2155
  assignExceptionField(error, "details", source.details);
1823
2156
  return error;
1824
2157
  }
1825
- function normalizeExceptionInput2(input, fallbackMessage = "Unknown error") {
2158
+ function normalizeExceptionInput3(input, fallbackMessage = "Unknown error") {
1826
2159
  if (input instanceof Error) {
1827
2160
  return {
1828
2161
  error: input,
1829
- properties: normalizeExceptionProperties(input)
2162
+ properties: normalizeExceptionProperties2(input)
1830
2163
  };
1831
2164
  }
1832
2165
  if (isPlainObject(input)) {
1833
2166
  const message = hasNonEmptyString(input.message) ? input.message : hasNonEmptyString(input.error) ? input.error : fallbackMessage;
1834
2167
  return {
1835
2168
  error: createSyntheticError(message, input),
1836
- properties: normalizeExceptionProperties(input)
2169
+ properties: normalizeExceptionProperties2(input)
1837
2170
  };
1838
2171
  }
1839
2172
  if (typeof input === "string") {
@@ -1906,12 +2239,12 @@ function resolveSeverity(level) {
1906
2239
  return { text: "info", number: apiLogs.SeverityNumber.INFO };
1907
2240
  }
1908
2241
  }
1909
- function registerShutdownHooks2(key, shutdown) {
2242
+ function registerShutdownHooks3(key, shutdown) {
1910
2243
  const handlers = ["beforeExit", "SIGINT", "SIGTERM"];
1911
2244
  for (const event of handlers) {
1912
2245
  process.once(event, () => {
1913
2246
  void shutdown().catch((error) => {
1914
- warnOnce4(
2247
+ warnOnce5(
1915
2248
  `${key}:shutdown`,
1916
2249
  "[Blyp] Failed to flush PostHog telemetry during shutdown.",
1917
2250
  error
@@ -1965,7 +2298,7 @@ function createDefaultExceptionClient(connector) {
1965
2298
  }
1966
2299
  };
1967
2300
  }
1968
- function resolveConnectorConfig2(config) {
2301
+ function resolveConnectorConfig3(config) {
1969
2302
  const connector = isBlypConfig(config) ? config.connectors?.posthog : config;
1970
2303
  const enabled = connector?.enabled ?? false;
1971
2304
  const projectKey = connector?.projectKey;
@@ -1988,11 +2321,11 @@ function resolveConnectorConfig2(config) {
1988
2321
  };
1989
2322
  }
1990
2323
  function createPostHogSender(config) {
1991
- const connector = resolveConnectorConfig2(config);
2324
+ const connector = resolveConnectorConfig3(config);
1992
2325
  const key = `${connector.serviceName}:${connector.host}:${connector.mode}`;
1993
2326
  const ready = connector.enabled === true && hasNonEmptyString(connector.projectKey);
1994
- const transport = ready ? testHooks2.createTransport?.(connector) ?? createDefaultTransport(connector) : void 0;
1995
- const exceptionClient = connector.errorTracking.ready ? testHooks2.createExceptionClient?.(connector) ?? createDefaultExceptionClient(connector) : void 0;
2327
+ const transport = ready ? testHooks3.createTransport?.(connector) ?? createDefaultTransport(connector) : void 0;
2328
+ const exceptionClient = connector.errorTracking.ready ? testHooks3.createExceptionClient?.(connector) ?? createDefaultExceptionClient(connector) : void 0;
1996
2329
  const shutdown = async () => {
1997
2330
  if (transport?.shutdown) {
1998
2331
  await transport.shutdown();
@@ -2004,16 +2337,16 @@ function createPostHogSender(config) {
2004
2337
  }
2005
2338
  };
2006
2339
  if (transport || exceptionClient) {
2007
- registerShutdownHooks2(key, shutdown);
2340
+ registerShutdownHooks3(key, shutdown);
2008
2341
  }
2009
2342
  const emitUnavailableWarning = () => {
2010
- warnOnce4(
2343
+ warnOnce5(
2011
2344
  `posthog-unavailable:${key}`,
2012
2345
  "[Blyp] PostHog connector is not configured. Skipping PostHog delivery."
2013
2346
  );
2014
2347
  };
2015
2348
  const emitExceptionUnavailableWarning = () => {
2016
- warnOnce4(
2349
+ warnOnce5(
2017
2350
  `posthog-exception-unavailable:${key}`,
2018
2351
  "[Blyp] PostHog error tracking is not configured. Skipping PostHog exception capture."
2019
2352
  );
@@ -2051,7 +2384,7 @@ function createPostHogSender(config) {
2051
2384
  const result = transport.emit(normalized);
2052
2385
  if (result && typeof result.catch === "function") {
2053
2386
  void result.catch((error) => {
2054
- warnOnce4(
2387
+ warnOnce5(
2055
2388
  `posthog-emit:${key}`,
2056
2389
  "[Blyp] Failed to deliver log to PostHog.",
2057
2390
  error
@@ -2059,7 +2392,7 @@ function createPostHogSender(config) {
2059
2392
  });
2060
2393
  }
2061
2394
  } catch (error) {
2062
- warnOnce4(
2395
+ warnOnce5(
2063
2396
  `posthog-emit:${key}`,
2064
2397
  "[Blyp] Failed to deliver log to PostHog.",
2065
2398
  error
@@ -2076,7 +2409,7 @@ function createPostHogSender(config) {
2076
2409
  if (isPreviouslyCapturedPostHogError(error)) {
2077
2410
  return;
2078
2411
  }
2079
- const normalized = normalizeExceptionInput2(
2412
+ const normalized = normalizeExceptionInput3(
2080
2413
  error,
2081
2414
  options.source === "client" ? "Client error" : "Server error"
2082
2415
  );
@@ -2095,7 +2428,7 @@ function createPostHogSender(config) {
2095
2428
  markPostHogCapturedError(normalized.error);
2096
2429
  if (result && typeof result.catch === "function") {
2097
2430
  void result.catch((captureError) => {
2098
- warnOnce4(
2431
+ warnOnce5(
2099
2432
  `posthog-capture:${key}`,
2100
2433
  "[Blyp] Failed to capture exception in PostHog.",
2101
2434
  captureError
@@ -2103,7 +2436,7 @@ function createPostHogSender(config) {
2103
2436
  });
2104
2437
  }
2105
2438
  } catch (captureError) {
2106
- warnOnce4(
2439
+ warnOnce5(
2107
2440
  `posthog-capture:${key}`,
2108
2441
  "[Blyp] Failed to capture exception in PostHog.",
2109
2442
  captureError
@@ -2116,7 +2449,7 @@ function createPostHogSender(config) {
2116
2449
  await transport.flush();
2117
2450
  }
2118
2451
  } catch (error) {
2119
- warnOnce4(
2452
+ warnOnce5(
2120
2453
  `posthog-flush:${key}`,
2121
2454
  "[Blyp] Failed to flush PostHog telemetry.",
2122
2455
  error
@@ -2125,13 +2458,13 @@ function createPostHogSender(config) {
2125
2458
  }
2126
2459
  };
2127
2460
  }
2128
- var warnedKeys4 = /* @__PURE__ */ new Set();
2129
- var testHooks3 = {};
2130
- var warnOnce5 = createErrorOnceLogger(warnedKeys4);
2461
+ var warnedKeys5 = /* @__PURE__ */ new Set();
2462
+ var testHooks4 = {};
2463
+ var warnOnce6 = createErrorOnceLogger(warnedKeys5);
2131
2464
  function getSentryModule2() {
2132
- return testHooks3.module ?? Sentry__namespace;
2465
+ return testHooks4.module ?? Sentry__namespace;
2133
2466
  }
2134
- function resolveConnectorConfig3(config) {
2467
+ function resolveConnectorConfig4(config) {
2135
2468
  const connector = isBlypConfig(config) ? config.connectors?.sentry : config;
2136
2469
  const enabled = connector?.enabled ?? false;
2137
2470
  const dsn = connector?.dsn;
@@ -2276,7 +2609,7 @@ function hasConfigMismatch(connector, client) {
2276
2609
  return hasNonEmptyString(connector.dsn) && connector.dsn !== options.dsn || hasNonEmptyString(connector.environment) && connector.environment !== options.environment || hasNonEmptyString(connector.release) && connector.release !== options.release;
2277
2610
  }
2278
2611
  function createSentrySender(config) {
2279
- const connector = resolveConnectorConfig3(config);
2612
+ const connector = resolveConnectorConfig4(config);
2280
2613
  const key = `${connector.mode}:${connector.dsn ?? "missing"}`;
2281
2614
  const module = getSentryModule2();
2282
2615
  let client = connector.enabled ? module.getClient() : void 0;
@@ -2290,7 +2623,7 @@ function createSentrySender(config) {
2290
2623
  });
2291
2624
  client = module.getClient();
2292
2625
  } catch (error) {
2293
- warnOnce5(
2626
+ warnOnce6(
2294
2627
  `sentry-init:${key}`,
2295
2628
  "[Blyp] Failed to initialize Sentry. Skipping Sentry delivery.",
2296
2629
  error
@@ -2298,14 +2631,14 @@ function createSentrySender(config) {
2298
2631
  }
2299
2632
  }
2300
2633
  if (client && hasConfigMismatch(connector, client)) {
2301
- warnOnce5(
2634
+ warnOnce6(
2302
2635
  `sentry-mismatch:${key}`,
2303
2636
  "[Blyp] Sentry is already initialized with different options. Reusing the existing Sentry client."
2304
2637
  );
2305
2638
  }
2306
2639
  const ready = connector.enabled && client !== void 0;
2307
2640
  const emitUnavailableWarning = () => {
2308
- warnOnce5(
2641
+ warnOnce6(
2309
2642
  `sentry-unavailable:${key}`,
2310
2643
  "[Blyp] Sentry connector is not configured. Skipping Sentry delivery."
2311
2644
  );
@@ -2331,7 +2664,7 @@ function createSentrySender(config) {
2331
2664
  try {
2332
2665
  logMethod(record.message, attributes);
2333
2666
  } catch (error) {
2334
- warnOnce5(
2667
+ warnOnce6(
2335
2668
  `sentry-log:${key}`,
2336
2669
  "[Blyp] Failed to deliver log to Sentry.",
2337
2670
  error
@@ -2349,7 +2682,7 @@ function createSentrySender(config) {
2349
2682
  module.captureException(exception);
2350
2683
  });
2351
2684
  } catch (error) {
2352
- warnOnce5(
2685
+ warnOnce6(
2353
2686
  `sentry-exception:${key}`,
2354
2687
  "[Blyp] Failed to capture exception in Sentry.",
2355
2688
  error
@@ -2360,7 +2693,7 @@ function createSentrySender(config) {
2360
2693
  try {
2361
2694
  await module.flush(2e3);
2362
2695
  } catch (error) {
2363
- warnOnce5(
2696
+ warnOnce6(
2364
2697
  `sentry-flush:${key}`,
2365
2698
  "[Blyp] Failed to flush Sentry logs.",
2366
2699
  error
@@ -2369,9 +2702,9 @@ function createSentrySender(config) {
2369
2702
  }
2370
2703
  };
2371
2704
  }
2372
- var warnedKeys5 = /* @__PURE__ */ new Set();
2373
- var testHooks4 = {};
2374
- var warnOnce6 = createErrorOnceLogger(warnedKeys5);
2705
+ var warnedKeys6 = /* @__PURE__ */ new Set();
2706
+ var testHooks5 = {};
2707
+ var warnOnce7 = createErrorOnceLogger(warnedKeys6);
2375
2708
  function normalizeOTLPRecord(record, connector, source = "server") {
2376
2709
  const severity = resolveSeverity2(record.level);
2377
2710
  const body = typeof record.message === "string" ? record.message : String(record.message);
@@ -2436,14 +2769,14 @@ function resolveSeverity2(level) {
2436
2769
  return { text: "info", number: apiLogs.SeverityNumber.INFO };
2437
2770
  }
2438
2771
  }
2439
- function registerShutdownHooks3(key, shutdown) {
2772
+ function registerShutdownHooks4(key, shutdown) {
2440
2773
  const handlers = ["beforeExit", "SIGINT", "SIGTERM"];
2441
2774
  for (const event of handlers) {
2442
2775
  process.once(event, async () => {
2443
2776
  try {
2444
2777
  await shutdown();
2445
2778
  } catch (error) {
2446
- warnOnce6(
2779
+ warnOnce7(
2447
2780
  `${key}:shutdown`,
2448
2781
  "[Blyp] Failed to flush OTLP logs during shutdown.",
2449
2782
  error
@@ -2520,7 +2853,7 @@ function createUnavailableSender(name, connector) {
2520
2853
  const senderName = name || connector?.name || "otlp";
2521
2854
  const key = `${senderName}:${connector?.serviceName ?? "blyp-app"}:${connector?.endpoint ?? "missing"}`;
2522
2855
  const emitUnavailableWarning = () => {
2523
- warnOnce6(
2856
+ warnOnce7(
2524
2857
  `otlp-unavailable:${key}`,
2525
2858
  `[Blyp] OTLP target "${senderName}" is not configured or not ready. Skipping OTLP delivery.`
2526
2859
  );
@@ -2551,7 +2884,7 @@ function createSender(connector) {
2551
2884
  ...connector,
2552
2885
  headers: resolveTransportHeaders(connector)
2553
2886
  };
2554
- const transport = testHooks4.createTransport?.(transportConnector) ?? createDefaultTransport2(transportConnector);
2887
+ const transport = testHooks5.createTransport?.(transportConnector) ?? createDefaultTransport2(transportConnector);
2555
2888
  return {
2556
2889
  name: connector.name,
2557
2890
  enabled: connector.enabled,
@@ -2567,7 +2900,7 @@ function createSender(connector) {
2567
2900
  const result = transport.emit(normalized);
2568
2901
  if (result && typeof result.catch === "function") {
2569
2902
  void result.catch((error) => {
2570
- warnOnce6(
2903
+ warnOnce7(
2571
2904
  `otlp-emit:${key}`,
2572
2905
  `[Blyp] Failed to deliver log to OTLP target "${connector.name}".`,
2573
2906
  error
@@ -2575,7 +2908,7 @@ function createSender(connector) {
2575
2908
  });
2576
2909
  }
2577
2910
  } catch (error) {
2578
- warnOnce6(
2911
+ warnOnce7(
2579
2912
  `otlp-emit:${key}`,
2580
2913
  `[Blyp] Failed to deliver log to OTLP target "${connector.name}".`,
2581
2914
  error
@@ -2588,7 +2921,7 @@ function createSender(connector) {
2588
2921
  await transport.flush();
2589
2922
  }
2590
2923
  } catch (error) {
2591
- warnOnce6(
2924
+ warnOnce7(
2592
2925
  `otlp-flush:${key}`,
2593
2926
  `[Blyp] Failed to flush OTLP logs for target "${connector.name}".`,
2594
2927
  error
@@ -2617,7 +2950,7 @@ function createOTLPRegistry(config) {
2617
2950
  await Promise.all(Array.from(senders.values()).map((sender) => sender.flush()));
2618
2951
  }
2619
2952
  };
2620
- registerShutdownHooks3("otlp-registry", () => registry.flush());
2953
+ registerShutdownHooks4("otlp-registry", () => registry.flush());
2621
2954
  return registry;
2622
2955
  }
2623
2956
  var _RuntimeDetector = class _RuntimeDetector {
@@ -3051,6 +3384,18 @@ function maybeSendToBetterStack(betterstack, record) {
3051
3384
  }
3052
3385
  betterstack.send(record, { source: "server", warnIfUnavailable: true });
3053
3386
  }
3387
+ function maybeSendToDatabuddy(databuddy, record) {
3388
+ if (isClientLogRecord(record)) {
3389
+ return;
3390
+ }
3391
+ if (!databuddy.shouldAutoForwardServerLogs()) {
3392
+ if (databuddy.enabled && !databuddy.ready) {
3393
+ databuddy.send(record, { source: "server", warnIfUnavailable: true });
3394
+ }
3395
+ return;
3396
+ }
3397
+ databuddy.send(record, { source: "server", warnIfUnavailable: true });
3398
+ }
3054
3399
  function maybeSendToSentry(sentry, record) {
3055
3400
  if (isClientLogRecord(record)) {
3056
3401
  return;
@@ -3071,7 +3416,7 @@ function maybeSendToOTLP(otlp, record) {
3071
3416
  sender.send(record, { source: "server", warnIfUnavailable: true });
3072
3417
  }
3073
3418
  }
3074
- function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry, otlp, bindings = {}, source = "root") {
3419
+ function createLoggerInstance(rootRawLogger, sink, betterstack, databuddy, posthog, sentry, otlp, bindings = {}, source = "root") {
3075
3420
  const rawLogger = Object.keys(bindings).length > 0 ? rootRawLogger.child(bindings) : rootRawLogger;
3076
3421
  const writeRecord = (level, message, args, writeSource = source) => {
3077
3422
  if (writeSource === "root" && shouldDropRootLogWrite()) {
@@ -3097,6 +3442,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
3097
3442
  );
3098
3443
  sink.write(record);
3099
3444
  maybeSendToBetterStack(betterstack, record);
3445
+ maybeSendToDatabuddy(databuddy, record);
3100
3446
  maybeSendToPostHog(posthog, record);
3101
3447
  maybeSendToSentry(sentry, record);
3102
3448
  maybeSendToOTLP(otlp, record);
@@ -3120,6 +3466,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
3120
3466
  sink.write(record);
3121
3467
  }
3122
3468
  maybeSendToBetterStack(betterstack, record);
3469
+ maybeSendToDatabuddy(databuddy, record);
3123
3470
  maybeSendToPostHog(posthog, record);
3124
3471
  maybeSendToSentry(sentry, record);
3125
3472
  maybeSendToOTLP(otlp, record);
@@ -3153,8 +3500,26 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
3153
3500
  }
3154
3501
  writeRecord("table", message, data === void 0 ? [] : [data]);
3155
3502
  },
3156
- flush: () => sink.flush(),
3157
- shutdown: () => sink.shutdown(),
3503
+ flush: async () => {
3504
+ await sink.flush();
3505
+ await Promise.allSettled([
3506
+ betterstack.flush(),
3507
+ databuddy.flush(),
3508
+ posthog.flush(),
3509
+ sentry.flush(),
3510
+ otlp.flush()
3511
+ ]);
3512
+ },
3513
+ shutdown: async () => {
3514
+ await sink.shutdown();
3515
+ await Promise.allSettled([
3516
+ betterstack.flush(),
3517
+ databuddy.flush(),
3518
+ posthog.flush(),
3519
+ sentry.flush(),
3520
+ otlp.flush()
3521
+ ]);
3522
+ },
3158
3523
  createStructuredLog: (groupId, initial) => {
3159
3524
  return createStructuredLogForLogger(logger3, groupId, {
3160
3525
  initialFields: initial
@@ -3166,6 +3531,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
3166
3531
  rootRawLogger,
3167
3532
  sink,
3168
3533
  betterstack,
3534
+ databuddy,
3169
3535
  posthog,
3170
3536
  sentry,
3171
3537
  otlp,
@@ -3176,6 +3542,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
3176
3542
  [LOGGER_FACTORY]: {
3177
3543
  bindings,
3178
3544
  betterstack,
3545
+ databuddy,
3179
3546
  posthog,
3180
3547
  sentry,
3181
3548
  otlp,
@@ -3185,6 +3552,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
3185
3552
  rootRawLogger,
3186
3553
  sink,
3187
3554
  betterstack,
3555
+ databuddy,
3188
3556
  posthog,
3189
3557
  sentry,
3190
3558
  otlp,
@@ -3208,6 +3576,7 @@ function createBaseLogger(config) {
3208
3576
  const rawLogger = createPinoLogger(resolvedConfig);
3209
3577
  const sink = createPrimarySink(resolvedConfig);
3210
3578
  const betterstack = createBetterStackSender(resolvedConfig);
3579
+ const databuddy = createDatabuddySender(resolvedConfig);
3211
3580
  const posthog = createPostHogSender(resolvedConfig);
3212
3581
  const sentry = createSentrySender(resolvedConfig);
3213
3582
  const otlp = createOTLPRegistry(resolvedConfig);
@@ -3215,6 +3584,7 @@ function createBaseLogger(config) {
3215
3584
  rawLogger,
3216
3585
  sink,
3217
3586
  betterstack,
3587
+ databuddy,
3218
3588
  posthog,
3219
3589
  sentry,
3220
3590
  otlp