@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.
- package/README.md +56 -3
- package/dist/astro.js +4602 -0
- package/dist/astro.js.map +1 -0
- package/dist/astro.mjs +4574 -0
- package/dist/astro.mjs.map +1 -0
- package/dist/client.js +7 -0
- package/dist/client.js.map +1 -1
- package/dist/client.mjs +7 -0
- package/dist/client.mjs.map +1 -1
- package/dist/connectors/betterstack.js +24 -0
- package/dist/connectors/betterstack.js.map +1 -1
- package/dist/connectors/betterstack.mjs +24 -0
- package/dist/connectors/betterstack.mjs.map +1 -1
- package/dist/connectors/databuddy/index.d.ts +7 -0
- package/dist/connectors/databuddy/sender.d.ts +5 -0
- package/dist/connectors/databuddy.js +1456 -0
- package/dist/connectors/databuddy.js.map +1 -0
- package/dist/connectors/databuddy.mjs +1451 -0
- package/dist/connectors/databuddy.mjs.map +1 -0
- package/dist/connectors/otlp.js +24 -0
- package/dist/connectors/otlp.js.map +1 -1
- package/dist/connectors/otlp.mjs +24 -0
- package/dist/connectors/otlp.mjs.map +1 -1
- package/dist/connectors/posthog.js +24 -0
- package/dist/connectors/posthog.js.map +1 -1
- package/dist/connectors/posthog.mjs +24 -0
- package/dist/connectors/posthog.mjs.map +1 -1
- package/dist/connectors/sentry.js +24 -0
- package/dist/connectors/sentry.js.map +1 -1
- package/dist/connectors/sentry.mjs +24 -0
- package/dist/connectors/sentry.mjs.map +1 -1
- package/dist/core/config.d.ts +1 -1
- package/dist/core/logger.d.ts +3 -0
- package/dist/elysia.js +455 -30
- package/dist/elysia.js.map +1 -1
- package/dist/elysia.mjs +455 -30
- package/dist/elysia.mjs.map +1 -1
- package/dist/expo.js +7 -0
- package/dist/expo.js.map +1 -1
- package/dist/expo.mjs +7 -0
- package/dist/expo.mjs.map +1 -1
- package/dist/express.js +455 -30
- package/dist/express.js.map +1 -1
- package/dist/express.mjs +455 -30
- package/dist/express.mjs.map +1 -1
- package/dist/fastify.js +455 -30
- package/dist/fastify.js.map +1 -1
- package/dist/fastify.mjs +455 -30
- package/dist/fastify.mjs.map +1 -1
- package/dist/frameworks/astro/index.d.ts +2 -0
- package/dist/frameworks/astro/logger.d.ts +3 -0
- package/dist/frameworks/nitro/index.d.ts +2 -0
- package/dist/frameworks/nitro/logger.d.ts +6 -0
- package/dist/frameworks/nuxt/index.d.ts +2 -0
- package/dist/frameworks/nuxt/logger.d.ts +3 -0
- package/dist/frameworks/react-router/index.d.ts +2 -0
- package/dist/frameworks/react-router/logger.d.ts +3 -0
- package/dist/frameworks/shared/h3.d.ts +19 -0
- package/dist/hono.js +455 -30
- package/dist/hono.js.map +1 -1
- package/dist/hono.mjs +455 -30
- package/dist/hono.mjs.map +1 -1
- package/dist/index.d.ts +11 -1
- package/dist/index.js +1142 -78
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1135 -79
- package/dist/index.mjs.map +1 -1
- package/dist/nestjs.js +455 -30
- package/dist/nestjs.js.map +1 -1
- package/dist/nestjs.mjs +455 -30
- package/dist/nestjs.mjs.map +1 -1
- package/dist/nextjs.js +455 -30
- package/dist/nextjs.js.map +1 -1
- package/dist/nextjs.mjs +455 -30
- package/dist/nextjs.mjs.map +1 -1
- package/dist/nitro.js +4726 -0
- package/dist/nitro.js.map +1 -0
- package/dist/nitro.mjs +4698 -0
- package/dist/nitro.mjs.map +1 -0
- package/dist/nuxt.js +4733 -0
- package/dist/nuxt.js.map +1 -0
- package/dist/nuxt.mjs +4705 -0
- package/dist/nuxt.mjs.map +1 -0
- package/dist/react-router.js +4644 -0
- package/dist/react-router.js.map +1 -0
- package/dist/react-router.mjs +4616 -0
- package/dist/react-router.mjs.map +1 -0
- package/dist/standalone.js +423 -53
- package/dist/standalone.js.map +1 -1
- package/dist/standalone.mjs +423 -53
- package/dist/standalone.mjs.map +1 -1
- package/dist/sveltekit.js +455 -30
- package/dist/sveltekit.js.map +1 -1
- package/dist/sveltekit.mjs +455 -30
- package/dist/sveltekit.mjs.map +1 -1
- package/dist/tanstack-start.js +455 -30
- package/dist/tanstack-start.js.map +1 -1
- package/dist/tanstack-start.mjs +455 -30
- package/dist/tanstack-start.mjs.map +1 -1
- package/dist/types/connectors/databuddy.d.ts +52 -0
- package/dist/types/core/config.d.ts +32 -0
- package/dist/types/core/logger.d.ts +2 -0
- package/dist/types/frameworks/astro.d.ts +32 -0
- package/dist/types/frameworks/nitro.d.ts +62 -0
- package/dist/types/frameworks/nuxt.d.ts +12 -0
- package/dist/types/frameworks/react-router.d.ts +33 -0
- package/dist/types/frameworks/shared.d.ts +24 -0
- package/dist/types/shared/client-log.d.ts +1 -1
- package/exports/connectors/databuddy.js +1 -0
- package/exports/connectors/databuddy.mjs +1 -0
- package/exports/frameworks/astro.js +1 -0
- package/exports/frameworks/astro.mjs +1 -0
- package/exports/frameworks/nitro.js +1 -0
- package/exports/frameworks/nitro.mjs +1 -0
- package/exports/frameworks/nuxt.js +1 -0
- package/exports/frameworks/nuxt.mjs +1 -0
- package/exports/frameworks/react-router.js +1 -0
- package/exports/frameworks/react-router.mjs +1 -0
- package/package.json +59 -2
- package/types/connectors/databuddy.d.ts +1 -0
- package/types/frameworks/astro.d.ts +1 -0
- package/types/frameworks/nitro.d.ts +1 -0
- package/types/frameworks/nuxt.d.ts +1 -0
- package/types/frameworks/react-router.d.ts +1 -0
package/dist/tanstack-start.mjs
CHANGED
|
@@ -13,6 +13,7 @@ import { AsyncLocalStorage } from 'async_hooks';
|
|
|
13
13
|
import { randomUUID } from 'crypto';
|
|
14
14
|
import * as Sentry from '@sentry/node';
|
|
15
15
|
import { Logtail } from '@logtail/node';
|
|
16
|
+
import { Databuddy } from '@databuddy/sdk/node';
|
|
16
17
|
|
|
17
18
|
var __defProp = Object.defineProperty;
|
|
18
19
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
@@ -371,6 +372,7 @@ var CLIENT_LOG_LEVELS = [
|
|
|
371
372
|
];
|
|
372
373
|
var clientConnectorRequestSchema = z.union([
|
|
373
374
|
z.literal("betterstack"),
|
|
375
|
+
z.literal("databuddy"),
|
|
374
376
|
z.literal("posthog"),
|
|
375
377
|
z.literal("sentry"),
|
|
376
378
|
z.undefined(),
|
|
@@ -411,16 +413,16 @@ function normalizeEndpointPath(path3) {
|
|
|
411
413
|
}
|
|
412
414
|
|
|
413
415
|
// src/shared/once.ts
|
|
414
|
-
function createConsoleOnceLogger(method,
|
|
416
|
+
function createConsoleOnceLogger(method, warnedKeys7 = /* @__PURE__ */ new Set()) {
|
|
415
417
|
return (key, message, error) => {
|
|
416
|
-
if (
|
|
418
|
+
if (warnedKeys7.has(key) || typeof console === "undefined") {
|
|
417
419
|
return;
|
|
418
420
|
}
|
|
419
421
|
const writer = console[method];
|
|
420
422
|
if (typeof writer !== "function") {
|
|
421
423
|
return;
|
|
422
424
|
}
|
|
423
|
-
|
|
425
|
+
warnedKeys7.add(key);
|
|
424
426
|
if (error === void 0) {
|
|
425
427
|
writer.call(console, message);
|
|
426
428
|
return;
|
|
@@ -428,11 +430,11 @@ function createConsoleOnceLogger(method, warnedKeys6 = /* @__PURE__ */ new Set()
|
|
|
428
430
|
writer.call(console, message, error);
|
|
429
431
|
};
|
|
430
432
|
}
|
|
431
|
-
function createWarnOnceLogger(
|
|
432
|
-
return createConsoleOnceLogger("warn",
|
|
433
|
+
function createWarnOnceLogger(warnedKeys7) {
|
|
434
|
+
return createConsoleOnceLogger("warn", warnedKeys7);
|
|
433
435
|
}
|
|
434
|
-
function createErrorOnceLogger(
|
|
435
|
-
return createConsoleOnceLogger("error",
|
|
436
|
+
function createErrorOnceLogger(warnedKeys7) {
|
|
437
|
+
return createConsoleOnceLogger("error", warnedKeys7);
|
|
436
438
|
}
|
|
437
439
|
|
|
438
440
|
// src/core/config.ts
|
|
@@ -798,6 +800,28 @@ function mergePostHogConnectorConfig(base, override) {
|
|
|
798
800
|
}
|
|
799
801
|
};
|
|
800
802
|
}
|
|
803
|
+
function mergeDatabuddyConnectorConfig(base, override) {
|
|
804
|
+
const enabled = override?.enabled ?? base?.enabled ?? false;
|
|
805
|
+
const apiKey = override?.apiKey ?? base?.apiKey;
|
|
806
|
+
const websiteId = override?.websiteId ?? base?.websiteId;
|
|
807
|
+
const ready = enabled && hasNonEmptyString(apiKey) && hasNonEmptyString(websiteId);
|
|
808
|
+
return {
|
|
809
|
+
enabled,
|
|
810
|
+
mode: override?.mode ?? base?.mode ?? "auto",
|
|
811
|
+
apiKey,
|
|
812
|
+
websiteId,
|
|
813
|
+
namespace: override?.namespace ?? base?.namespace,
|
|
814
|
+
source: override?.source ?? base?.source,
|
|
815
|
+
apiUrl: override?.apiUrl ?? base?.apiUrl,
|
|
816
|
+
debug: override?.debug ?? base?.debug ?? false,
|
|
817
|
+
enableBatching: override?.enableBatching ?? base?.enableBatching ?? true,
|
|
818
|
+
batchSize: override?.batchSize ?? base?.batchSize,
|
|
819
|
+
batchTimeout: override?.batchTimeout ?? base?.batchTimeout,
|
|
820
|
+
maxQueueSize: override?.maxQueueSize ?? base?.maxQueueSize,
|
|
821
|
+
ready,
|
|
822
|
+
status: ready ? "enabled" : "missing"
|
|
823
|
+
};
|
|
824
|
+
}
|
|
801
825
|
function mergeBetterStackConnectorConfig(base, override) {
|
|
802
826
|
const sourceToken = override?.sourceToken ?? base?.sourceToken;
|
|
803
827
|
const ingestingHost = override?.ingestingHost ?? base?.ingestingHost;
|
|
@@ -888,6 +912,7 @@ function mergeOTLPConnectorsConfig(base, override) {
|
|
|
888
912
|
function mergeConnectorsConfig(base, override) {
|
|
889
913
|
return {
|
|
890
914
|
betterstack: mergeBetterStackConnectorConfig(base?.betterstack, override?.betterstack),
|
|
915
|
+
databuddy: mergeDatabuddyConnectorConfig(base?.databuddy, override?.databuddy),
|
|
891
916
|
posthog: mergePostHogConnectorConfig(base?.posthog, override?.posthog),
|
|
892
917
|
sentry: mergeSentryConnectorConfig(base?.sentry, override?.sentry),
|
|
893
918
|
otlp: mergeOTLPConnectorsConfig(base?.otlp, override?.otlp)
|
|
@@ -2524,12 +2549,320 @@ function createBetterStackSender(config) {
|
|
|
2524
2549
|
};
|
|
2525
2550
|
}
|
|
2526
2551
|
var warnedKeys4 = /* @__PURE__ */ new Set();
|
|
2552
|
+
var senderCache = /* @__PURE__ */ new Map();
|
|
2527
2553
|
var testHooks3 = {};
|
|
2528
2554
|
var warnOnce5 = createErrorOnceLogger(warnedKeys4);
|
|
2529
|
-
function
|
|
2530
|
-
|
|
2555
|
+
function registerShutdownHooks3(key, shutdown) {
|
|
2556
|
+
const handlers = ["beforeExit", "SIGINT", "SIGTERM"];
|
|
2557
|
+
for (const event of handlers) {
|
|
2558
|
+
process.once(event, () => {
|
|
2559
|
+
void shutdown().catch((error) => {
|
|
2560
|
+
warnOnce5(
|
|
2561
|
+
`${key}:shutdown`,
|
|
2562
|
+
"[Blyp] Failed to flush Databuddy telemetry during shutdown.",
|
|
2563
|
+
error
|
|
2564
|
+
);
|
|
2565
|
+
});
|
|
2566
|
+
});
|
|
2567
|
+
}
|
|
2531
2568
|
}
|
|
2532
2569
|
function resolveConnectorConfig3(config) {
|
|
2570
|
+
const connector = isBlypConfig(config) ? config.connectors?.databuddy : config;
|
|
2571
|
+
const enabled = connector?.enabled ?? false;
|
|
2572
|
+
const apiKey = connector?.apiKey;
|
|
2573
|
+
const websiteId = connector?.websiteId;
|
|
2574
|
+
const ready = enabled && hasNonEmptyString(apiKey) && hasNonEmptyString(websiteId);
|
|
2575
|
+
return {
|
|
2576
|
+
enabled,
|
|
2577
|
+
mode: connector?.mode ?? "auto",
|
|
2578
|
+
apiKey,
|
|
2579
|
+
websiteId,
|
|
2580
|
+
namespace: connector?.namespace,
|
|
2581
|
+
source: connector?.source,
|
|
2582
|
+
apiUrl: connector?.apiUrl,
|
|
2583
|
+
debug: connector?.debug ?? false,
|
|
2584
|
+
enableBatching: connector?.enableBatching ?? true,
|
|
2585
|
+
batchSize: connector?.batchSize,
|
|
2586
|
+
batchTimeout: connector?.batchTimeout,
|
|
2587
|
+
maxQueueSize: connector?.maxQueueSize,
|
|
2588
|
+
ready,
|
|
2589
|
+
status: ready ? "enabled" : "missing"
|
|
2590
|
+
};
|
|
2591
|
+
}
|
|
2592
|
+
function createDefaultClient2(connector) {
|
|
2593
|
+
return new Databuddy({
|
|
2594
|
+
apiKey: connector.apiKey ?? "",
|
|
2595
|
+
...connector.websiteId ? { websiteId: connector.websiteId } : {},
|
|
2596
|
+
...connector.namespace ? { namespace: connector.namespace } : {},
|
|
2597
|
+
...connector.source ? { source: connector.source } : {},
|
|
2598
|
+
...connector.apiUrl ? { apiUrl: connector.apiUrl } : {},
|
|
2599
|
+
debug: connector.debug,
|
|
2600
|
+
enableBatching: connector.enableBatching,
|
|
2601
|
+
...connector.batchSize !== void 0 ? { batchSize: connector.batchSize } : {},
|
|
2602
|
+
...connector.batchTimeout !== void 0 ? { batchTimeout: connector.batchTimeout } : {},
|
|
2603
|
+
...connector.maxQueueSize !== void 0 ? { maxQueueSize: connector.maxQueueSize } : {}
|
|
2604
|
+
});
|
|
2605
|
+
}
|
|
2606
|
+
function getDatabuddySenderKey(connector) {
|
|
2607
|
+
return JSON.stringify({
|
|
2608
|
+
enabled: connector.enabled,
|
|
2609
|
+
mode: connector.mode,
|
|
2610
|
+
apiKey: connector.apiKey ?? null,
|
|
2611
|
+
websiteId: connector.websiteId ?? null,
|
|
2612
|
+
namespace: connector.namespace ?? null,
|
|
2613
|
+
source: connector.source ?? null,
|
|
2614
|
+
apiUrl: connector.apiUrl ?? null,
|
|
2615
|
+
debug: connector.debug,
|
|
2616
|
+
enableBatching: connector.enableBatching,
|
|
2617
|
+
batchSize: connector.batchSize ?? null,
|
|
2618
|
+
batchTimeout: connector.batchTimeout ?? null,
|
|
2619
|
+
maxQueueSize: connector.maxQueueSize ?? null
|
|
2620
|
+
});
|
|
2621
|
+
}
|
|
2622
|
+
function getSessionId(record) {
|
|
2623
|
+
const direct = getField(record, "sessionId");
|
|
2624
|
+
if (hasNonEmptyString(direct)) {
|
|
2625
|
+
return direct;
|
|
2626
|
+
}
|
|
2627
|
+
return getClientSessionField(record, "sessionId");
|
|
2628
|
+
}
|
|
2629
|
+
function getAnonymousId(record) {
|
|
2630
|
+
const direct = getField(record, "anonymousId");
|
|
2631
|
+
if (hasNonEmptyString(direct)) {
|
|
2632
|
+
return direct;
|
|
2633
|
+
}
|
|
2634
|
+
const payload = getPrimaryPayload(record);
|
|
2635
|
+
if (isPlainObject(payload.metadata) && hasNonEmptyString(payload.metadata.databuddyAnonymousId)) {
|
|
2636
|
+
return payload.metadata.databuddyAnonymousId;
|
|
2637
|
+
}
|
|
2638
|
+
return void 0;
|
|
2639
|
+
}
|
|
2640
|
+
function getDatabuddyEventName(record) {
|
|
2641
|
+
const recordType = getRecordType(record);
|
|
2642
|
+
if (hasNonEmptyString(recordType)) {
|
|
2643
|
+
return recordType;
|
|
2644
|
+
}
|
|
2645
|
+
return "log";
|
|
2646
|
+
}
|
|
2647
|
+
function buildRecordProperties(record, source) {
|
|
2648
|
+
const properties = {
|
|
2649
|
+
blyp_level: record.level,
|
|
2650
|
+
blyp_source: source,
|
|
2651
|
+
blyp_payload: serializeLogRecord(record),
|
|
2652
|
+
message: typeof record.message === "string" ? record.message : String(record.message)
|
|
2653
|
+
};
|
|
2654
|
+
const caller = typeof record.caller === "string" ? record.caller : void 0;
|
|
2655
|
+
const groupId = getField(record, "groupId");
|
|
2656
|
+
const method = getField(record, "method");
|
|
2657
|
+
const path3 = getField(record, "path");
|
|
2658
|
+
const status = getField(record, "status");
|
|
2659
|
+
const duration = getField(record, "duration");
|
|
2660
|
+
const pagePath = getClientPageField(record, "pathname");
|
|
2661
|
+
const pageUrl = getClientPageField(record, "url");
|
|
2662
|
+
const sessionId = getClientSessionField(record, "sessionId");
|
|
2663
|
+
const pageId = getClientSessionField(record, "pageId");
|
|
2664
|
+
const ifTruthy = [
|
|
2665
|
+
["blyp_type", getRecordType(record)],
|
|
2666
|
+
["caller", caller],
|
|
2667
|
+
["group_id", groupId],
|
|
2668
|
+
["method", method],
|
|
2669
|
+
["path", path3],
|
|
2670
|
+
["page_path", pagePath],
|
|
2671
|
+
["page_url", pageUrl],
|
|
2672
|
+
["session_id", sessionId],
|
|
2673
|
+
["page_id", pageId]
|
|
2674
|
+
];
|
|
2675
|
+
const ifDefined = [
|
|
2676
|
+
["status_code", status],
|
|
2677
|
+
["duration_ms", duration]
|
|
2678
|
+
];
|
|
2679
|
+
for (const [key, value] of ifTruthy) {
|
|
2680
|
+
if (value) {
|
|
2681
|
+
properties[key] = value;
|
|
2682
|
+
}
|
|
2683
|
+
}
|
|
2684
|
+
for (const [key, value] of ifDefined) {
|
|
2685
|
+
if (value !== void 0) {
|
|
2686
|
+
properties[key] = value;
|
|
2687
|
+
}
|
|
2688
|
+
}
|
|
2689
|
+
return properties;
|
|
2690
|
+
}
|
|
2691
|
+
function createTrackEvent(record, source) {
|
|
2692
|
+
return {
|
|
2693
|
+
name: getDatabuddyEventName(record),
|
|
2694
|
+
anonymousId: getAnonymousId(record),
|
|
2695
|
+
sessionId: getSessionId(record),
|
|
2696
|
+
properties: buildRecordProperties(record, source)
|
|
2697
|
+
};
|
|
2698
|
+
}
|
|
2699
|
+
function normalizeExceptionProperties2(value) {
|
|
2700
|
+
if (!isPlainObject(value)) {
|
|
2701
|
+
return {};
|
|
2702
|
+
}
|
|
2703
|
+
return normalizeLogValue(value);
|
|
2704
|
+
}
|
|
2705
|
+
function normalizeExceptionInput3(value, fallbackMessage) {
|
|
2706
|
+
if (value instanceof Error) {
|
|
2707
|
+
return {
|
|
2708
|
+
message: value.message || fallbackMessage,
|
|
2709
|
+
properties: {
|
|
2710
|
+
error_type: value.name,
|
|
2711
|
+
...value.stack ? { stack: value.stack } : {},
|
|
2712
|
+
...normalizeExceptionProperties2(value)
|
|
2713
|
+
}
|
|
2714
|
+
};
|
|
2715
|
+
}
|
|
2716
|
+
if (isPlainObject(value)) {
|
|
2717
|
+
const message = hasNonEmptyString(value.message) ? value.message : hasNonEmptyString(value.error) ? value.error : fallbackMessage;
|
|
2718
|
+
return {
|
|
2719
|
+
message,
|
|
2720
|
+
properties: normalizeExceptionProperties2(value)
|
|
2721
|
+
};
|
|
2722
|
+
}
|
|
2723
|
+
if (typeof value === "string") {
|
|
2724
|
+
return {
|
|
2725
|
+
message: value,
|
|
2726
|
+
properties: {
|
|
2727
|
+
message: value
|
|
2728
|
+
}
|
|
2729
|
+
};
|
|
2730
|
+
}
|
|
2731
|
+
return {
|
|
2732
|
+
message: fallbackMessage,
|
|
2733
|
+
properties: {
|
|
2734
|
+
value: normalizeLogValue(value)
|
|
2735
|
+
}
|
|
2736
|
+
};
|
|
2737
|
+
}
|
|
2738
|
+
function createDatabuddySender(config) {
|
|
2739
|
+
const connector = resolveConnectorConfig3(config);
|
|
2740
|
+
const senderKey = getDatabuddySenderKey(connector);
|
|
2741
|
+
const cached = senderCache.get(senderKey);
|
|
2742
|
+
if (cached) {
|
|
2743
|
+
return cached;
|
|
2744
|
+
}
|
|
2745
|
+
const key = `${connector.apiUrl ?? "default"}:${connector.mode}:${connector.apiKey ?? "missing"}`;
|
|
2746
|
+
const client = connector.ready ? testHooks3.createClient?.(connector) ?? createDefaultClient2(connector) : void 0;
|
|
2747
|
+
if (client) {
|
|
2748
|
+
registerShutdownHooks3(key, async () => {
|
|
2749
|
+
await client.flush();
|
|
2750
|
+
});
|
|
2751
|
+
}
|
|
2752
|
+
const emitUnavailableWarning = () => {
|
|
2753
|
+
warnOnce5(
|
|
2754
|
+
`databuddy-unavailable:${key}`,
|
|
2755
|
+
"[Blyp] Databuddy connector is not configured. Databuddy requires both apiKey and websiteId. Skipping Databuddy delivery."
|
|
2756
|
+
);
|
|
2757
|
+
};
|
|
2758
|
+
const emitExceptionUnavailableWarning = () => {
|
|
2759
|
+
warnOnce5(
|
|
2760
|
+
`databuddy-exception-unavailable:${key}`,
|
|
2761
|
+
"[Blyp] Databuddy error tracking is not configured. Databuddy requires both apiKey and websiteId. Skipping Databuddy exception capture."
|
|
2762
|
+
);
|
|
2763
|
+
};
|
|
2764
|
+
const sender = {
|
|
2765
|
+
enabled: connector.enabled,
|
|
2766
|
+
ready: connector.ready,
|
|
2767
|
+
mode: connector.mode,
|
|
2768
|
+
status: connector.status,
|
|
2769
|
+
shouldAutoForwardServerLogs() {
|
|
2770
|
+
return connector.ready && connector.mode === "auto";
|
|
2771
|
+
},
|
|
2772
|
+
shouldAutoCaptureExceptions() {
|
|
2773
|
+
return connector.ready && connector.mode === "auto";
|
|
2774
|
+
},
|
|
2775
|
+
send(record, options = {}) {
|
|
2776
|
+
if (!connector.ready || !client) {
|
|
2777
|
+
if (options.warnIfUnavailable) {
|
|
2778
|
+
emitUnavailableWarning();
|
|
2779
|
+
}
|
|
2780
|
+
return;
|
|
2781
|
+
}
|
|
2782
|
+
try {
|
|
2783
|
+
const result = client.track(createTrackEvent(record, options.source ?? "server"));
|
|
2784
|
+
if (result && typeof result.catch === "function") {
|
|
2785
|
+
void result.catch((error) => {
|
|
2786
|
+
warnOnce5(
|
|
2787
|
+
`databuddy-send:${key}`,
|
|
2788
|
+
"[Blyp] Failed to deliver log to Databuddy.",
|
|
2789
|
+
error
|
|
2790
|
+
);
|
|
2791
|
+
});
|
|
2792
|
+
}
|
|
2793
|
+
} catch (error) {
|
|
2794
|
+
warnOnce5(
|
|
2795
|
+
`databuddy-send:${key}`,
|
|
2796
|
+
"[Blyp] Failed to deliver log to Databuddy.",
|
|
2797
|
+
error
|
|
2798
|
+
);
|
|
2799
|
+
}
|
|
2800
|
+
},
|
|
2801
|
+
captureException(error, options = {}) {
|
|
2802
|
+
if (!connector.ready || !client) {
|
|
2803
|
+
if (options.warnIfUnavailable) {
|
|
2804
|
+
emitExceptionUnavailableWarning();
|
|
2805
|
+
}
|
|
2806
|
+
return;
|
|
2807
|
+
}
|
|
2808
|
+
const normalized = normalizeExceptionInput3(
|
|
2809
|
+
error,
|
|
2810
|
+
options.source === "client" ? "Client error" : "Server error"
|
|
2811
|
+
);
|
|
2812
|
+
try {
|
|
2813
|
+
const result = client.track({
|
|
2814
|
+
name: "error",
|
|
2815
|
+
anonymousId: options.anonymousId,
|
|
2816
|
+
sessionId: options.sessionId,
|
|
2817
|
+
properties: {
|
|
2818
|
+
message: normalized.message,
|
|
2819
|
+
blyp_source: options.source ?? "server",
|
|
2820
|
+
blyp_level: "error",
|
|
2821
|
+
...normalized.properties,
|
|
2822
|
+
...options.properties ?? {}
|
|
2823
|
+
}
|
|
2824
|
+
});
|
|
2825
|
+
if (result && typeof result.catch === "function") {
|
|
2826
|
+
void result.catch((captureError) => {
|
|
2827
|
+
warnOnce5(
|
|
2828
|
+
`databuddy-capture:${key}`,
|
|
2829
|
+
"[Blyp] Failed to capture exception in Databuddy.",
|
|
2830
|
+
captureError
|
|
2831
|
+
);
|
|
2832
|
+
});
|
|
2833
|
+
}
|
|
2834
|
+
} catch (captureError) {
|
|
2835
|
+
warnOnce5(
|
|
2836
|
+
`databuddy-capture:${key}`,
|
|
2837
|
+
"[Blyp] Failed to capture exception in Databuddy.",
|
|
2838
|
+
captureError
|
|
2839
|
+
);
|
|
2840
|
+
}
|
|
2841
|
+
},
|
|
2842
|
+
async flush() {
|
|
2843
|
+
try {
|
|
2844
|
+
if (client) {
|
|
2845
|
+
await client.flush();
|
|
2846
|
+
}
|
|
2847
|
+
} catch (error) {
|
|
2848
|
+
warnOnce5(
|
|
2849
|
+
`databuddy-flush:${key}`,
|
|
2850
|
+
"[Blyp] Failed to flush Databuddy telemetry.",
|
|
2851
|
+
error
|
|
2852
|
+
);
|
|
2853
|
+
}
|
|
2854
|
+
}
|
|
2855
|
+
};
|
|
2856
|
+
senderCache.set(senderKey, sender);
|
|
2857
|
+
return sender;
|
|
2858
|
+
}
|
|
2859
|
+
var warnedKeys5 = /* @__PURE__ */ new Set();
|
|
2860
|
+
var testHooks4 = {};
|
|
2861
|
+
var warnOnce6 = createErrorOnceLogger(warnedKeys5);
|
|
2862
|
+
function getSentryModule2() {
|
|
2863
|
+
return testHooks4.module ?? Sentry;
|
|
2864
|
+
}
|
|
2865
|
+
function resolveConnectorConfig4(config) {
|
|
2533
2866
|
const connector = isBlypConfig(config) ? config.connectors?.sentry : config;
|
|
2534
2867
|
const enabled = connector?.enabled ?? false;
|
|
2535
2868
|
const dsn = connector?.dsn;
|
|
@@ -2674,7 +3007,7 @@ function hasConfigMismatch(connector, client) {
|
|
|
2674
3007
|
return hasNonEmptyString(connector.dsn) && connector.dsn !== options.dsn || hasNonEmptyString(connector.environment) && connector.environment !== options.environment || hasNonEmptyString(connector.release) && connector.release !== options.release;
|
|
2675
3008
|
}
|
|
2676
3009
|
function createSentrySender(config) {
|
|
2677
|
-
const connector =
|
|
3010
|
+
const connector = resolveConnectorConfig4(config);
|
|
2678
3011
|
const key = `${connector.mode}:${connector.dsn ?? "missing"}`;
|
|
2679
3012
|
const module = getSentryModule2();
|
|
2680
3013
|
let client = connector.enabled ? module.getClient() : void 0;
|
|
@@ -2688,7 +3021,7 @@ function createSentrySender(config) {
|
|
|
2688
3021
|
});
|
|
2689
3022
|
client = module.getClient();
|
|
2690
3023
|
} catch (error) {
|
|
2691
|
-
|
|
3024
|
+
warnOnce6(
|
|
2692
3025
|
`sentry-init:${key}`,
|
|
2693
3026
|
"[Blyp] Failed to initialize Sentry. Skipping Sentry delivery.",
|
|
2694
3027
|
error
|
|
@@ -2696,14 +3029,14 @@ function createSentrySender(config) {
|
|
|
2696
3029
|
}
|
|
2697
3030
|
}
|
|
2698
3031
|
if (client && hasConfigMismatch(connector, client)) {
|
|
2699
|
-
|
|
3032
|
+
warnOnce6(
|
|
2700
3033
|
`sentry-mismatch:${key}`,
|
|
2701
3034
|
"[Blyp] Sentry is already initialized with different options. Reusing the existing Sentry client."
|
|
2702
3035
|
);
|
|
2703
3036
|
}
|
|
2704
3037
|
const ready = connector.enabled && client !== void 0;
|
|
2705
3038
|
const emitUnavailableWarning = () => {
|
|
2706
|
-
|
|
3039
|
+
warnOnce6(
|
|
2707
3040
|
`sentry-unavailable:${key}`,
|
|
2708
3041
|
"[Blyp] Sentry connector is not configured. Skipping Sentry delivery."
|
|
2709
3042
|
);
|
|
@@ -2729,7 +3062,7 @@ function createSentrySender(config) {
|
|
|
2729
3062
|
try {
|
|
2730
3063
|
logMethod(record.message, attributes);
|
|
2731
3064
|
} catch (error) {
|
|
2732
|
-
|
|
3065
|
+
warnOnce6(
|
|
2733
3066
|
`sentry-log:${key}`,
|
|
2734
3067
|
"[Blyp] Failed to deliver log to Sentry.",
|
|
2735
3068
|
error
|
|
@@ -2747,7 +3080,7 @@ function createSentrySender(config) {
|
|
|
2747
3080
|
module.captureException(exception);
|
|
2748
3081
|
});
|
|
2749
3082
|
} catch (error) {
|
|
2750
|
-
|
|
3083
|
+
warnOnce6(
|
|
2751
3084
|
`sentry-exception:${key}`,
|
|
2752
3085
|
"[Blyp] Failed to capture exception in Sentry.",
|
|
2753
3086
|
error
|
|
@@ -2758,7 +3091,7 @@ function createSentrySender(config) {
|
|
|
2758
3091
|
try {
|
|
2759
3092
|
await module.flush(2e3);
|
|
2760
3093
|
} catch (error) {
|
|
2761
|
-
|
|
3094
|
+
warnOnce6(
|
|
2762
3095
|
`sentry-flush:${key}`,
|
|
2763
3096
|
"[Blyp] Failed to flush Sentry logs.",
|
|
2764
3097
|
error
|
|
@@ -2767,9 +3100,9 @@ function createSentrySender(config) {
|
|
|
2767
3100
|
}
|
|
2768
3101
|
};
|
|
2769
3102
|
}
|
|
2770
|
-
var
|
|
2771
|
-
var
|
|
2772
|
-
var
|
|
3103
|
+
var warnedKeys6 = /* @__PURE__ */ new Set();
|
|
3104
|
+
var testHooks5 = {};
|
|
3105
|
+
var warnOnce7 = createErrorOnceLogger(warnedKeys6);
|
|
2773
3106
|
function normalizeOTLPRecord(record, connector, source = "server") {
|
|
2774
3107
|
const severity = resolveSeverity2(record.level);
|
|
2775
3108
|
const body = typeof record.message === "string" ? record.message : String(record.message);
|
|
@@ -2834,14 +3167,14 @@ function resolveSeverity2(level) {
|
|
|
2834
3167
|
return { text: "info", number: SeverityNumber.INFO };
|
|
2835
3168
|
}
|
|
2836
3169
|
}
|
|
2837
|
-
function
|
|
3170
|
+
function registerShutdownHooks4(key, shutdown) {
|
|
2838
3171
|
const handlers = ["beforeExit", "SIGINT", "SIGTERM"];
|
|
2839
3172
|
for (const event of handlers) {
|
|
2840
3173
|
process.once(event, async () => {
|
|
2841
3174
|
try {
|
|
2842
3175
|
await shutdown();
|
|
2843
3176
|
} catch (error) {
|
|
2844
|
-
|
|
3177
|
+
warnOnce7(
|
|
2845
3178
|
`${key}:shutdown`,
|
|
2846
3179
|
"[Blyp] Failed to flush OTLP logs during shutdown.",
|
|
2847
3180
|
error
|
|
@@ -2918,7 +3251,7 @@ function createUnavailableSender(name, connector) {
|
|
|
2918
3251
|
const senderName = name || connector?.name || "otlp";
|
|
2919
3252
|
const key = `${senderName}:${connector?.serviceName ?? "blyp-app"}:${connector?.endpoint ?? "missing"}`;
|
|
2920
3253
|
const emitUnavailableWarning = () => {
|
|
2921
|
-
|
|
3254
|
+
warnOnce7(
|
|
2922
3255
|
`otlp-unavailable:${key}`,
|
|
2923
3256
|
`[Blyp] OTLP target "${senderName}" is not configured or not ready. Skipping OTLP delivery.`
|
|
2924
3257
|
);
|
|
@@ -2949,7 +3282,7 @@ function createSender(connector) {
|
|
|
2949
3282
|
...connector,
|
|
2950
3283
|
headers: resolveTransportHeaders(connector)
|
|
2951
3284
|
};
|
|
2952
|
-
const transport =
|
|
3285
|
+
const transport = testHooks5.createTransport?.(transportConnector) ?? createDefaultTransport2(transportConnector);
|
|
2953
3286
|
return {
|
|
2954
3287
|
name: connector.name,
|
|
2955
3288
|
enabled: connector.enabled,
|
|
@@ -2965,7 +3298,7 @@ function createSender(connector) {
|
|
|
2965
3298
|
const result = transport.emit(normalized);
|
|
2966
3299
|
if (result && typeof result.catch === "function") {
|
|
2967
3300
|
void result.catch((error) => {
|
|
2968
|
-
|
|
3301
|
+
warnOnce7(
|
|
2969
3302
|
`otlp-emit:${key}`,
|
|
2970
3303
|
`[Blyp] Failed to deliver log to OTLP target "${connector.name}".`,
|
|
2971
3304
|
error
|
|
@@ -2973,7 +3306,7 @@ function createSender(connector) {
|
|
|
2973
3306
|
});
|
|
2974
3307
|
}
|
|
2975
3308
|
} catch (error) {
|
|
2976
|
-
|
|
3309
|
+
warnOnce7(
|
|
2977
3310
|
`otlp-emit:${key}`,
|
|
2978
3311
|
`[Blyp] Failed to deliver log to OTLP target "${connector.name}".`,
|
|
2979
3312
|
error
|
|
@@ -2986,7 +3319,7 @@ function createSender(connector) {
|
|
|
2986
3319
|
await transport.flush();
|
|
2987
3320
|
}
|
|
2988
3321
|
} catch (error) {
|
|
2989
|
-
|
|
3322
|
+
warnOnce7(
|
|
2990
3323
|
`otlp-flush:${key}`,
|
|
2991
3324
|
`[Blyp] Failed to flush OTLP logs for target "${connector.name}".`,
|
|
2992
3325
|
error
|
|
@@ -3015,7 +3348,7 @@ function createOTLPRegistry(config) {
|
|
|
3015
3348
|
await Promise.all(Array.from(senders.values()).map((sender) => sender.flush()));
|
|
3016
3349
|
}
|
|
3017
3350
|
};
|
|
3018
|
-
|
|
3351
|
+
registerShutdownHooks4("otlp-registry", () => registry.flush());
|
|
3019
3352
|
return registry;
|
|
3020
3353
|
}
|
|
3021
3354
|
var _RuntimeDetector = class _RuntimeDetector {
|
|
@@ -3406,6 +3739,9 @@ function getPostHogSender(logger2) {
|
|
|
3406
3739
|
function getBetterStackSender(logger2) {
|
|
3407
3740
|
return getLoggerFactory(logger2).betterstack;
|
|
3408
3741
|
}
|
|
3742
|
+
function getDatabuddySender(logger2) {
|
|
3743
|
+
return getLoggerFactory(logger2).databuddy;
|
|
3744
|
+
}
|
|
3409
3745
|
function tryGetPostHogSender(logger2) {
|
|
3410
3746
|
try {
|
|
3411
3747
|
return getPostHogSender(logger2);
|
|
@@ -3420,6 +3756,13 @@ function tryGetBetterStackSender(logger2) {
|
|
|
3420
3756
|
return null;
|
|
3421
3757
|
}
|
|
3422
3758
|
}
|
|
3759
|
+
function tryGetDatabuddySender(logger2) {
|
|
3760
|
+
try {
|
|
3761
|
+
return getDatabuddySender(logger2);
|
|
3762
|
+
} catch {
|
|
3763
|
+
return null;
|
|
3764
|
+
}
|
|
3765
|
+
}
|
|
3423
3766
|
function getSentrySender(logger2) {
|
|
3424
3767
|
return getLoggerFactory(logger2).sentry;
|
|
3425
3768
|
}
|
|
@@ -3479,6 +3822,18 @@ function maybeSendToBetterStack(betterstack, record) {
|
|
|
3479
3822
|
}
|
|
3480
3823
|
betterstack.send(record, { source: "server", warnIfUnavailable: true });
|
|
3481
3824
|
}
|
|
3825
|
+
function maybeSendToDatabuddy(databuddy, record) {
|
|
3826
|
+
if (isClientLogRecord(record)) {
|
|
3827
|
+
return;
|
|
3828
|
+
}
|
|
3829
|
+
if (!databuddy.shouldAutoForwardServerLogs()) {
|
|
3830
|
+
if (databuddy.enabled && !databuddy.ready) {
|
|
3831
|
+
databuddy.send(record, { source: "server", warnIfUnavailable: true });
|
|
3832
|
+
}
|
|
3833
|
+
return;
|
|
3834
|
+
}
|
|
3835
|
+
databuddy.send(record, { source: "server", warnIfUnavailable: true });
|
|
3836
|
+
}
|
|
3482
3837
|
function maybeSendToSentry(sentry, record) {
|
|
3483
3838
|
if (isClientLogRecord(record)) {
|
|
3484
3839
|
return;
|
|
@@ -3499,7 +3854,7 @@ function maybeSendToOTLP(otlp, record) {
|
|
|
3499
3854
|
sender.send(record, { source: "server", warnIfUnavailable: true });
|
|
3500
3855
|
}
|
|
3501
3856
|
}
|
|
3502
|
-
function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry, otlp, bindings = {}, source = "root") {
|
|
3857
|
+
function createLoggerInstance(rootRawLogger, sink, betterstack, databuddy, posthog, sentry, otlp, bindings = {}, source = "root") {
|
|
3503
3858
|
const rawLogger = Object.keys(bindings).length > 0 ? rootRawLogger.child(bindings) : rootRawLogger;
|
|
3504
3859
|
const writeRecord = (level, message, args, writeSource = source) => {
|
|
3505
3860
|
if (writeSource === "root" && shouldDropRootLogWrite()) {
|
|
@@ -3525,6 +3880,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3525
3880
|
);
|
|
3526
3881
|
sink.write(record);
|
|
3527
3882
|
maybeSendToBetterStack(betterstack, record);
|
|
3883
|
+
maybeSendToDatabuddy(databuddy, record);
|
|
3528
3884
|
maybeSendToPostHog(posthog, record);
|
|
3529
3885
|
maybeSendToSentry(sentry, record);
|
|
3530
3886
|
maybeSendToOTLP(otlp, record);
|
|
@@ -3548,6 +3904,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3548
3904
|
sink.write(record);
|
|
3549
3905
|
}
|
|
3550
3906
|
maybeSendToBetterStack(betterstack, record);
|
|
3907
|
+
maybeSendToDatabuddy(databuddy, record);
|
|
3551
3908
|
maybeSendToPostHog(posthog, record);
|
|
3552
3909
|
maybeSendToSentry(sentry, record);
|
|
3553
3910
|
maybeSendToOTLP(otlp, record);
|
|
@@ -3581,8 +3938,26 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3581
3938
|
}
|
|
3582
3939
|
writeRecord("table", message, data === void 0 ? [] : [data]);
|
|
3583
3940
|
},
|
|
3584
|
-
flush: () =>
|
|
3585
|
-
|
|
3941
|
+
flush: async () => {
|
|
3942
|
+
await sink.flush();
|
|
3943
|
+
await Promise.allSettled([
|
|
3944
|
+
betterstack.flush(),
|
|
3945
|
+
databuddy.flush(),
|
|
3946
|
+
posthog.flush(),
|
|
3947
|
+
sentry.flush(),
|
|
3948
|
+
otlp.flush()
|
|
3949
|
+
]);
|
|
3950
|
+
},
|
|
3951
|
+
shutdown: async () => {
|
|
3952
|
+
await sink.shutdown();
|
|
3953
|
+
await Promise.allSettled([
|
|
3954
|
+
betterstack.flush(),
|
|
3955
|
+
databuddy.flush(),
|
|
3956
|
+
posthog.flush(),
|
|
3957
|
+
sentry.flush(),
|
|
3958
|
+
otlp.flush()
|
|
3959
|
+
]);
|
|
3960
|
+
},
|
|
3586
3961
|
createStructuredLog: (groupId, initial) => {
|
|
3587
3962
|
return createStructuredLogForLogger(logger2, groupId, {
|
|
3588
3963
|
initialFields: initial
|
|
@@ -3594,6 +3969,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3594
3969
|
rootRawLogger,
|
|
3595
3970
|
sink,
|
|
3596
3971
|
betterstack,
|
|
3972
|
+
databuddy,
|
|
3597
3973
|
posthog,
|
|
3598
3974
|
sentry,
|
|
3599
3975
|
otlp,
|
|
@@ -3604,6 +3980,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3604
3980
|
[LOGGER_FACTORY]: {
|
|
3605
3981
|
bindings,
|
|
3606
3982
|
betterstack,
|
|
3983
|
+
databuddy,
|
|
3607
3984
|
posthog,
|
|
3608
3985
|
sentry,
|
|
3609
3986
|
otlp,
|
|
@@ -3613,6 +3990,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3613
3990
|
rootRawLogger,
|
|
3614
3991
|
sink,
|
|
3615
3992
|
betterstack,
|
|
3993
|
+
databuddy,
|
|
3616
3994
|
posthog,
|
|
3617
3995
|
sentry,
|
|
3618
3996
|
otlp,
|
|
@@ -3636,6 +4014,7 @@ function createBaseLogger(config) {
|
|
|
3636
4014
|
const rawLogger = createPinoLogger(resolvedConfig);
|
|
3637
4015
|
const sink = createPrimarySink(resolvedConfig);
|
|
3638
4016
|
const betterstack = createBetterStackSender(resolvedConfig);
|
|
4017
|
+
const databuddy = createDatabuddySender(resolvedConfig);
|
|
3639
4018
|
const posthog = createPostHogSender(resolvedConfig);
|
|
3640
4019
|
const sentry = createSentrySender(resolvedConfig);
|
|
3641
4020
|
const otlp = createOTLPRegistry(resolvedConfig);
|
|
@@ -3643,6 +4022,7 @@ function createBaseLogger(config) {
|
|
|
3643
4022
|
rawLogger,
|
|
3644
4023
|
sink,
|
|
3645
4024
|
betterstack,
|
|
4025
|
+
databuddy,
|
|
3646
4026
|
posthog,
|
|
3647
4027
|
sentry,
|
|
3648
4028
|
otlp
|
|
@@ -3725,6 +4105,7 @@ function resolveServerLogger(config = {}, loggerOverride) {
|
|
|
3725
4105
|
return {
|
|
3726
4106
|
logger: logger2,
|
|
3727
4107
|
betterstack: getBetterStackSender(logger2),
|
|
4108
|
+
databuddy: getDatabuddySender(logger2),
|
|
3728
4109
|
posthog: getPostHogSender(logger2),
|
|
3729
4110
|
sentry: getSentrySender(logger2),
|
|
3730
4111
|
otlp: getOtlpRegistry(logger2),
|
|
@@ -3844,6 +4225,22 @@ function emitHttpErrorLog(logger2, level, request, path3, statusCode, responseTi
|
|
|
3844
4225
|
}
|
|
3845
4226
|
});
|
|
3846
4227
|
}
|
|
4228
|
+
const databuddy = tryGetDatabuddySender(logger2);
|
|
4229
|
+
if (databuddy?.shouldAutoCaptureExceptions()) {
|
|
4230
|
+
databuddy.captureException(captureContext.error ?? error ?? message, {
|
|
4231
|
+
source: "server",
|
|
4232
|
+
warnIfUnavailable: true,
|
|
4233
|
+
properties: {
|
|
4234
|
+
method: request.method,
|
|
4235
|
+
path: path3,
|
|
4236
|
+
status_code: statusCode,
|
|
4237
|
+
...request.url ? { current_url: request.url } : {},
|
|
4238
|
+
...getHeaderValue(request.headers, "user-agent") ? { user_agent: getHeaderValue(request.headers, "user-agent") } : {},
|
|
4239
|
+
...errorLogData.ip ? { ip: errorLogData.ip } : {},
|
|
4240
|
+
payload: errorLogData
|
|
4241
|
+
}
|
|
4242
|
+
});
|
|
4243
|
+
}
|
|
3847
4244
|
return errorLogData;
|
|
3848
4245
|
}
|
|
3849
4246
|
async function parseClientLogPayload(request, body) {
|
|
@@ -3935,6 +4332,34 @@ async function handleClientLogIngestion(options) {
|
|
|
3935
4332
|
});
|
|
3936
4333
|
}
|
|
3937
4334
|
}
|
|
4335
|
+
} else if (payload.connector === "databuddy") {
|
|
4336
|
+
headers["x-blyp-databuddy-status"] = config.databuddy.ready ? "enabled" : "missing";
|
|
4337
|
+
if (config.databuddy.ready) {
|
|
4338
|
+
const forwardedRecord = {
|
|
4339
|
+
timestamp: structuredPayload.receivedAt,
|
|
4340
|
+
level: payload.level,
|
|
4341
|
+
message: `[client] ${payload.message}`,
|
|
4342
|
+
data: structuredPayload
|
|
4343
|
+
};
|
|
4344
|
+
config.databuddy.send(forwardedRecord, {
|
|
4345
|
+
source: "client"
|
|
4346
|
+
});
|
|
4347
|
+
if ((payload.level === "error" || payload.level === "critical") && config.databuddy.shouldAutoCaptureExceptions()) {
|
|
4348
|
+
const clientErrorCandidate = payload.data && typeof payload.data === "object" && !Array.isArray(payload.data) && typeof payload.data.message === "string" ? payload.data : payload.message;
|
|
4349
|
+
config.databuddy.captureException(clientErrorCandidate, {
|
|
4350
|
+
source: "client",
|
|
4351
|
+
warnIfUnavailable: true,
|
|
4352
|
+
sessionId: payload.session.sessionId,
|
|
4353
|
+
properties: {
|
|
4354
|
+
page_url: payload.page.url,
|
|
4355
|
+
page_path: payload.page.pathname,
|
|
4356
|
+
client_runtime: payload.device?.runtime,
|
|
4357
|
+
metadata: payload.metadata,
|
|
4358
|
+
payload: structuredPayload
|
|
4359
|
+
}
|
|
4360
|
+
});
|
|
4361
|
+
}
|
|
4362
|
+
}
|
|
3938
4363
|
} else if (payload.connector === "posthog") {
|
|
3939
4364
|
headers["x-blyp-posthog-status"] = config.posthog.ready ? "enabled" : "missing";
|
|
3940
4365
|
if (config.posthog.ready) {
|