@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/express.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)
|
|
@@ -2526,12 +2551,320 @@ function createBetterStackSender(config) {
|
|
|
2526
2551
|
};
|
|
2527
2552
|
}
|
|
2528
2553
|
var warnedKeys4 = /* @__PURE__ */ new Set();
|
|
2554
|
+
var senderCache = /* @__PURE__ */ new Map();
|
|
2529
2555
|
var testHooks3 = {};
|
|
2530
2556
|
var warnOnce5 = createErrorOnceLogger(warnedKeys4);
|
|
2531
|
-
function
|
|
2532
|
-
|
|
2557
|
+
function registerShutdownHooks3(key, shutdown) {
|
|
2558
|
+
const handlers = ["beforeExit", "SIGINT", "SIGTERM"];
|
|
2559
|
+
for (const event of handlers) {
|
|
2560
|
+
process.once(event, () => {
|
|
2561
|
+
void shutdown().catch((error) => {
|
|
2562
|
+
warnOnce5(
|
|
2563
|
+
`${key}:shutdown`,
|
|
2564
|
+
"[Blyp] Failed to flush Databuddy telemetry during shutdown.",
|
|
2565
|
+
error
|
|
2566
|
+
);
|
|
2567
|
+
});
|
|
2568
|
+
});
|
|
2569
|
+
}
|
|
2533
2570
|
}
|
|
2534
2571
|
function resolveConnectorConfig3(config) {
|
|
2572
|
+
const connector = isBlypConfig(config) ? config.connectors?.databuddy : config;
|
|
2573
|
+
const enabled = connector?.enabled ?? false;
|
|
2574
|
+
const apiKey = connector?.apiKey;
|
|
2575
|
+
const websiteId = connector?.websiteId;
|
|
2576
|
+
const ready = enabled && hasNonEmptyString(apiKey) && hasNonEmptyString(websiteId);
|
|
2577
|
+
return {
|
|
2578
|
+
enabled,
|
|
2579
|
+
mode: connector?.mode ?? "auto",
|
|
2580
|
+
apiKey,
|
|
2581
|
+
websiteId,
|
|
2582
|
+
namespace: connector?.namespace,
|
|
2583
|
+
source: connector?.source,
|
|
2584
|
+
apiUrl: connector?.apiUrl,
|
|
2585
|
+
debug: connector?.debug ?? false,
|
|
2586
|
+
enableBatching: connector?.enableBatching ?? true,
|
|
2587
|
+
batchSize: connector?.batchSize,
|
|
2588
|
+
batchTimeout: connector?.batchTimeout,
|
|
2589
|
+
maxQueueSize: connector?.maxQueueSize,
|
|
2590
|
+
ready,
|
|
2591
|
+
status: ready ? "enabled" : "missing"
|
|
2592
|
+
};
|
|
2593
|
+
}
|
|
2594
|
+
function createDefaultClient2(connector) {
|
|
2595
|
+
return new Databuddy({
|
|
2596
|
+
apiKey: connector.apiKey ?? "",
|
|
2597
|
+
...connector.websiteId ? { websiteId: connector.websiteId } : {},
|
|
2598
|
+
...connector.namespace ? { namespace: connector.namespace } : {},
|
|
2599
|
+
...connector.source ? { source: connector.source } : {},
|
|
2600
|
+
...connector.apiUrl ? { apiUrl: connector.apiUrl } : {},
|
|
2601
|
+
debug: connector.debug,
|
|
2602
|
+
enableBatching: connector.enableBatching,
|
|
2603
|
+
...connector.batchSize !== void 0 ? { batchSize: connector.batchSize } : {},
|
|
2604
|
+
...connector.batchTimeout !== void 0 ? { batchTimeout: connector.batchTimeout } : {},
|
|
2605
|
+
...connector.maxQueueSize !== void 0 ? { maxQueueSize: connector.maxQueueSize } : {}
|
|
2606
|
+
});
|
|
2607
|
+
}
|
|
2608
|
+
function getDatabuddySenderKey(connector) {
|
|
2609
|
+
return JSON.stringify({
|
|
2610
|
+
enabled: connector.enabled,
|
|
2611
|
+
mode: connector.mode,
|
|
2612
|
+
apiKey: connector.apiKey ?? null,
|
|
2613
|
+
websiteId: connector.websiteId ?? null,
|
|
2614
|
+
namespace: connector.namespace ?? null,
|
|
2615
|
+
source: connector.source ?? null,
|
|
2616
|
+
apiUrl: connector.apiUrl ?? null,
|
|
2617
|
+
debug: connector.debug,
|
|
2618
|
+
enableBatching: connector.enableBatching,
|
|
2619
|
+
batchSize: connector.batchSize ?? null,
|
|
2620
|
+
batchTimeout: connector.batchTimeout ?? null,
|
|
2621
|
+
maxQueueSize: connector.maxQueueSize ?? null
|
|
2622
|
+
});
|
|
2623
|
+
}
|
|
2624
|
+
function getSessionId(record) {
|
|
2625
|
+
const direct = getField(record, "sessionId");
|
|
2626
|
+
if (hasNonEmptyString(direct)) {
|
|
2627
|
+
return direct;
|
|
2628
|
+
}
|
|
2629
|
+
return getClientSessionField(record, "sessionId");
|
|
2630
|
+
}
|
|
2631
|
+
function getAnonymousId(record) {
|
|
2632
|
+
const direct = getField(record, "anonymousId");
|
|
2633
|
+
if (hasNonEmptyString(direct)) {
|
|
2634
|
+
return direct;
|
|
2635
|
+
}
|
|
2636
|
+
const payload = getPrimaryPayload(record);
|
|
2637
|
+
if (isPlainObject(payload.metadata) && hasNonEmptyString(payload.metadata.databuddyAnonymousId)) {
|
|
2638
|
+
return payload.metadata.databuddyAnonymousId;
|
|
2639
|
+
}
|
|
2640
|
+
return void 0;
|
|
2641
|
+
}
|
|
2642
|
+
function getDatabuddyEventName(record) {
|
|
2643
|
+
const recordType = getRecordType(record);
|
|
2644
|
+
if (hasNonEmptyString(recordType)) {
|
|
2645
|
+
return recordType;
|
|
2646
|
+
}
|
|
2647
|
+
return "log";
|
|
2648
|
+
}
|
|
2649
|
+
function buildRecordProperties(record, source) {
|
|
2650
|
+
const properties = {
|
|
2651
|
+
blyp_level: record.level,
|
|
2652
|
+
blyp_source: source,
|
|
2653
|
+
blyp_payload: serializeLogRecord(record),
|
|
2654
|
+
message: typeof record.message === "string" ? record.message : String(record.message)
|
|
2655
|
+
};
|
|
2656
|
+
const caller = typeof record.caller === "string" ? record.caller : void 0;
|
|
2657
|
+
const groupId = getField(record, "groupId");
|
|
2658
|
+
const method = getField(record, "method");
|
|
2659
|
+
const path3 = getField(record, "path");
|
|
2660
|
+
const status = getField(record, "status");
|
|
2661
|
+
const duration = getField(record, "duration");
|
|
2662
|
+
const pagePath = getClientPageField(record, "pathname");
|
|
2663
|
+
const pageUrl = getClientPageField(record, "url");
|
|
2664
|
+
const sessionId = getClientSessionField(record, "sessionId");
|
|
2665
|
+
const pageId = getClientSessionField(record, "pageId");
|
|
2666
|
+
const ifTruthy = [
|
|
2667
|
+
["blyp_type", getRecordType(record)],
|
|
2668
|
+
["caller", caller],
|
|
2669
|
+
["group_id", groupId],
|
|
2670
|
+
["method", method],
|
|
2671
|
+
["path", path3],
|
|
2672
|
+
["page_path", pagePath],
|
|
2673
|
+
["page_url", pageUrl],
|
|
2674
|
+
["session_id", sessionId],
|
|
2675
|
+
["page_id", pageId]
|
|
2676
|
+
];
|
|
2677
|
+
const ifDefined = [
|
|
2678
|
+
["status_code", status],
|
|
2679
|
+
["duration_ms", duration]
|
|
2680
|
+
];
|
|
2681
|
+
for (const [key, value] of ifTruthy) {
|
|
2682
|
+
if (value) {
|
|
2683
|
+
properties[key] = value;
|
|
2684
|
+
}
|
|
2685
|
+
}
|
|
2686
|
+
for (const [key, value] of ifDefined) {
|
|
2687
|
+
if (value !== void 0) {
|
|
2688
|
+
properties[key] = value;
|
|
2689
|
+
}
|
|
2690
|
+
}
|
|
2691
|
+
return properties;
|
|
2692
|
+
}
|
|
2693
|
+
function createTrackEvent(record, source) {
|
|
2694
|
+
return {
|
|
2695
|
+
name: getDatabuddyEventName(record),
|
|
2696
|
+
anonymousId: getAnonymousId(record),
|
|
2697
|
+
sessionId: getSessionId(record),
|
|
2698
|
+
properties: buildRecordProperties(record, source)
|
|
2699
|
+
};
|
|
2700
|
+
}
|
|
2701
|
+
function normalizeExceptionProperties2(value) {
|
|
2702
|
+
if (!isPlainObject(value)) {
|
|
2703
|
+
return {};
|
|
2704
|
+
}
|
|
2705
|
+
return normalizeLogValue(value);
|
|
2706
|
+
}
|
|
2707
|
+
function normalizeExceptionInput3(value, fallbackMessage) {
|
|
2708
|
+
if (value instanceof Error) {
|
|
2709
|
+
return {
|
|
2710
|
+
message: value.message || fallbackMessage,
|
|
2711
|
+
properties: {
|
|
2712
|
+
error_type: value.name,
|
|
2713
|
+
...value.stack ? { stack: value.stack } : {},
|
|
2714
|
+
...normalizeExceptionProperties2(value)
|
|
2715
|
+
}
|
|
2716
|
+
};
|
|
2717
|
+
}
|
|
2718
|
+
if (isPlainObject(value)) {
|
|
2719
|
+
const message = hasNonEmptyString(value.message) ? value.message : hasNonEmptyString(value.error) ? value.error : fallbackMessage;
|
|
2720
|
+
return {
|
|
2721
|
+
message,
|
|
2722
|
+
properties: normalizeExceptionProperties2(value)
|
|
2723
|
+
};
|
|
2724
|
+
}
|
|
2725
|
+
if (typeof value === "string") {
|
|
2726
|
+
return {
|
|
2727
|
+
message: value,
|
|
2728
|
+
properties: {
|
|
2729
|
+
message: value
|
|
2730
|
+
}
|
|
2731
|
+
};
|
|
2732
|
+
}
|
|
2733
|
+
return {
|
|
2734
|
+
message: fallbackMessage,
|
|
2735
|
+
properties: {
|
|
2736
|
+
value: normalizeLogValue(value)
|
|
2737
|
+
}
|
|
2738
|
+
};
|
|
2739
|
+
}
|
|
2740
|
+
function createDatabuddySender(config) {
|
|
2741
|
+
const connector = resolveConnectorConfig3(config);
|
|
2742
|
+
const senderKey = getDatabuddySenderKey(connector);
|
|
2743
|
+
const cached = senderCache.get(senderKey);
|
|
2744
|
+
if (cached) {
|
|
2745
|
+
return cached;
|
|
2746
|
+
}
|
|
2747
|
+
const key = `${connector.apiUrl ?? "default"}:${connector.mode}:${connector.apiKey ?? "missing"}`;
|
|
2748
|
+
const client = connector.ready ? testHooks3.createClient?.(connector) ?? createDefaultClient2(connector) : void 0;
|
|
2749
|
+
if (client) {
|
|
2750
|
+
registerShutdownHooks3(key, async () => {
|
|
2751
|
+
await client.flush();
|
|
2752
|
+
});
|
|
2753
|
+
}
|
|
2754
|
+
const emitUnavailableWarning = () => {
|
|
2755
|
+
warnOnce5(
|
|
2756
|
+
`databuddy-unavailable:${key}`,
|
|
2757
|
+
"[Blyp] Databuddy connector is not configured. Databuddy requires both apiKey and websiteId. Skipping Databuddy delivery."
|
|
2758
|
+
);
|
|
2759
|
+
};
|
|
2760
|
+
const emitExceptionUnavailableWarning = () => {
|
|
2761
|
+
warnOnce5(
|
|
2762
|
+
`databuddy-exception-unavailable:${key}`,
|
|
2763
|
+
"[Blyp] Databuddy error tracking is not configured. Databuddy requires both apiKey and websiteId. Skipping Databuddy exception capture."
|
|
2764
|
+
);
|
|
2765
|
+
};
|
|
2766
|
+
const sender = {
|
|
2767
|
+
enabled: connector.enabled,
|
|
2768
|
+
ready: connector.ready,
|
|
2769
|
+
mode: connector.mode,
|
|
2770
|
+
status: connector.status,
|
|
2771
|
+
shouldAutoForwardServerLogs() {
|
|
2772
|
+
return connector.ready && connector.mode === "auto";
|
|
2773
|
+
},
|
|
2774
|
+
shouldAutoCaptureExceptions() {
|
|
2775
|
+
return connector.ready && connector.mode === "auto";
|
|
2776
|
+
},
|
|
2777
|
+
send(record, options = {}) {
|
|
2778
|
+
if (!connector.ready || !client) {
|
|
2779
|
+
if (options.warnIfUnavailable) {
|
|
2780
|
+
emitUnavailableWarning();
|
|
2781
|
+
}
|
|
2782
|
+
return;
|
|
2783
|
+
}
|
|
2784
|
+
try {
|
|
2785
|
+
const result = client.track(createTrackEvent(record, options.source ?? "server"));
|
|
2786
|
+
if (result && typeof result.catch === "function") {
|
|
2787
|
+
void result.catch((error) => {
|
|
2788
|
+
warnOnce5(
|
|
2789
|
+
`databuddy-send:${key}`,
|
|
2790
|
+
"[Blyp] Failed to deliver log to Databuddy.",
|
|
2791
|
+
error
|
|
2792
|
+
);
|
|
2793
|
+
});
|
|
2794
|
+
}
|
|
2795
|
+
} catch (error) {
|
|
2796
|
+
warnOnce5(
|
|
2797
|
+
`databuddy-send:${key}`,
|
|
2798
|
+
"[Blyp] Failed to deliver log to Databuddy.",
|
|
2799
|
+
error
|
|
2800
|
+
);
|
|
2801
|
+
}
|
|
2802
|
+
},
|
|
2803
|
+
captureException(error, options = {}) {
|
|
2804
|
+
if (!connector.ready || !client) {
|
|
2805
|
+
if (options.warnIfUnavailable) {
|
|
2806
|
+
emitExceptionUnavailableWarning();
|
|
2807
|
+
}
|
|
2808
|
+
return;
|
|
2809
|
+
}
|
|
2810
|
+
const normalized = normalizeExceptionInput3(
|
|
2811
|
+
error,
|
|
2812
|
+
options.source === "client" ? "Client error" : "Server error"
|
|
2813
|
+
);
|
|
2814
|
+
try {
|
|
2815
|
+
const result = client.track({
|
|
2816
|
+
name: "error",
|
|
2817
|
+
anonymousId: options.anonymousId,
|
|
2818
|
+
sessionId: options.sessionId,
|
|
2819
|
+
properties: {
|
|
2820
|
+
message: normalized.message,
|
|
2821
|
+
blyp_source: options.source ?? "server",
|
|
2822
|
+
blyp_level: "error",
|
|
2823
|
+
...normalized.properties,
|
|
2824
|
+
...options.properties ?? {}
|
|
2825
|
+
}
|
|
2826
|
+
});
|
|
2827
|
+
if (result && typeof result.catch === "function") {
|
|
2828
|
+
void result.catch((captureError) => {
|
|
2829
|
+
warnOnce5(
|
|
2830
|
+
`databuddy-capture:${key}`,
|
|
2831
|
+
"[Blyp] Failed to capture exception in Databuddy.",
|
|
2832
|
+
captureError
|
|
2833
|
+
);
|
|
2834
|
+
});
|
|
2835
|
+
}
|
|
2836
|
+
} catch (captureError) {
|
|
2837
|
+
warnOnce5(
|
|
2838
|
+
`databuddy-capture:${key}`,
|
|
2839
|
+
"[Blyp] Failed to capture exception in Databuddy.",
|
|
2840
|
+
captureError
|
|
2841
|
+
);
|
|
2842
|
+
}
|
|
2843
|
+
},
|
|
2844
|
+
async flush() {
|
|
2845
|
+
try {
|
|
2846
|
+
if (client) {
|
|
2847
|
+
await client.flush();
|
|
2848
|
+
}
|
|
2849
|
+
} catch (error) {
|
|
2850
|
+
warnOnce5(
|
|
2851
|
+
`databuddy-flush:${key}`,
|
|
2852
|
+
"[Blyp] Failed to flush Databuddy telemetry.",
|
|
2853
|
+
error
|
|
2854
|
+
);
|
|
2855
|
+
}
|
|
2856
|
+
}
|
|
2857
|
+
};
|
|
2858
|
+
senderCache.set(senderKey, sender);
|
|
2859
|
+
return sender;
|
|
2860
|
+
}
|
|
2861
|
+
var warnedKeys5 = /* @__PURE__ */ new Set();
|
|
2862
|
+
var testHooks4 = {};
|
|
2863
|
+
var warnOnce6 = createErrorOnceLogger(warnedKeys5);
|
|
2864
|
+
function getSentryModule2() {
|
|
2865
|
+
return testHooks4.module ?? Sentry;
|
|
2866
|
+
}
|
|
2867
|
+
function resolveConnectorConfig4(config) {
|
|
2535
2868
|
const connector = isBlypConfig(config) ? config.connectors?.sentry : config;
|
|
2536
2869
|
const enabled = connector?.enabled ?? false;
|
|
2537
2870
|
const dsn = connector?.dsn;
|
|
@@ -2676,7 +3009,7 @@ function hasConfigMismatch(connector, client) {
|
|
|
2676
3009
|
return hasNonEmptyString(connector.dsn) && connector.dsn !== options.dsn || hasNonEmptyString(connector.environment) && connector.environment !== options.environment || hasNonEmptyString(connector.release) && connector.release !== options.release;
|
|
2677
3010
|
}
|
|
2678
3011
|
function createSentrySender(config) {
|
|
2679
|
-
const connector =
|
|
3012
|
+
const connector = resolveConnectorConfig4(config);
|
|
2680
3013
|
const key = `${connector.mode}:${connector.dsn ?? "missing"}`;
|
|
2681
3014
|
const module = getSentryModule2();
|
|
2682
3015
|
let client = connector.enabled ? module.getClient() : void 0;
|
|
@@ -2690,7 +3023,7 @@ function createSentrySender(config) {
|
|
|
2690
3023
|
});
|
|
2691
3024
|
client = module.getClient();
|
|
2692
3025
|
} catch (error) {
|
|
2693
|
-
|
|
3026
|
+
warnOnce6(
|
|
2694
3027
|
`sentry-init:${key}`,
|
|
2695
3028
|
"[Blyp] Failed to initialize Sentry. Skipping Sentry delivery.",
|
|
2696
3029
|
error
|
|
@@ -2698,14 +3031,14 @@ function createSentrySender(config) {
|
|
|
2698
3031
|
}
|
|
2699
3032
|
}
|
|
2700
3033
|
if (client && hasConfigMismatch(connector, client)) {
|
|
2701
|
-
|
|
3034
|
+
warnOnce6(
|
|
2702
3035
|
`sentry-mismatch:${key}`,
|
|
2703
3036
|
"[Blyp] Sentry is already initialized with different options. Reusing the existing Sentry client."
|
|
2704
3037
|
);
|
|
2705
3038
|
}
|
|
2706
3039
|
const ready = connector.enabled && client !== void 0;
|
|
2707
3040
|
const emitUnavailableWarning = () => {
|
|
2708
|
-
|
|
3041
|
+
warnOnce6(
|
|
2709
3042
|
`sentry-unavailable:${key}`,
|
|
2710
3043
|
"[Blyp] Sentry connector is not configured. Skipping Sentry delivery."
|
|
2711
3044
|
);
|
|
@@ -2731,7 +3064,7 @@ function createSentrySender(config) {
|
|
|
2731
3064
|
try {
|
|
2732
3065
|
logMethod(record.message, attributes);
|
|
2733
3066
|
} catch (error) {
|
|
2734
|
-
|
|
3067
|
+
warnOnce6(
|
|
2735
3068
|
`sentry-log:${key}`,
|
|
2736
3069
|
"[Blyp] Failed to deliver log to Sentry.",
|
|
2737
3070
|
error
|
|
@@ -2749,7 +3082,7 @@ function createSentrySender(config) {
|
|
|
2749
3082
|
module.captureException(exception);
|
|
2750
3083
|
});
|
|
2751
3084
|
} catch (error) {
|
|
2752
|
-
|
|
3085
|
+
warnOnce6(
|
|
2753
3086
|
`sentry-exception:${key}`,
|
|
2754
3087
|
"[Blyp] Failed to capture exception in Sentry.",
|
|
2755
3088
|
error
|
|
@@ -2760,7 +3093,7 @@ function createSentrySender(config) {
|
|
|
2760
3093
|
try {
|
|
2761
3094
|
await module.flush(2e3);
|
|
2762
3095
|
} catch (error) {
|
|
2763
|
-
|
|
3096
|
+
warnOnce6(
|
|
2764
3097
|
`sentry-flush:${key}`,
|
|
2765
3098
|
"[Blyp] Failed to flush Sentry logs.",
|
|
2766
3099
|
error
|
|
@@ -2769,9 +3102,9 @@ function createSentrySender(config) {
|
|
|
2769
3102
|
}
|
|
2770
3103
|
};
|
|
2771
3104
|
}
|
|
2772
|
-
var
|
|
2773
|
-
var
|
|
2774
|
-
var
|
|
3105
|
+
var warnedKeys6 = /* @__PURE__ */ new Set();
|
|
3106
|
+
var testHooks5 = {};
|
|
3107
|
+
var warnOnce7 = createErrorOnceLogger(warnedKeys6);
|
|
2775
3108
|
function normalizeOTLPRecord(record, connector, source = "server") {
|
|
2776
3109
|
const severity = resolveSeverity2(record.level);
|
|
2777
3110
|
const body = typeof record.message === "string" ? record.message : String(record.message);
|
|
@@ -2836,14 +3169,14 @@ function resolveSeverity2(level) {
|
|
|
2836
3169
|
return { text: "info", number: SeverityNumber.INFO };
|
|
2837
3170
|
}
|
|
2838
3171
|
}
|
|
2839
|
-
function
|
|
3172
|
+
function registerShutdownHooks4(key, shutdown) {
|
|
2840
3173
|
const handlers = ["beforeExit", "SIGINT", "SIGTERM"];
|
|
2841
3174
|
for (const event of handlers) {
|
|
2842
3175
|
process.once(event, async () => {
|
|
2843
3176
|
try {
|
|
2844
3177
|
await shutdown();
|
|
2845
3178
|
} catch (error) {
|
|
2846
|
-
|
|
3179
|
+
warnOnce7(
|
|
2847
3180
|
`${key}:shutdown`,
|
|
2848
3181
|
"[Blyp] Failed to flush OTLP logs during shutdown.",
|
|
2849
3182
|
error
|
|
@@ -2920,7 +3253,7 @@ function createUnavailableSender(name, connector) {
|
|
|
2920
3253
|
const senderName = name || connector?.name || "otlp";
|
|
2921
3254
|
const key = `${senderName}:${connector?.serviceName ?? "blyp-app"}:${connector?.endpoint ?? "missing"}`;
|
|
2922
3255
|
const emitUnavailableWarning = () => {
|
|
2923
|
-
|
|
3256
|
+
warnOnce7(
|
|
2924
3257
|
`otlp-unavailable:${key}`,
|
|
2925
3258
|
`[Blyp] OTLP target "${senderName}" is not configured or not ready. Skipping OTLP delivery.`
|
|
2926
3259
|
);
|
|
@@ -2951,7 +3284,7 @@ function createSender(connector) {
|
|
|
2951
3284
|
...connector,
|
|
2952
3285
|
headers: resolveTransportHeaders(connector)
|
|
2953
3286
|
};
|
|
2954
|
-
const transport =
|
|
3287
|
+
const transport = testHooks5.createTransport?.(transportConnector) ?? createDefaultTransport2(transportConnector);
|
|
2955
3288
|
return {
|
|
2956
3289
|
name: connector.name,
|
|
2957
3290
|
enabled: connector.enabled,
|
|
@@ -2967,7 +3300,7 @@ function createSender(connector) {
|
|
|
2967
3300
|
const result = transport.emit(normalized);
|
|
2968
3301
|
if (result && typeof result.catch === "function") {
|
|
2969
3302
|
void result.catch((error) => {
|
|
2970
|
-
|
|
3303
|
+
warnOnce7(
|
|
2971
3304
|
`otlp-emit:${key}`,
|
|
2972
3305
|
`[Blyp] Failed to deliver log to OTLP target "${connector.name}".`,
|
|
2973
3306
|
error
|
|
@@ -2975,7 +3308,7 @@ function createSender(connector) {
|
|
|
2975
3308
|
});
|
|
2976
3309
|
}
|
|
2977
3310
|
} catch (error) {
|
|
2978
|
-
|
|
3311
|
+
warnOnce7(
|
|
2979
3312
|
`otlp-emit:${key}`,
|
|
2980
3313
|
`[Blyp] Failed to deliver log to OTLP target "${connector.name}".`,
|
|
2981
3314
|
error
|
|
@@ -2988,7 +3321,7 @@ function createSender(connector) {
|
|
|
2988
3321
|
await transport.flush();
|
|
2989
3322
|
}
|
|
2990
3323
|
} catch (error) {
|
|
2991
|
-
|
|
3324
|
+
warnOnce7(
|
|
2992
3325
|
`otlp-flush:${key}`,
|
|
2993
3326
|
`[Blyp] Failed to flush OTLP logs for target "${connector.name}".`,
|
|
2994
3327
|
error
|
|
@@ -3017,7 +3350,7 @@ function createOTLPRegistry(config) {
|
|
|
3017
3350
|
await Promise.all(Array.from(senders.values()).map((sender) => sender.flush()));
|
|
3018
3351
|
}
|
|
3019
3352
|
};
|
|
3020
|
-
|
|
3353
|
+
registerShutdownHooks4("otlp-registry", () => registry.flush());
|
|
3021
3354
|
return registry;
|
|
3022
3355
|
}
|
|
3023
3356
|
var _RuntimeDetector = class _RuntimeDetector {
|
|
@@ -3408,6 +3741,9 @@ function getPostHogSender(logger2) {
|
|
|
3408
3741
|
function getBetterStackSender(logger2) {
|
|
3409
3742
|
return getLoggerFactory(logger2).betterstack;
|
|
3410
3743
|
}
|
|
3744
|
+
function getDatabuddySender(logger2) {
|
|
3745
|
+
return getLoggerFactory(logger2).databuddy;
|
|
3746
|
+
}
|
|
3411
3747
|
function tryGetPostHogSender(logger2) {
|
|
3412
3748
|
try {
|
|
3413
3749
|
return getPostHogSender(logger2);
|
|
@@ -3422,6 +3758,13 @@ function tryGetBetterStackSender(logger2) {
|
|
|
3422
3758
|
return null;
|
|
3423
3759
|
}
|
|
3424
3760
|
}
|
|
3761
|
+
function tryGetDatabuddySender(logger2) {
|
|
3762
|
+
try {
|
|
3763
|
+
return getDatabuddySender(logger2);
|
|
3764
|
+
} catch {
|
|
3765
|
+
return null;
|
|
3766
|
+
}
|
|
3767
|
+
}
|
|
3425
3768
|
function getSentrySender(logger2) {
|
|
3426
3769
|
return getLoggerFactory(logger2).sentry;
|
|
3427
3770
|
}
|
|
@@ -3481,6 +3824,18 @@ function maybeSendToBetterStack(betterstack, record) {
|
|
|
3481
3824
|
}
|
|
3482
3825
|
betterstack.send(record, { source: "server", warnIfUnavailable: true });
|
|
3483
3826
|
}
|
|
3827
|
+
function maybeSendToDatabuddy(databuddy, record) {
|
|
3828
|
+
if (isClientLogRecord(record)) {
|
|
3829
|
+
return;
|
|
3830
|
+
}
|
|
3831
|
+
if (!databuddy.shouldAutoForwardServerLogs()) {
|
|
3832
|
+
if (databuddy.enabled && !databuddy.ready) {
|
|
3833
|
+
databuddy.send(record, { source: "server", warnIfUnavailable: true });
|
|
3834
|
+
}
|
|
3835
|
+
return;
|
|
3836
|
+
}
|
|
3837
|
+
databuddy.send(record, { source: "server", warnIfUnavailable: true });
|
|
3838
|
+
}
|
|
3484
3839
|
function maybeSendToSentry(sentry, record) {
|
|
3485
3840
|
if (isClientLogRecord(record)) {
|
|
3486
3841
|
return;
|
|
@@ -3501,7 +3856,7 @@ function maybeSendToOTLP(otlp, record) {
|
|
|
3501
3856
|
sender.send(record, { source: "server", warnIfUnavailable: true });
|
|
3502
3857
|
}
|
|
3503
3858
|
}
|
|
3504
|
-
function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry, otlp, bindings = {}, source = "root") {
|
|
3859
|
+
function createLoggerInstance(rootRawLogger, sink, betterstack, databuddy, posthog, sentry, otlp, bindings = {}, source = "root") {
|
|
3505
3860
|
const rawLogger = Object.keys(bindings).length > 0 ? rootRawLogger.child(bindings) : rootRawLogger;
|
|
3506
3861
|
const writeRecord = (level, message, args, writeSource = source) => {
|
|
3507
3862
|
if (writeSource === "root" && shouldDropRootLogWrite()) {
|
|
@@ -3527,6 +3882,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3527
3882
|
);
|
|
3528
3883
|
sink.write(record);
|
|
3529
3884
|
maybeSendToBetterStack(betterstack, record);
|
|
3885
|
+
maybeSendToDatabuddy(databuddy, record);
|
|
3530
3886
|
maybeSendToPostHog(posthog, record);
|
|
3531
3887
|
maybeSendToSentry(sentry, record);
|
|
3532
3888
|
maybeSendToOTLP(otlp, record);
|
|
@@ -3550,6 +3906,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3550
3906
|
sink.write(record);
|
|
3551
3907
|
}
|
|
3552
3908
|
maybeSendToBetterStack(betterstack, record);
|
|
3909
|
+
maybeSendToDatabuddy(databuddy, record);
|
|
3553
3910
|
maybeSendToPostHog(posthog, record);
|
|
3554
3911
|
maybeSendToSentry(sentry, record);
|
|
3555
3912
|
maybeSendToOTLP(otlp, record);
|
|
@@ -3583,8 +3940,26 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3583
3940
|
}
|
|
3584
3941
|
writeRecord("table", message, data === void 0 ? [] : [data]);
|
|
3585
3942
|
},
|
|
3586
|
-
flush: () =>
|
|
3587
|
-
|
|
3943
|
+
flush: async () => {
|
|
3944
|
+
await sink.flush();
|
|
3945
|
+
await Promise.allSettled([
|
|
3946
|
+
betterstack.flush(),
|
|
3947
|
+
databuddy.flush(),
|
|
3948
|
+
posthog.flush(),
|
|
3949
|
+
sentry.flush(),
|
|
3950
|
+
otlp.flush()
|
|
3951
|
+
]);
|
|
3952
|
+
},
|
|
3953
|
+
shutdown: async () => {
|
|
3954
|
+
await sink.shutdown();
|
|
3955
|
+
await Promise.allSettled([
|
|
3956
|
+
betterstack.flush(),
|
|
3957
|
+
databuddy.flush(),
|
|
3958
|
+
posthog.flush(),
|
|
3959
|
+
sentry.flush(),
|
|
3960
|
+
otlp.flush()
|
|
3961
|
+
]);
|
|
3962
|
+
},
|
|
3588
3963
|
createStructuredLog: (groupId, initial) => {
|
|
3589
3964
|
return createStructuredLogForLogger(logger2, groupId, {
|
|
3590
3965
|
initialFields: initial
|
|
@@ -3596,6 +3971,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3596
3971
|
rootRawLogger,
|
|
3597
3972
|
sink,
|
|
3598
3973
|
betterstack,
|
|
3974
|
+
databuddy,
|
|
3599
3975
|
posthog,
|
|
3600
3976
|
sentry,
|
|
3601
3977
|
otlp,
|
|
@@ -3606,6 +3982,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3606
3982
|
[LOGGER_FACTORY]: {
|
|
3607
3983
|
bindings,
|
|
3608
3984
|
betterstack,
|
|
3985
|
+
databuddy,
|
|
3609
3986
|
posthog,
|
|
3610
3987
|
sentry,
|
|
3611
3988
|
otlp,
|
|
@@ -3615,6 +3992,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3615
3992
|
rootRawLogger,
|
|
3616
3993
|
sink,
|
|
3617
3994
|
betterstack,
|
|
3995
|
+
databuddy,
|
|
3618
3996
|
posthog,
|
|
3619
3997
|
sentry,
|
|
3620
3998
|
otlp,
|
|
@@ -3638,6 +4016,7 @@ function createBaseLogger(config) {
|
|
|
3638
4016
|
const rawLogger = createPinoLogger(resolvedConfig);
|
|
3639
4017
|
const sink = createPrimarySink(resolvedConfig);
|
|
3640
4018
|
const betterstack = createBetterStackSender(resolvedConfig);
|
|
4019
|
+
const databuddy = createDatabuddySender(resolvedConfig);
|
|
3641
4020
|
const posthog = createPostHogSender(resolvedConfig);
|
|
3642
4021
|
const sentry = createSentrySender(resolvedConfig);
|
|
3643
4022
|
const otlp = createOTLPRegistry(resolvedConfig);
|
|
@@ -3645,6 +4024,7 @@ function createBaseLogger(config) {
|
|
|
3645
4024
|
rawLogger,
|
|
3646
4025
|
sink,
|
|
3647
4026
|
betterstack,
|
|
4027
|
+
databuddy,
|
|
3648
4028
|
posthog,
|
|
3649
4029
|
sentry,
|
|
3650
4030
|
otlp
|
|
@@ -3727,6 +4107,7 @@ function resolveServerLogger(config = {}, loggerOverride) {
|
|
|
3727
4107
|
return {
|
|
3728
4108
|
logger: logger2,
|
|
3729
4109
|
betterstack: getBetterStackSender(logger2),
|
|
4110
|
+
databuddy: getDatabuddySender(logger2),
|
|
3730
4111
|
posthog: getPostHogSender(logger2),
|
|
3731
4112
|
sentry: getSentrySender(logger2),
|
|
3732
4113
|
otlp: getOtlpRegistry(logger2),
|
|
@@ -3846,6 +4227,22 @@ function emitHttpErrorLog(logger2, level, request, path3, statusCode, responseTi
|
|
|
3846
4227
|
}
|
|
3847
4228
|
});
|
|
3848
4229
|
}
|
|
4230
|
+
const databuddy = tryGetDatabuddySender(logger2);
|
|
4231
|
+
if (databuddy?.shouldAutoCaptureExceptions()) {
|
|
4232
|
+
databuddy.captureException(captureContext.error ?? error ?? message, {
|
|
4233
|
+
source: "server",
|
|
4234
|
+
warnIfUnavailable: true,
|
|
4235
|
+
properties: {
|
|
4236
|
+
method: request.method,
|
|
4237
|
+
path: path3,
|
|
4238
|
+
status_code: statusCode,
|
|
4239
|
+
...request.url ? { current_url: request.url } : {},
|
|
4240
|
+
...getHeaderValue(request.headers, "user-agent") ? { user_agent: getHeaderValue(request.headers, "user-agent") } : {},
|
|
4241
|
+
...errorLogData.ip ? { ip: errorLogData.ip } : {},
|
|
4242
|
+
payload: errorLogData
|
|
4243
|
+
}
|
|
4244
|
+
});
|
|
4245
|
+
}
|
|
3849
4246
|
return errorLogData;
|
|
3850
4247
|
}
|
|
3851
4248
|
async function parseClientLogPayload(request, body) {
|
|
@@ -3937,6 +4334,34 @@ async function handleClientLogIngestion(options) {
|
|
|
3937
4334
|
});
|
|
3938
4335
|
}
|
|
3939
4336
|
}
|
|
4337
|
+
} else if (payload.connector === "databuddy") {
|
|
4338
|
+
headers["x-blyp-databuddy-status"] = config.databuddy.ready ? "enabled" : "missing";
|
|
4339
|
+
if (config.databuddy.ready) {
|
|
4340
|
+
const forwardedRecord = {
|
|
4341
|
+
timestamp: structuredPayload.receivedAt,
|
|
4342
|
+
level: payload.level,
|
|
4343
|
+
message: `[client] ${payload.message}`,
|
|
4344
|
+
data: structuredPayload
|
|
4345
|
+
};
|
|
4346
|
+
config.databuddy.send(forwardedRecord, {
|
|
4347
|
+
source: "client"
|
|
4348
|
+
});
|
|
4349
|
+
if ((payload.level === "error" || payload.level === "critical") && config.databuddy.shouldAutoCaptureExceptions()) {
|
|
4350
|
+
const clientErrorCandidate = payload.data && typeof payload.data === "object" && !Array.isArray(payload.data) && typeof payload.data.message === "string" ? payload.data : payload.message;
|
|
4351
|
+
config.databuddy.captureException(clientErrorCandidate, {
|
|
4352
|
+
source: "client",
|
|
4353
|
+
warnIfUnavailable: true,
|
|
4354
|
+
sessionId: payload.session.sessionId,
|
|
4355
|
+
properties: {
|
|
4356
|
+
page_url: payload.page.url,
|
|
4357
|
+
page_path: payload.page.pathname,
|
|
4358
|
+
client_runtime: payload.device?.runtime,
|
|
4359
|
+
metadata: payload.metadata,
|
|
4360
|
+
payload: structuredPayload
|
|
4361
|
+
}
|
|
4362
|
+
});
|
|
4363
|
+
}
|
|
4364
|
+
}
|
|
3940
4365
|
} else if (payload.connector === "posthog") {
|
|
3941
4366
|
headers["x-blyp-posthog-status"] = config.posthog.ready ? "enabled" : "missing";
|
|
3942
4367
|
if (config.posthog.ready) {
|