@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
@@ -8,6 +8,7 @@ import { gzipSync } from 'fflate';
8
8
  import { randomUUID } from 'crypto';
9
9
  import * as Sentry from '@sentry/node';
10
10
  import { Logtail } from '@logtail/node';
11
+ import { Databuddy } from '@databuddy/sdk/node';
11
12
  import { SeverityNumber } from '@opentelemetry/api-logs';
12
13
  import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';
13
14
  import { resourceFromAttributes } from '@opentelemetry/resources';
@@ -137,6 +138,7 @@ function hasNonEmptyString(value) {
137
138
  var DEFAULT_CLIENT_LOG_ENDPOINT = "/inngest";
138
139
  z.union([
139
140
  z.literal("betterstack"),
141
+ z.literal("databuddy"),
140
142
  z.literal("posthog"),
141
143
  z.literal("sentry"),
142
144
  z.undefined(),
@@ -147,16 +149,16 @@ z.union([
147
149
  ]);
148
150
 
149
151
  // src/shared/once.ts
150
- function createConsoleOnceLogger(method, warnedKeys6 = /* @__PURE__ */ new Set()) {
152
+ function createConsoleOnceLogger(method, warnedKeys7 = /* @__PURE__ */ new Set()) {
151
153
  return (key, message, error) => {
152
- if (warnedKeys6.has(key) || typeof console === "undefined") {
154
+ if (warnedKeys7.has(key) || typeof console === "undefined") {
153
155
  return;
154
156
  }
155
157
  const writer = console[method];
156
158
  if (typeof writer !== "function") {
157
159
  return;
158
160
  }
159
- warnedKeys6.add(key);
161
+ warnedKeys7.add(key);
160
162
  if (error === void 0) {
161
163
  writer.call(console, message);
162
164
  return;
@@ -164,11 +166,11 @@ function createConsoleOnceLogger(method, warnedKeys6 = /* @__PURE__ */ new Set()
164
166
  writer.call(console, message, error);
165
167
  };
166
168
  }
167
- function createWarnOnceLogger(warnedKeys6) {
168
- return createConsoleOnceLogger("warn", warnedKeys6);
169
+ function createWarnOnceLogger(warnedKeys7) {
170
+ return createConsoleOnceLogger("warn", warnedKeys7);
169
171
  }
170
- function createErrorOnceLogger(warnedKeys6) {
171
- return createConsoleOnceLogger("error", warnedKeys6);
172
+ function createErrorOnceLogger(warnedKeys7) {
173
+ return createConsoleOnceLogger("error", warnedKeys7);
172
174
  }
173
175
 
174
176
  // src/core/config.ts
@@ -534,6 +536,28 @@ function mergePostHogConnectorConfig(base, override) {
534
536
  }
535
537
  };
536
538
  }
539
+ function mergeDatabuddyConnectorConfig(base, override) {
540
+ const enabled = override?.enabled ?? base?.enabled ?? false;
541
+ const apiKey = override?.apiKey ?? base?.apiKey;
542
+ const websiteId = override?.websiteId ?? base?.websiteId;
543
+ const ready = enabled && hasNonEmptyString(apiKey) && hasNonEmptyString(websiteId);
544
+ return {
545
+ enabled,
546
+ mode: override?.mode ?? base?.mode ?? "auto",
547
+ apiKey,
548
+ websiteId,
549
+ namespace: override?.namespace ?? base?.namespace,
550
+ source: override?.source ?? base?.source,
551
+ apiUrl: override?.apiUrl ?? base?.apiUrl,
552
+ debug: override?.debug ?? base?.debug ?? false,
553
+ enableBatching: override?.enableBatching ?? base?.enableBatching ?? true,
554
+ batchSize: override?.batchSize ?? base?.batchSize,
555
+ batchTimeout: override?.batchTimeout ?? base?.batchTimeout,
556
+ maxQueueSize: override?.maxQueueSize ?? base?.maxQueueSize,
557
+ ready,
558
+ status: ready ? "enabled" : "missing"
559
+ };
560
+ }
537
561
  function mergeBetterStackConnectorConfig(base, override) {
538
562
  const sourceToken = override?.sourceToken ?? base?.sourceToken;
539
563
  const ingestingHost = override?.ingestingHost ?? base?.ingestingHost;
@@ -624,6 +648,7 @@ function mergeOTLPConnectorsConfig(base, override) {
624
648
  function mergeConnectorsConfig(base, override) {
625
649
  return {
626
650
  betterstack: mergeBetterStackConnectorConfig(base?.betterstack, override?.betterstack),
651
+ databuddy: mergeDatabuddyConnectorConfig(base?.databuddy, override?.databuddy),
627
652
  posthog: mergePostHogConnectorConfig(base?.posthog, override?.posthog),
628
653
  sentry: mergeSentryConnectorConfig(base?.sentry, override?.sentry),
629
654
  otlp: mergeOTLPConnectorsConfig(base?.otlp, override?.otlp)
@@ -1719,10 +1744,318 @@ function createBetterStackSender(config) {
1719
1744
  }
1720
1745
  };
1721
1746
  }
1722
- var PREVIOUSLY_CAPTURED_ERROR_KEY2 = "__posthog_previously_captured_error";
1723
1747
  var warnedKeys3 = /* @__PURE__ */ new Set();
1748
+ var senderCache = /* @__PURE__ */ new Map();
1724
1749
  var testHooks2 = {};
1725
1750
  var warnOnce4 = createErrorOnceLogger(warnedKeys3);
1751
+ function registerShutdownHooks2(key, shutdown) {
1752
+ const handlers = ["beforeExit", "SIGINT", "SIGTERM"];
1753
+ for (const event of handlers) {
1754
+ process.once(event, () => {
1755
+ void shutdown().catch((error) => {
1756
+ warnOnce4(
1757
+ `${key}:shutdown`,
1758
+ "[Blyp] Failed to flush Databuddy telemetry during shutdown.",
1759
+ error
1760
+ );
1761
+ });
1762
+ });
1763
+ }
1764
+ }
1765
+ function resolveConnectorConfig2(config) {
1766
+ const connector = isBlypConfig(config) ? config.connectors?.databuddy : config;
1767
+ const enabled = connector?.enabled ?? false;
1768
+ const apiKey = connector?.apiKey;
1769
+ const websiteId = connector?.websiteId;
1770
+ const ready = enabled && hasNonEmptyString(apiKey) && hasNonEmptyString(websiteId);
1771
+ return {
1772
+ enabled,
1773
+ mode: connector?.mode ?? "auto",
1774
+ apiKey,
1775
+ websiteId,
1776
+ namespace: connector?.namespace,
1777
+ source: connector?.source,
1778
+ apiUrl: connector?.apiUrl,
1779
+ debug: connector?.debug ?? false,
1780
+ enableBatching: connector?.enableBatching ?? true,
1781
+ batchSize: connector?.batchSize,
1782
+ batchTimeout: connector?.batchTimeout,
1783
+ maxQueueSize: connector?.maxQueueSize,
1784
+ ready,
1785
+ status: ready ? "enabled" : "missing"
1786
+ };
1787
+ }
1788
+ function createDefaultClient2(connector) {
1789
+ return new Databuddy({
1790
+ apiKey: connector.apiKey ?? "",
1791
+ ...connector.websiteId ? { websiteId: connector.websiteId } : {},
1792
+ ...connector.namespace ? { namespace: connector.namespace } : {},
1793
+ ...connector.source ? { source: connector.source } : {},
1794
+ ...connector.apiUrl ? { apiUrl: connector.apiUrl } : {},
1795
+ debug: connector.debug,
1796
+ enableBatching: connector.enableBatching,
1797
+ ...connector.batchSize !== void 0 ? { batchSize: connector.batchSize } : {},
1798
+ ...connector.batchTimeout !== void 0 ? { batchTimeout: connector.batchTimeout } : {},
1799
+ ...connector.maxQueueSize !== void 0 ? { maxQueueSize: connector.maxQueueSize } : {}
1800
+ });
1801
+ }
1802
+ function getDatabuddySenderKey(connector) {
1803
+ return JSON.stringify({
1804
+ enabled: connector.enabled,
1805
+ mode: connector.mode,
1806
+ apiKey: connector.apiKey ?? null,
1807
+ websiteId: connector.websiteId ?? null,
1808
+ namespace: connector.namespace ?? null,
1809
+ source: connector.source ?? null,
1810
+ apiUrl: connector.apiUrl ?? null,
1811
+ debug: connector.debug,
1812
+ enableBatching: connector.enableBatching,
1813
+ batchSize: connector.batchSize ?? null,
1814
+ batchTimeout: connector.batchTimeout ?? null,
1815
+ maxQueueSize: connector.maxQueueSize ?? null
1816
+ });
1817
+ }
1818
+ function getSessionId(record) {
1819
+ const direct = getField(record, "sessionId");
1820
+ if (hasNonEmptyString(direct)) {
1821
+ return direct;
1822
+ }
1823
+ return getClientSessionField(record, "sessionId");
1824
+ }
1825
+ function getAnonymousId(record) {
1826
+ const direct = getField(record, "anonymousId");
1827
+ if (hasNonEmptyString(direct)) {
1828
+ return direct;
1829
+ }
1830
+ const payload = getPrimaryPayload(record);
1831
+ if (isPlainObject(payload.metadata) && hasNonEmptyString(payload.metadata.databuddyAnonymousId)) {
1832
+ return payload.metadata.databuddyAnonymousId;
1833
+ }
1834
+ return void 0;
1835
+ }
1836
+ function getDatabuddyEventName(record) {
1837
+ const recordType = getRecordType(record);
1838
+ if (hasNonEmptyString(recordType)) {
1839
+ return recordType;
1840
+ }
1841
+ return "log";
1842
+ }
1843
+ function buildRecordProperties(record, source) {
1844
+ const properties = {
1845
+ blyp_level: record.level,
1846
+ blyp_source: source,
1847
+ blyp_payload: serializeLogRecord(record),
1848
+ message: typeof record.message === "string" ? record.message : String(record.message)
1849
+ };
1850
+ const caller = typeof record.caller === "string" ? record.caller : void 0;
1851
+ const groupId = getField(record, "groupId");
1852
+ const method = getField(record, "method");
1853
+ const path3 = getField(record, "path");
1854
+ const status = getField(record, "status");
1855
+ const duration = getField(record, "duration");
1856
+ const pagePath = getClientPageField(record, "pathname");
1857
+ const pageUrl = getClientPageField(record, "url");
1858
+ const sessionId = getClientSessionField(record, "sessionId");
1859
+ const pageId = getClientSessionField(record, "pageId");
1860
+ const ifTruthy = [
1861
+ ["blyp_type", getRecordType(record)],
1862
+ ["caller", caller],
1863
+ ["group_id", groupId],
1864
+ ["method", method],
1865
+ ["path", path3],
1866
+ ["page_path", pagePath],
1867
+ ["page_url", pageUrl],
1868
+ ["session_id", sessionId],
1869
+ ["page_id", pageId]
1870
+ ];
1871
+ const ifDefined = [
1872
+ ["status_code", status],
1873
+ ["duration_ms", duration]
1874
+ ];
1875
+ for (const [key, value] of ifTruthy) {
1876
+ if (value) {
1877
+ properties[key] = value;
1878
+ }
1879
+ }
1880
+ for (const [key, value] of ifDefined) {
1881
+ if (value !== void 0) {
1882
+ properties[key] = value;
1883
+ }
1884
+ }
1885
+ return properties;
1886
+ }
1887
+ function createTrackEvent(record, source) {
1888
+ return {
1889
+ name: getDatabuddyEventName(record),
1890
+ anonymousId: getAnonymousId(record),
1891
+ sessionId: getSessionId(record),
1892
+ properties: buildRecordProperties(record, source)
1893
+ };
1894
+ }
1895
+ function normalizeExceptionProperties(value) {
1896
+ if (!isPlainObject(value)) {
1897
+ return {};
1898
+ }
1899
+ return normalizeLogValue(value);
1900
+ }
1901
+ function normalizeExceptionInput2(value, fallbackMessage) {
1902
+ if (value instanceof Error) {
1903
+ return {
1904
+ message: value.message || fallbackMessage,
1905
+ properties: {
1906
+ error_type: value.name,
1907
+ ...value.stack ? { stack: value.stack } : {},
1908
+ ...normalizeExceptionProperties(value)
1909
+ }
1910
+ };
1911
+ }
1912
+ if (isPlainObject(value)) {
1913
+ const message = hasNonEmptyString(value.message) ? value.message : hasNonEmptyString(value.error) ? value.error : fallbackMessage;
1914
+ return {
1915
+ message,
1916
+ properties: normalizeExceptionProperties(value)
1917
+ };
1918
+ }
1919
+ if (typeof value === "string") {
1920
+ return {
1921
+ message: value,
1922
+ properties: {
1923
+ message: value
1924
+ }
1925
+ };
1926
+ }
1927
+ return {
1928
+ message: fallbackMessage,
1929
+ properties: {
1930
+ value: normalizeLogValue(value)
1931
+ }
1932
+ };
1933
+ }
1934
+ function createDatabuddySender(config) {
1935
+ const connector = resolveConnectorConfig2(config);
1936
+ const senderKey = getDatabuddySenderKey(connector);
1937
+ const cached = senderCache.get(senderKey);
1938
+ if (cached) {
1939
+ return cached;
1940
+ }
1941
+ const key = `${connector.apiUrl ?? "default"}:${connector.mode}:${connector.apiKey ?? "missing"}`;
1942
+ const client = connector.ready ? testHooks2.createClient?.(connector) ?? createDefaultClient2(connector) : void 0;
1943
+ if (client) {
1944
+ registerShutdownHooks2(key, async () => {
1945
+ await client.flush();
1946
+ });
1947
+ }
1948
+ const emitUnavailableWarning = () => {
1949
+ warnOnce4(
1950
+ `databuddy-unavailable:${key}`,
1951
+ "[Blyp] Databuddy connector is not configured. Databuddy requires both apiKey and websiteId. Skipping Databuddy delivery."
1952
+ );
1953
+ };
1954
+ const emitExceptionUnavailableWarning = () => {
1955
+ warnOnce4(
1956
+ `databuddy-exception-unavailable:${key}`,
1957
+ "[Blyp] Databuddy error tracking is not configured. Databuddy requires both apiKey and websiteId. Skipping Databuddy exception capture."
1958
+ );
1959
+ };
1960
+ const sender = {
1961
+ enabled: connector.enabled,
1962
+ ready: connector.ready,
1963
+ mode: connector.mode,
1964
+ status: connector.status,
1965
+ shouldAutoForwardServerLogs() {
1966
+ return connector.ready && connector.mode === "auto";
1967
+ },
1968
+ shouldAutoCaptureExceptions() {
1969
+ return connector.ready && connector.mode === "auto";
1970
+ },
1971
+ send(record, options = {}) {
1972
+ if (!connector.ready || !client) {
1973
+ if (options.warnIfUnavailable) {
1974
+ emitUnavailableWarning();
1975
+ }
1976
+ return;
1977
+ }
1978
+ try {
1979
+ const result = client.track(createTrackEvent(record, options.source ?? "server"));
1980
+ if (result && typeof result.catch === "function") {
1981
+ void result.catch((error) => {
1982
+ warnOnce4(
1983
+ `databuddy-send:${key}`,
1984
+ "[Blyp] Failed to deliver log to Databuddy.",
1985
+ error
1986
+ );
1987
+ });
1988
+ }
1989
+ } catch (error) {
1990
+ warnOnce4(
1991
+ `databuddy-send:${key}`,
1992
+ "[Blyp] Failed to deliver log to Databuddy.",
1993
+ error
1994
+ );
1995
+ }
1996
+ },
1997
+ captureException(error, options = {}) {
1998
+ if (!connector.ready || !client) {
1999
+ if (options.warnIfUnavailable) {
2000
+ emitExceptionUnavailableWarning();
2001
+ }
2002
+ return;
2003
+ }
2004
+ const normalized = normalizeExceptionInput2(
2005
+ error,
2006
+ options.source === "client" ? "Client error" : "Server error"
2007
+ );
2008
+ try {
2009
+ const result = client.track({
2010
+ name: "error",
2011
+ anonymousId: options.anonymousId,
2012
+ sessionId: options.sessionId,
2013
+ properties: {
2014
+ message: normalized.message,
2015
+ blyp_source: options.source ?? "server",
2016
+ blyp_level: "error",
2017
+ ...normalized.properties,
2018
+ ...options.properties ?? {}
2019
+ }
2020
+ });
2021
+ if (result && typeof result.catch === "function") {
2022
+ void result.catch((captureError) => {
2023
+ warnOnce4(
2024
+ `databuddy-capture:${key}`,
2025
+ "[Blyp] Failed to capture exception in Databuddy.",
2026
+ captureError
2027
+ );
2028
+ });
2029
+ }
2030
+ } catch (captureError) {
2031
+ warnOnce4(
2032
+ `databuddy-capture:${key}`,
2033
+ "[Blyp] Failed to capture exception in Databuddy.",
2034
+ captureError
2035
+ );
2036
+ }
2037
+ },
2038
+ async flush() {
2039
+ try {
2040
+ if (client) {
2041
+ await client.flush();
2042
+ }
2043
+ } catch (error) {
2044
+ warnOnce4(
2045
+ `databuddy-flush:${key}`,
2046
+ "[Blyp] Failed to flush Databuddy telemetry.",
2047
+ error
2048
+ );
2049
+ }
2050
+ }
2051
+ };
2052
+ senderCache.set(senderKey, sender);
2053
+ return sender;
2054
+ }
2055
+ var PREVIOUSLY_CAPTURED_ERROR_KEY2 = "__posthog_previously_captured_error";
2056
+ var warnedKeys4 = /* @__PURE__ */ new Set();
2057
+ var testHooks3 = {};
2058
+ var warnOnce5 = createErrorOnceLogger(warnedKeys4);
1726
2059
  function normalizeHost(host) {
1727
2060
  const trimmed = (host || "https://us.i.posthog.com").trim();
1728
2061
  return trimmed.replace(/\/+$/, "");
@@ -1763,7 +2096,7 @@ function buildRecordAttributes(record, source) {
1763
2096
  for (const [k, v] of ifDefined) if (v !== void 0) attributes[k] = v;
1764
2097
  return attributes;
1765
2098
  }
1766
- function normalizeExceptionProperties(value) {
2099
+ function normalizeExceptionProperties2(value) {
1767
2100
  if (!isPlainObject(value)) {
1768
2101
  return {};
1769
2102
  }
@@ -1795,18 +2128,18 @@ function createSyntheticError(message, source) {
1795
2128
  assignExceptionField(error, "details", source.details);
1796
2129
  return error;
1797
2130
  }
1798
- function normalizeExceptionInput2(input, fallbackMessage = "Unknown error") {
2131
+ function normalizeExceptionInput3(input, fallbackMessage = "Unknown error") {
1799
2132
  if (input instanceof Error) {
1800
2133
  return {
1801
2134
  error: input,
1802
- properties: normalizeExceptionProperties(input)
2135
+ properties: normalizeExceptionProperties2(input)
1803
2136
  };
1804
2137
  }
1805
2138
  if (isPlainObject(input)) {
1806
2139
  const message = hasNonEmptyString(input.message) ? input.message : hasNonEmptyString(input.error) ? input.error : fallbackMessage;
1807
2140
  return {
1808
2141
  error: createSyntheticError(message, input),
1809
- properties: normalizeExceptionProperties(input)
2142
+ properties: normalizeExceptionProperties2(input)
1810
2143
  };
1811
2144
  }
1812
2145
  if (typeof input === "string") {
@@ -1879,12 +2212,12 @@ function resolveSeverity(level) {
1879
2212
  return { text: "info", number: SeverityNumber.INFO };
1880
2213
  }
1881
2214
  }
1882
- function registerShutdownHooks2(key, shutdown) {
2215
+ function registerShutdownHooks3(key, shutdown) {
1883
2216
  const handlers = ["beforeExit", "SIGINT", "SIGTERM"];
1884
2217
  for (const event of handlers) {
1885
2218
  process.once(event, () => {
1886
2219
  void shutdown().catch((error) => {
1887
- warnOnce4(
2220
+ warnOnce5(
1888
2221
  `${key}:shutdown`,
1889
2222
  "[Blyp] Failed to flush PostHog telemetry during shutdown.",
1890
2223
  error
@@ -1938,7 +2271,7 @@ function createDefaultExceptionClient(connector) {
1938
2271
  }
1939
2272
  };
1940
2273
  }
1941
- function resolveConnectorConfig2(config) {
2274
+ function resolveConnectorConfig3(config) {
1942
2275
  const connector = isBlypConfig(config) ? config.connectors?.posthog : config;
1943
2276
  const enabled = connector?.enabled ?? false;
1944
2277
  const projectKey = connector?.projectKey;
@@ -1961,11 +2294,11 @@ function resolveConnectorConfig2(config) {
1961
2294
  };
1962
2295
  }
1963
2296
  function createPostHogSender(config) {
1964
- const connector = resolveConnectorConfig2(config);
2297
+ const connector = resolveConnectorConfig3(config);
1965
2298
  const key = `${connector.serviceName}:${connector.host}:${connector.mode}`;
1966
2299
  const ready = connector.enabled === true && hasNonEmptyString(connector.projectKey);
1967
- const transport = ready ? testHooks2.createTransport?.(connector) ?? createDefaultTransport(connector) : void 0;
1968
- const exceptionClient = connector.errorTracking.ready ? testHooks2.createExceptionClient?.(connector) ?? createDefaultExceptionClient(connector) : void 0;
2300
+ const transport = ready ? testHooks3.createTransport?.(connector) ?? createDefaultTransport(connector) : void 0;
2301
+ const exceptionClient = connector.errorTracking.ready ? testHooks3.createExceptionClient?.(connector) ?? createDefaultExceptionClient(connector) : void 0;
1969
2302
  const shutdown = async () => {
1970
2303
  if (transport?.shutdown) {
1971
2304
  await transport.shutdown();
@@ -1977,16 +2310,16 @@ function createPostHogSender(config) {
1977
2310
  }
1978
2311
  };
1979
2312
  if (transport || exceptionClient) {
1980
- registerShutdownHooks2(key, shutdown);
2313
+ registerShutdownHooks3(key, shutdown);
1981
2314
  }
1982
2315
  const emitUnavailableWarning = () => {
1983
- warnOnce4(
2316
+ warnOnce5(
1984
2317
  `posthog-unavailable:${key}`,
1985
2318
  "[Blyp] PostHog connector is not configured. Skipping PostHog delivery."
1986
2319
  );
1987
2320
  };
1988
2321
  const emitExceptionUnavailableWarning = () => {
1989
- warnOnce4(
2322
+ warnOnce5(
1990
2323
  `posthog-exception-unavailable:${key}`,
1991
2324
  "[Blyp] PostHog error tracking is not configured. Skipping PostHog exception capture."
1992
2325
  );
@@ -2024,7 +2357,7 @@ function createPostHogSender(config) {
2024
2357
  const result = transport.emit(normalized);
2025
2358
  if (result && typeof result.catch === "function") {
2026
2359
  void result.catch((error) => {
2027
- warnOnce4(
2360
+ warnOnce5(
2028
2361
  `posthog-emit:${key}`,
2029
2362
  "[Blyp] Failed to deliver log to PostHog.",
2030
2363
  error
@@ -2032,7 +2365,7 @@ function createPostHogSender(config) {
2032
2365
  });
2033
2366
  }
2034
2367
  } catch (error) {
2035
- warnOnce4(
2368
+ warnOnce5(
2036
2369
  `posthog-emit:${key}`,
2037
2370
  "[Blyp] Failed to deliver log to PostHog.",
2038
2371
  error
@@ -2049,7 +2382,7 @@ function createPostHogSender(config) {
2049
2382
  if (isPreviouslyCapturedPostHogError(error)) {
2050
2383
  return;
2051
2384
  }
2052
- const normalized = normalizeExceptionInput2(
2385
+ const normalized = normalizeExceptionInput3(
2053
2386
  error,
2054
2387
  options.source === "client" ? "Client error" : "Server error"
2055
2388
  );
@@ -2068,7 +2401,7 @@ function createPostHogSender(config) {
2068
2401
  markPostHogCapturedError(normalized.error);
2069
2402
  if (result && typeof result.catch === "function") {
2070
2403
  void result.catch((captureError) => {
2071
- warnOnce4(
2404
+ warnOnce5(
2072
2405
  `posthog-capture:${key}`,
2073
2406
  "[Blyp] Failed to capture exception in PostHog.",
2074
2407
  captureError
@@ -2076,7 +2409,7 @@ function createPostHogSender(config) {
2076
2409
  });
2077
2410
  }
2078
2411
  } catch (captureError) {
2079
- warnOnce4(
2412
+ warnOnce5(
2080
2413
  `posthog-capture:${key}`,
2081
2414
  "[Blyp] Failed to capture exception in PostHog.",
2082
2415
  captureError
@@ -2089,7 +2422,7 @@ function createPostHogSender(config) {
2089
2422
  await transport.flush();
2090
2423
  }
2091
2424
  } catch (error) {
2092
- warnOnce4(
2425
+ warnOnce5(
2093
2426
  `posthog-flush:${key}`,
2094
2427
  "[Blyp] Failed to flush PostHog telemetry.",
2095
2428
  error
@@ -2098,13 +2431,13 @@ function createPostHogSender(config) {
2098
2431
  }
2099
2432
  };
2100
2433
  }
2101
- var warnedKeys4 = /* @__PURE__ */ new Set();
2102
- var testHooks3 = {};
2103
- var warnOnce5 = createErrorOnceLogger(warnedKeys4);
2434
+ var warnedKeys5 = /* @__PURE__ */ new Set();
2435
+ var testHooks4 = {};
2436
+ var warnOnce6 = createErrorOnceLogger(warnedKeys5);
2104
2437
  function getSentryModule2() {
2105
- return testHooks3.module ?? Sentry;
2438
+ return testHooks4.module ?? Sentry;
2106
2439
  }
2107
- function resolveConnectorConfig3(config) {
2440
+ function resolveConnectorConfig4(config) {
2108
2441
  const connector = isBlypConfig(config) ? config.connectors?.sentry : config;
2109
2442
  const enabled = connector?.enabled ?? false;
2110
2443
  const dsn = connector?.dsn;
@@ -2249,7 +2582,7 @@ function hasConfigMismatch(connector, client) {
2249
2582
  return hasNonEmptyString(connector.dsn) && connector.dsn !== options.dsn || hasNonEmptyString(connector.environment) && connector.environment !== options.environment || hasNonEmptyString(connector.release) && connector.release !== options.release;
2250
2583
  }
2251
2584
  function createSentrySender(config) {
2252
- const connector = resolveConnectorConfig3(config);
2585
+ const connector = resolveConnectorConfig4(config);
2253
2586
  const key = `${connector.mode}:${connector.dsn ?? "missing"}`;
2254
2587
  const module = getSentryModule2();
2255
2588
  let client = connector.enabled ? module.getClient() : void 0;
@@ -2263,7 +2596,7 @@ function createSentrySender(config) {
2263
2596
  });
2264
2597
  client = module.getClient();
2265
2598
  } catch (error) {
2266
- warnOnce5(
2599
+ warnOnce6(
2267
2600
  `sentry-init:${key}`,
2268
2601
  "[Blyp] Failed to initialize Sentry. Skipping Sentry delivery.",
2269
2602
  error
@@ -2271,14 +2604,14 @@ function createSentrySender(config) {
2271
2604
  }
2272
2605
  }
2273
2606
  if (client && hasConfigMismatch(connector, client)) {
2274
- warnOnce5(
2607
+ warnOnce6(
2275
2608
  `sentry-mismatch:${key}`,
2276
2609
  "[Blyp] Sentry is already initialized with different options. Reusing the existing Sentry client."
2277
2610
  );
2278
2611
  }
2279
2612
  const ready = connector.enabled && client !== void 0;
2280
2613
  const emitUnavailableWarning = () => {
2281
- warnOnce5(
2614
+ warnOnce6(
2282
2615
  `sentry-unavailable:${key}`,
2283
2616
  "[Blyp] Sentry connector is not configured. Skipping Sentry delivery."
2284
2617
  );
@@ -2304,7 +2637,7 @@ function createSentrySender(config) {
2304
2637
  try {
2305
2638
  logMethod(record.message, attributes);
2306
2639
  } catch (error) {
2307
- warnOnce5(
2640
+ warnOnce6(
2308
2641
  `sentry-log:${key}`,
2309
2642
  "[Blyp] Failed to deliver log to Sentry.",
2310
2643
  error
@@ -2322,7 +2655,7 @@ function createSentrySender(config) {
2322
2655
  module.captureException(exception);
2323
2656
  });
2324
2657
  } catch (error) {
2325
- warnOnce5(
2658
+ warnOnce6(
2326
2659
  `sentry-exception:${key}`,
2327
2660
  "[Blyp] Failed to capture exception in Sentry.",
2328
2661
  error
@@ -2333,7 +2666,7 @@ function createSentrySender(config) {
2333
2666
  try {
2334
2667
  await module.flush(2e3);
2335
2668
  } catch (error) {
2336
- warnOnce5(
2669
+ warnOnce6(
2337
2670
  `sentry-flush:${key}`,
2338
2671
  "[Blyp] Failed to flush Sentry logs.",
2339
2672
  error
@@ -2342,9 +2675,9 @@ function createSentrySender(config) {
2342
2675
  }
2343
2676
  };
2344
2677
  }
2345
- var warnedKeys5 = /* @__PURE__ */ new Set();
2346
- var testHooks4 = {};
2347
- var warnOnce6 = createErrorOnceLogger(warnedKeys5);
2678
+ var warnedKeys6 = /* @__PURE__ */ new Set();
2679
+ var testHooks5 = {};
2680
+ var warnOnce7 = createErrorOnceLogger(warnedKeys6);
2348
2681
  function normalizeOTLPRecord(record, connector, source = "server") {
2349
2682
  const severity = resolveSeverity2(record.level);
2350
2683
  const body = typeof record.message === "string" ? record.message : String(record.message);
@@ -2409,14 +2742,14 @@ function resolveSeverity2(level) {
2409
2742
  return { text: "info", number: SeverityNumber.INFO };
2410
2743
  }
2411
2744
  }
2412
- function registerShutdownHooks3(key, shutdown) {
2745
+ function registerShutdownHooks4(key, shutdown) {
2413
2746
  const handlers = ["beforeExit", "SIGINT", "SIGTERM"];
2414
2747
  for (const event of handlers) {
2415
2748
  process.once(event, async () => {
2416
2749
  try {
2417
2750
  await shutdown();
2418
2751
  } catch (error) {
2419
- warnOnce6(
2752
+ warnOnce7(
2420
2753
  `${key}:shutdown`,
2421
2754
  "[Blyp] Failed to flush OTLP logs during shutdown.",
2422
2755
  error
@@ -2493,7 +2826,7 @@ function createUnavailableSender(name, connector) {
2493
2826
  const senderName = name || connector?.name || "otlp";
2494
2827
  const key = `${senderName}:${connector?.serviceName ?? "blyp-app"}:${connector?.endpoint ?? "missing"}`;
2495
2828
  const emitUnavailableWarning = () => {
2496
- warnOnce6(
2829
+ warnOnce7(
2497
2830
  `otlp-unavailable:${key}`,
2498
2831
  `[Blyp] OTLP target "${senderName}" is not configured or not ready. Skipping OTLP delivery.`
2499
2832
  );
@@ -2524,7 +2857,7 @@ function createSender(connector) {
2524
2857
  ...connector,
2525
2858
  headers: resolveTransportHeaders(connector)
2526
2859
  };
2527
- const transport = testHooks4.createTransport?.(transportConnector) ?? createDefaultTransport2(transportConnector);
2860
+ const transport = testHooks5.createTransport?.(transportConnector) ?? createDefaultTransport2(transportConnector);
2528
2861
  return {
2529
2862
  name: connector.name,
2530
2863
  enabled: connector.enabled,
@@ -2540,7 +2873,7 @@ function createSender(connector) {
2540
2873
  const result = transport.emit(normalized);
2541
2874
  if (result && typeof result.catch === "function") {
2542
2875
  void result.catch((error) => {
2543
- warnOnce6(
2876
+ warnOnce7(
2544
2877
  `otlp-emit:${key}`,
2545
2878
  `[Blyp] Failed to deliver log to OTLP target "${connector.name}".`,
2546
2879
  error
@@ -2548,7 +2881,7 @@ function createSender(connector) {
2548
2881
  });
2549
2882
  }
2550
2883
  } catch (error) {
2551
- warnOnce6(
2884
+ warnOnce7(
2552
2885
  `otlp-emit:${key}`,
2553
2886
  `[Blyp] Failed to deliver log to OTLP target "${connector.name}".`,
2554
2887
  error
@@ -2561,7 +2894,7 @@ function createSender(connector) {
2561
2894
  await transport.flush();
2562
2895
  }
2563
2896
  } catch (error) {
2564
- warnOnce6(
2897
+ warnOnce7(
2565
2898
  `otlp-flush:${key}`,
2566
2899
  `[Blyp] Failed to flush OTLP logs for target "${connector.name}".`,
2567
2900
  error
@@ -2590,7 +2923,7 @@ function createOTLPRegistry(config) {
2590
2923
  await Promise.all(Array.from(senders.values()).map((sender) => sender.flush()));
2591
2924
  }
2592
2925
  };
2593
- registerShutdownHooks3("otlp-registry", () => registry.flush());
2926
+ registerShutdownHooks4("otlp-registry", () => registry.flush());
2594
2927
  return registry;
2595
2928
  }
2596
2929
  var _RuntimeDetector = class _RuntimeDetector {
@@ -3024,6 +3357,18 @@ function maybeSendToBetterStack(betterstack, record) {
3024
3357
  }
3025
3358
  betterstack.send(record, { source: "server", warnIfUnavailable: true });
3026
3359
  }
3360
+ function maybeSendToDatabuddy(databuddy, record) {
3361
+ if (isClientLogRecord(record)) {
3362
+ return;
3363
+ }
3364
+ if (!databuddy.shouldAutoForwardServerLogs()) {
3365
+ if (databuddy.enabled && !databuddy.ready) {
3366
+ databuddy.send(record, { source: "server", warnIfUnavailable: true });
3367
+ }
3368
+ return;
3369
+ }
3370
+ databuddy.send(record, { source: "server", warnIfUnavailable: true });
3371
+ }
3027
3372
  function maybeSendToSentry(sentry, record) {
3028
3373
  if (isClientLogRecord(record)) {
3029
3374
  return;
@@ -3044,7 +3389,7 @@ function maybeSendToOTLP(otlp, record) {
3044
3389
  sender.send(record, { source: "server", warnIfUnavailable: true });
3045
3390
  }
3046
3391
  }
3047
- function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry, otlp, bindings = {}, source = "root") {
3392
+ function createLoggerInstance(rootRawLogger, sink, betterstack, databuddy, posthog, sentry, otlp, bindings = {}, source = "root") {
3048
3393
  const rawLogger = Object.keys(bindings).length > 0 ? rootRawLogger.child(bindings) : rootRawLogger;
3049
3394
  const writeRecord = (level, message, args, writeSource = source) => {
3050
3395
  if (writeSource === "root" && shouldDropRootLogWrite()) {
@@ -3070,6 +3415,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
3070
3415
  );
3071
3416
  sink.write(record);
3072
3417
  maybeSendToBetterStack(betterstack, record);
3418
+ maybeSendToDatabuddy(databuddy, record);
3073
3419
  maybeSendToPostHog(posthog, record);
3074
3420
  maybeSendToSentry(sentry, record);
3075
3421
  maybeSendToOTLP(otlp, record);
@@ -3093,6 +3439,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
3093
3439
  sink.write(record);
3094
3440
  }
3095
3441
  maybeSendToBetterStack(betterstack, record);
3442
+ maybeSendToDatabuddy(databuddy, record);
3096
3443
  maybeSendToPostHog(posthog, record);
3097
3444
  maybeSendToSentry(sentry, record);
3098
3445
  maybeSendToOTLP(otlp, record);
@@ -3126,8 +3473,26 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
3126
3473
  }
3127
3474
  writeRecord("table", message, data === void 0 ? [] : [data]);
3128
3475
  },
3129
- flush: () => sink.flush(),
3130
- shutdown: () => sink.shutdown(),
3476
+ flush: async () => {
3477
+ await sink.flush();
3478
+ await Promise.allSettled([
3479
+ betterstack.flush(),
3480
+ databuddy.flush(),
3481
+ posthog.flush(),
3482
+ sentry.flush(),
3483
+ otlp.flush()
3484
+ ]);
3485
+ },
3486
+ shutdown: async () => {
3487
+ await sink.shutdown();
3488
+ await Promise.allSettled([
3489
+ betterstack.flush(),
3490
+ databuddy.flush(),
3491
+ posthog.flush(),
3492
+ sentry.flush(),
3493
+ otlp.flush()
3494
+ ]);
3495
+ },
3131
3496
  createStructuredLog: (groupId, initial) => {
3132
3497
  return createStructuredLogForLogger(logger3, groupId, {
3133
3498
  initialFields: initial
@@ -3139,6 +3504,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
3139
3504
  rootRawLogger,
3140
3505
  sink,
3141
3506
  betterstack,
3507
+ databuddy,
3142
3508
  posthog,
3143
3509
  sentry,
3144
3510
  otlp,
@@ -3149,6 +3515,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
3149
3515
  [LOGGER_FACTORY]: {
3150
3516
  bindings,
3151
3517
  betterstack,
3518
+ databuddy,
3152
3519
  posthog,
3153
3520
  sentry,
3154
3521
  otlp,
@@ -3158,6 +3525,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
3158
3525
  rootRawLogger,
3159
3526
  sink,
3160
3527
  betterstack,
3528
+ databuddy,
3161
3529
  posthog,
3162
3530
  sentry,
3163
3531
  otlp,
@@ -3181,6 +3549,7 @@ function createBaseLogger(config) {
3181
3549
  const rawLogger = createPinoLogger(resolvedConfig);
3182
3550
  const sink = createPrimarySink(resolvedConfig);
3183
3551
  const betterstack = createBetterStackSender(resolvedConfig);
3552
+ const databuddy = createDatabuddySender(resolvedConfig);
3184
3553
  const posthog = createPostHogSender(resolvedConfig);
3185
3554
  const sentry = createSentrySender(resolvedConfig);
3186
3555
  const otlp = createOTLPRegistry(resolvedConfig);
@@ -3188,6 +3557,7 @@ function createBaseLogger(config) {
3188
3557
  rawLogger,
3189
3558
  sink,
3190
3559
  betterstack,
3560
+ databuddy,
3191
3561
  posthog,
3192
3562
  sentry,
3193
3563
  otlp