@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/nextjs.js
CHANGED
|
@@ -15,6 +15,7 @@ var async_hooks = require('async_hooks');
|
|
|
15
15
|
var crypto = require('crypto');
|
|
16
16
|
var Sentry = require('@sentry/node');
|
|
17
17
|
var node = require('@logtail/node');
|
|
18
|
+
var node$1 = require('@databuddy/sdk/node');
|
|
18
19
|
|
|
19
20
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
20
21
|
|
|
@@ -398,6 +399,7 @@ var CLIENT_LOG_LEVELS = [
|
|
|
398
399
|
];
|
|
399
400
|
var clientConnectorRequestSchema = zod.z.union([
|
|
400
401
|
zod.z.literal("betterstack"),
|
|
402
|
+
zod.z.literal("databuddy"),
|
|
401
403
|
zod.z.literal("posthog"),
|
|
402
404
|
zod.z.literal("sentry"),
|
|
403
405
|
zod.z.undefined(),
|
|
@@ -438,16 +440,16 @@ function normalizeEndpointPath(path3) {
|
|
|
438
440
|
}
|
|
439
441
|
|
|
440
442
|
// src/shared/once.ts
|
|
441
|
-
function createConsoleOnceLogger(method,
|
|
443
|
+
function createConsoleOnceLogger(method, warnedKeys7 = /* @__PURE__ */ new Set()) {
|
|
442
444
|
return (key, message, error) => {
|
|
443
|
-
if (
|
|
445
|
+
if (warnedKeys7.has(key) || typeof console === "undefined") {
|
|
444
446
|
return;
|
|
445
447
|
}
|
|
446
448
|
const writer = console[method];
|
|
447
449
|
if (typeof writer !== "function") {
|
|
448
450
|
return;
|
|
449
451
|
}
|
|
450
|
-
|
|
452
|
+
warnedKeys7.add(key);
|
|
451
453
|
if (error === void 0) {
|
|
452
454
|
writer.call(console, message);
|
|
453
455
|
return;
|
|
@@ -455,11 +457,11 @@ function createConsoleOnceLogger(method, warnedKeys6 = /* @__PURE__ */ new Set()
|
|
|
455
457
|
writer.call(console, message, error);
|
|
456
458
|
};
|
|
457
459
|
}
|
|
458
|
-
function createWarnOnceLogger(
|
|
459
|
-
return createConsoleOnceLogger("warn",
|
|
460
|
+
function createWarnOnceLogger(warnedKeys7) {
|
|
461
|
+
return createConsoleOnceLogger("warn", warnedKeys7);
|
|
460
462
|
}
|
|
461
|
-
function createErrorOnceLogger(
|
|
462
|
-
return createConsoleOnceLogger("error",
|
|
463
|
+
function createErrorOnceLogger(warnedKeys7) {
|
|
464
|
+
return createConsoleOnceLogger("error", warnedKeys7);
|
|
463
465
|
}
|
|
464
466
|
|
|
465
467
|
// src/core/config.ts
|
|
@@ -825,6 +827,28 @@ function mergePostHogConnectorConfig(base, override) {
|
|
|
825
827
|
}
|
|
826
828
|
};
|
|
827
829
|
}
|
|
830
|
+
function mergeDatabuddyConnectorConfig(base, override) {
|
|
831
|
+
const enabled = override?.enabled ?? base?.enabled ?? false;
|
|
832
|
+
const apiKey = override?.apiKey ?? base?.apiKey;
|
|
833
|
+
const websiteId = override?.websiteId ?? base?.websiteId;
|
|
834
|
+
const ready = enabled && hasNonEmptyString(apiKey) && hasNonEmptyString(websiteId);
|
|
835
|
+
return {
|
|
836
|
+
enabled,
|
|
837
|
+
mode: override?.mode ?? base?.mode ?? "auto",
|
|
838
|
+
apiKey,
|
|
839
|
+
websiteId,
|
|
840
|
+
namespace: override?.namespace ?? base?.namespace,
|
|
841
|
+
source: override?.source ?? base?.source,
|
|
842
|
+
apiUrl: override?.apiUrl ?? base?.apiUrl,
|
|
843
|
+
debug: override?.debug ?? base?.debug ?? false,
|
|
844
|
+
enableBatching: override?.enableBatching ?? base?.enableBatching ?? true,
|
|
845
|
+
batchSize: override?.batchSize ?? base?.batchSize,
|
|
846
|
+
batchTimeout: override?.batchTimeout ?? base?.batchTimeout,
|
|
847
|
+
maxQueueSize: override?.maxQueueSize ?? base?.maxQueueSize,
|
|
848
|
+
ready,
|
|
849
|
+
status: ready ? "enabled" : "missing"
|
|
850
|
+
};
|
|
851
|
+
}
|
|
828
852
|
function mergeBetterStackConnectorConfig(base, override) {
|
|
829
853
|
const sourceToken = override?.sourceToken ?? base?.sourceToken;
|
|
830
854
|
const ingestingHost = override?.ingestingHost ?? base?.ingestingHost;
|
|
@@ -915,6 +939,7 @@ function mergeOTLPConnectorsConfig(base, override) {
|
|
|
915
939
|
function mergeConnectorsConfig(base, override) {
|
|
916
940
|
return {
|
|
917
941
|
betterstack: mergeBetterStackConnectorConfig(base?.betterstack, override?.betterstack),
|
|
942
|
+
databuddy: mergeDatabuddyConnectorConfig(base?.databuddy, override?.databuddy),
|
|
918
943
|
posthog: mergePostHogConnectorConfig(base?.posthog, override?.posthog),
|
|
919
944
|
sentry: mergeSentryConnectorConfig(base?.sentry, override?.sentry),
|
|
920
945
|
otlp: mergeOTLPConnectorsConfig(base?.otlp, override?.otlp)
|
|
@@ -2551,12 +2576,320 @@ function createBetterStackSender(config) {
|
|
|
2551
2576
|
};
|
|
2552
2577
|
}
|
|
2553
2578
|
var warnedKeys4 = /* @__PURE__ */ new Set();
|
|
2579
|
+
var senderCache = /* @__PURE__ */ new Map();
|
|
2554
2580
|
var testHooks3 = {};
|
|
2555
2581
|
var warnOnce5 = createErrorOnceLogger(warnedKeys4);
|
|
2556
|
-
function
|
|
2557
|
-
|
|
2582
|
+
function registerShutdownHooks3(key, shutdown) {
|
|
2583
|
+
const handlers = ["beforeExit", "SIGINT", "SIGTERM"];
|
|
2584
|
+
for (const event of handlers) {
|
|
2585
|
+
process.once(event, () => {
|
|
2586
|
+
void shutdown().catch((error) => {
|
|
2587
|
+
warnOnce5(
|
|
2588
|
+
`${key}:shutdown`,
|
|
2589
|
+
"[Blyp] Failed to flush Databuddy telemetry during shutdown.",
|
|
2590
|
+
error
|
|
2591
|
+
);
|
|
2592
|
+
});
|
|
2593
|
+
});
|
|
2594
|
+
}
|
|
2558
2595
|
}
|
|
2559
2596
|
function resolveConnectorConfig3(config) {
|
|
2597
|
+
const connector = isBlypConfig(config) ? config.connectors?.databuddy : config;
|
|
2598
|
+
const enabled = connector?.enabled ?? false;
|
|
2599
|
+
const apiKey = connector?.apiKey;
|
|
2600
|
+
const websiteId = connector?.websiteId;
|
|
2601
|
+
const ready = enabled && hasNonEmptyString(apiKey) && hasNonEmptyString(websiteId);
|
|
2602
|
+
return {
|
|
2603
|
+
enabled,
|
|
2604
|
+
mode: connector?.mode ?? "auto",
|
|
2605
|
+
apiKey,
|
|
2606
|
+
websiteId,
|
|
2607
|
+
namespace: connector?.namespace,
|
|
2608
|
+
source: connector?.source,
|
|
2609
|
+
apiUrl: connector?.apiUrl,
|
|
2610
|
+
debug: connector?.debug ?? false,
|
|
2611
|
+
enableBatching: connector?.enableBatching ?? true,
|
|
2612
|
+
batchSize: connector?.batchSize,
|
|
2613
|
+
batchTimeout: connector?.batchTimeout,
|
|
2614
|
+
maxQueueSize: connector?.maxQueueSize,
|
|
2615
|
+
ready,
|
|
2616
|
+
status: ready ? "enabled" : "missing"
|
|
2617
|
+
};
|
|
2618
|
+
}
|
|
2619
|
+
function createDefaultClient2(connector) {
|
|
2620
|
+
return new node$1.Databuddy({
|
|
2621
|
+
apiKey: connector.apiKey ?? "",
|
|
2622
|
+
...connector.websiteId ? { websiteId: connector.websiteId } : {},
|
|
2623
|
+
...connector.namespace ? { namespace: connector.namespace } : {},
|
|
2624
|
+
...connector.source ? { source: connector.source } : {},
|
|
2625
|
+
...connector.apiUrl ? { apiUrl: connector.apiUrl } : {},
|
|
2626
|
+
debug: connector.debug,
|
|
2627
|
+
enableBatching: connector.enableBatching,
|
|
2628
|
+
...connector.batchSize !== void 0 ? { batchSize: connector.batchSize } : {},
|
|
2629
|
+
...connector.batchTimeout !== void 0 ? { batchTimeout: connector.batchTimeout } : {},
|
|
2630
|
+
...connector.maxQueueSize !== void 0 ? { maxQueueSize: connector.maxQueueSize } : {}
|
|
2631
|
+
});
|
|
2632
|
+
}
|
|
2633
|
+
function getDatabuddySenderKey(connector) {
|
|
2634
|
+
return JSON.stringify({
|
|
2635
|
+
enabled: connector.enabled,
|
|
2636
|
+
mode: connector.mode,
|
|
2637
|
+
apiKey: connector.apiKey ?? null,
|
|
2638
|
+
websiteId: connector.websiteId ?? null,
|
|
2639
|
+
namespace: connector.namespace ?? null,
|
|
2640
|
+
source: connector.source ?? null,
|
|
2641
|
+
apiUrl: connector.apiUrl ?? null,
|
|
2642
|
+
debug: connector.debug,
|
|
2643
|
+
enableBatching: connector.enableBatching,
|
|
2644
|
+
batchSize: connector.batchSize ?? null,
|
|
2645
|
+
batchTimeout: connector.batchTimeout ?? null,
|
|
2646
|
+
maxQueueSize: connector.maxQueueSize ?? null
|
|
2647
|
+
});
|
|
2648
|
+
}
|
|
2649
|
+
function getSessionId(record) {
|
|
2650
|
+
const direct = getField(record, "sessionId");
|
|
2651
|
+
if (hasNonEmptyString(direct)) {
|
|
2652
|
+
return direct;
|
|
2653
|
+
}
|
|
2654
|
+
return getClientSessionField(record, "sessionId");
|
|
2655
|
+
}
|
|
2656
|
+
function getAnonymousId(record) {
|
|
2657
|
+
const direct = getField(record, "anonymousId");
|
|
2658
|
+
if (hasNonEmptyString(direct)) {
|
|
2659
|
+
return direct;
|
|
2660
|
+
}
|
|
2661
|
+
const payload = getPrimaryPayload(record);
|
|
2662
|
+
if (isPlainObject(payload.metadata) && hasNonEmptyString(payload.metadata.databuddyAnonymousId)) {
|
|
2663
|
+
return payload.metadata.databuddyAnonymousId;
|
|
2664
|
+
}
|
|
2665
|
+
return void 0;
|
|
2666
|
+
}
|
|
2667
|
+
function getDatabuddyEventName(record) {
|
|
2668
|
+
const recordType = getRecordType(record);
|
|
2669
|
+
if (hasNonEmptyString(recordType)) {
|
|
2670
|
+
return recordType;
|
|
2671
|
+
}
|
|
2672
|
+
return "log";
|
|
2673
|
+
}
|
|
2674
|
+
function buildRecordProperties(record, source) {
|
|
2675
|
+
const properties = {
|
|
2676
|
+
blyp_level: record.level,
|
|
2677
|
+
blyp_source: source,
|
|
2678
|
+
blyp_payload: serializeLogRecord(record),
|
|
2679
|
+
message: typeof record.message === "string" ? record.message : String(record.message)
|
|
2680
|
+
};
|
|
2681
|
+
const caller = typeof record.caller === "string" ? record.caller : void 0;
|
|
2682
|
+
const groupId = getField(record, "groupId");
|
|
2683
|
+
const method = getField(record, "method");
|
|
2684
|
+
const path3 = getField(record, "path");
|
|
2685
|
+
const status = getField(record, "status");
|
|
2686
|
+
const duration = getField(record, "duration");
|
|
2687
|
+
const pagePath = getClientPageField(record, "pathname");
|
|
2688
|
+
const pageUrl = getClientPageField(record, "url");
|
|
2689
|
+
const sessionId = getClientSessionField(record, "sessionId");
|
|
2690
|
+
const pageId = getClientSessionField(record, "pageId");
|
|
2691
|
+
const ifTruthy = [
|
|
2692
|
+
["blyp_type", getRecordType(record)],
|
|
2693
|
+
["caller", caller],
|
|
2694
|
+
["group_id", groupId],
|
|
2695
|
+
["method", method],
|
|
2696
|
+
["path", path3],
|
|
2697
|
+
["page_path", pagePath],
|
|
2698
|
+
["page_url", pageUrl],
|
|
2699
|
+
["session_id", sessionId],
|
|
2700
|
+
["page_id", pageId]
|
|
2701
|
+
];
|
|
2702
|
+
const ifDefined = [
|
|
2703
|
+
["status_code", status],
|
|
2704
|
+
["duration_ms", duration]
|
|
2705
|
+
];
|
|
2706
|
+
for (const [key, value] of ifTruthy) {
|
|
2707
|
+
if (value) {
|
|
2708
|
+
properties[key] = value;
|
|
2709
|
+
}
|
|
2710
|
+
}
|
|
2711
|
+
for (const [key, value] of ifDefined) {
|
|
2712
|
+
if (value !== void 0) {
|
|
2713
|
+
properties[key] = value;
|
|
2714
|
+
}
|
|
2715
|
+
}
|
|
2716
|
+
return properties;
|
|
2717
|
+
}
|
|
2718
|
+
function createTrackEvent(record, source) {
|
|
2719
|
+
return {
|
|
2720
|
+
name: getDatabuddyEventName(record),
|
|
2721
|
+
anonymousId: getAnonymousId(record),
|
|
2722
|
+
sessionId: getSessionId(record),
|
|
2723
|
+
properties: buildRecordProperties(record, source)
|
|
2724
|
+
};
|
|
2725
|
+
}
|
|
2726
|
+
function normalizeExceptionProperties2(value) {
|
|
2727
|
+
if (!isPlainObject(value)) {
|
|
2728
|
+
return {};
|
|
2729
|
+
}
|
|
2730
|
+
return normalizeLogValue(value);
|
|
2731
|
+
}
|
|
2732
|
+
function normalizeExceptionInput3(value, fallbackMessage) {
|
|
2733
|
+
if (value instanceof Error) {
|
|
2734
|
+
return {
|
|
2735
|
+
message: value.message || fallbackMessage,
|
|
2736
|
+
properties: {
|
|
2737
|
+
error_type: value.name,
|
|
2738
|
+
...value.stack ? { stack: value.stack } : {},
|
|
2739
|
+
...normalizeExceptionProperties2(value)
|
|
2740
|
+
}
|
|
2741
|
+
};
|
|
2742
|
+
}
|
|
2743
|
+
if (isPlainObject(value)) {
|
|
2744
|
+
const message = hasNonEmptyString(value.message) ? value.message : hasNonEmptyString(value.error) ? value.error : fallbackMessage;
|
|
2745
|
+
return {
|
|
2746
|
+
message,
|
|
2747
|
+
properties: normalizeExceptionProperties2(value)
|
|
2748
|
+
};
|
|
2749
|
+
}
|
|
2750
|
+
if (typeof value === "string") {
|
|
2751
|
+
return {
|
|
2752
|
+
message: value,
|
|
2753
|
+
properties: {
|
|
2754
|
+
message: value
|
|
2755
|
+
}
|
|
2756
|
+
};
|
|
2757
|
+
}
|
|
2758
|
+
return {
|
|
2759
|
+
message: fallbackMessage,
|
|
2760
|
+
properties: {
|
|
2761
|
+
value: normalizeLogValue(value)
|
|
2762
|
+
}
|
|
2763
|
+
};
|
|
2764
|
+
}
|
|
2765
|
+
function createDatabuddySender(config) {
|
|
2766
|
+
const connector = resolveConnectorConfig3(config);
|
|
2767
|
+
const senderKey = getDatabuddySenderKey(connector);
|
|
2768
|
+
const cached = senderCache.get(senderKey);
|
|
2769
|
+
if (cached) {
|
|
2770
|
+
return cached;
|
|
2771
|
+
}
|
|
2772
|
+
const key = `${connector.apiUrl ?? "default"}:${connector.mode}:${connector.apiKey ?? "missing"}`;
|
|
2773
|
+
const client = connector.ready ? testHooks3.createClient?.(connector) ?? createDefaultClient2(connector) : void 0;
|
|
2774
|
+
if (client) {
|
|
2775
|
+
registerShutdownHooks3(key, async () => {
|
|
2776
|
+
await client.flush();
|
|
2777
|
+
});
|
|
2778
|
+
}
|
|
2779
|
+
const emitUnavailableWarning = () => {
|
|
2780
|
+
warnOnce5(
|
|
2781
|
+
`databuddy-unavailable:${key}`,
|
|
2782
|
+
"[Blyp] Databuddy connector is not configured. Databuddy requires both apiKey and websiteId. Skipping Databuddy delivery."
|
|
2783
|
+
);
|
|
2784
|
+
};
|
|
2785
|
+
const emitExceptionUnavailableWarning = () => {
|
|
2786
|
+
warnOnce5(
|
|
2787
|
+
`databuddy-exception-unavailable:${key}`,
|
|
2788
|
+
"[Blyp] Databuddy error tracking is not configured. Databuddy requires both apiKey and websiteId. Skipping Databuddy exception capture."
|
|
2789
|
+
);
|
|
2790
|
+
};
|
|
2791
|
+
const sender = {
|
|
2792
|
+
enabled: connector.enabled,
|
|
2793
|
+
ready: connector.ready,
|
|
2794
|
+
mode: connector.mode,
|
|
2795
|
+
status: connector.status,
|
|
2796
|
+
shouldAutoForwardServerLogs() {
|
|
2797
|
+
return connector.ready && connector.mode === "auto";
|
|
2798
|
+
},
|
|
2799
|
+
shouldAutoCaptureExceptions() {
|
|
2800
|
+
return connector.ready && connector.mode === "auto";
|
|
2801
|
+
},
|
|
2802
|
+
send(record, options = {}) {
|
|
2803
|
+
if (!connector.ready || !client) {
|
|
2804
|
+
if (options.warnIfUnavailable) {
|
|
2805
|
+
emitUnavailableWarning();
|
|
2806
|
+
}
|
|
2807
|
+
return;
|
|
2808
|
+
}
|
|
2809
|
+
try {
|
|
2810
|
+
const result = client.track(createTrackEvent(record, options.source ?? "server"));
|
|
2811
|
+
if (result && typeof result.catch === "function") {
|
|
2812
|
+
void result.catch((error) => {
|
|
2813
|
+
warnOnce5(
|
|
2814
|
+
`databuddy-send:${key}`,
|
|
2815
|
+
"[Blyp] Failed to deliver log to Databuddy.",
|
|
2816
|
+
error
|
|
2817
|
+
);
|
|
2818
|
+
});
|
|
2819
|
+
}
|
|
2820
|
+
} catch (error) {
|
|
2821
|
+
warnOnce5(
|
|
2822
|
+
`databuddy-send:${key}`,
|
|
2823
|
+
"[Blyp] Failed to deliver log to Databuddy.",
|
|
2824
|
+
error
|
|
2825
|
+
);
|
|
2826
|
+
}
|
|
2827
|
+
},
|
|
2828
|
+
captureException(error, options = {}) {
|
|
2829
|
+
if (!connector.ready || !client) {
|
|
2830
|
+
if (options.warnIfUnavailable) {
|
|
2831
|
+
emitExceptionUnavailableWarning();
|
|
2832
|
+
}
|
|
2833
|
+
return;
|
|
2834
|
+
}
|
|
2835
|
+
const normalized = normalizeExceptionInput3(
|
|
2836
|
+
error,
|
|
2837
|
+
options.source === "client" ? "Client error" : "Server error"
|
|
2838
|
+
);
|
|
2839
|
+
try {
|
|
2840
|
+
const result = client.track({
|
|
2841
|
+
name: "error",
|
|
2842
|
+
anonymousId: options.anonymousId,
|
|
2843
|
+
sessionId: options.sessionId,
|
|
2844
|
+
properties: {
|
|
2845
|
+
message: normalized.message,
|
|
2846
|
+
blyp_source: options.source ?? "server",
|
|
2847
|
+
blyp_level: "error",
|
|
2848
|
+
...normalized.properties,
|
|
2849
|
+
...options.properties ?? {}
|
|
2850
|
+
}
|
|
2851
|
+
});
|
|
2852
|
+
if (result && typeof result.catch === "function") {
|
|
2853
|
+
void result.catch((captureError) => {
|
|
2854
|
+
warnOnce5(
|
|
2855
|
+
`databuddy-capture:${key}`,
|
|
2856
|
+
"[Blyp] Failed to capture exception in Databuddy.",
|
|
2857
|
+
captureError
|
|
2858
|
+
);
|
|
2859
|
+
});
|
|
2860
|
+
}
|
|
2861
|
+
} catch (captureError) {
|
|
2862
|
+
warnOnce5(
|
|
2863
|
+
`databuddy-capture:${key}`,
|
|
2864
|
+
"[Blyp] Failed to capture exception in Databuddy.",
|
|
2865
|
+
captureError
|
|
2866
|
+
);
|
|
2867
|
+
}
|
|
2868
|
+
},
|
|
2869
|
+
async flush() {
|
|
2870
|
+
try {
|
|
2871
|
+
if (client) {
|
|
2872
|
+
await client.flush();
|
|
2873
|
+
}
|
|
2874
|
+
} catch (error) {
|
|
2875
|
+
warnOnce5(
|
|
2876
|
+
`databuddy-flush:${key}`,
|
|
2877
|
+
"[Blyp] Failed to flush Databuddy telemetry.",
|
|
2878
|
+
error
|
|
2879
|
+
);
|
|
2880
|
+
}
|
|
2881
|
+
}
|
|
2882
|
+
};
|
|
2883
|
+
senderCache.set(senderKey, sender);
|
|
2884
|
+
return sender;
|
|
2885
|
+
}
|
|
2886
|
+
var warnedKeys5 = /* @__PURE__ */ new Set();
|
|
2887
|
+
var testHooks4 = {};
|
|
2888
|
+
var warnOnce6 = createErrorOnceLogger(warnedKeys5);
|
|
2889
|
+
function getSentryModule2() {
|
|
2890
|
+
return testHooks4.module ?? Sentry__namespace;
|
|
2891
|
+
}
|
|
2892
|
+
function resolveConnectorConfig4(config) {
|
|
2560
2893
|
const connector = isBlypConfig(config) ? config.connectors?.sentry : config;
|
|
2561
2894
|
const enabled = connector?.enabled ?? false;
|
|
2562
2895
|
const dsn = connector?.dsn;
|
|
@@ -2701,7 +3034,7 @@ function hasConfigMismatch(connector, client) {
|
|
|
2701
3034
|
return hasNonEmptyString(connector.dsn) && connector.dsn !== options.dsn || hasNonEmptyString(connector.environment) && connector.environment !== options.environment || hasNonEmptyString(connector.release) && connector.release !== options.release;
|
|
2702
3035
|
}
|
|
2703
3036
|
function createSentrySender(config) {
|
|
2704
|
-
const connector =
|
|
3037
|
+
const connector = resolveConnectorConfig4(config);
|
|
2705
3038
|
const key = `${connector.mode}:${connector.dsn ?? "missing"}`;
|
|
2706
3039
|
const module = getSentryModule2();
|
|
2707
3040
|
let client = connector.enabled ? module.getClient() : void 0;
|
|
@@ -2715,7 +3048,7 @@ function createSentrySender(config) {
|
|
|
2715
3048
|
});
|
|
2716
3049
|
client = module.getClient();
|
|
2717
3050
|
} catch (error) {
|
|
2718
|
-
|
|
3051
|
+
warnOnce6(
|
|
2719
3052
|
`sentry-init:${key}`,
|
|
2720
3053
|
"[Blyp] Failed to initialize Sentry. Skipping Sentry delivery.",
|
|
2721
3054
|
error
|
|
@@ -2723,14 +3056,14 @@ function createSentrySender(config) {
|
|
|
2723
3056
|
}
|
|
2724
3057
|
}
|
|
2725
3058
|
if (client && hasConfigMismatch(connector, client)) {
|
|
2726
|
-
|
|
3059
|
+
warnOnce6(
|
|
2727
3060
|
`sentry-mismatch:${key}`,
|
|
2728
3061
|
"[Blyp] Sentry is already initialized with different options. Reusing the existing Sentry client."
|
|
2729
3062
|
);
|
|
2730
3063
|
}
|
|
2731
3064
|
const ready = connector.enabled && client !== void 0;
|
|
2732
3065
|
const emitUnavailableWarning = () => {
|
|
2733
|
-
|
|
3066
|
+
warnOnce6(
|
|
2734
3067
|
`sentry-unavailable:${key}`,
|
|
2735
3068
|
"[Blyp] Sentry connector is not configured. Skipping Sentry delivery."
|
|
2736
3069
|
);
|
|
@@ -2756,7 +3089,7 @@ function createSentrySender(config) {
|
|
|
2756
3089
|
try {
|
|
2757
3090
|
logMethod(record.message, attributes);
|
|
2758
3091
|
} catch (error) {
|
|
2759
|
-
|
|
3092
|
+
warnOnce6(
|
|
2760
3093
|
`sentry-log:${key}`,
|
|
2761
3094
|
"[Blyp] Failed to deliver log to Sentry.",
|
|
2762
3095
|
error
|
|
@@ -2774,7 +3107,7 @@ function createSentrySender(config) {
|
|
|
2774
3107
|
module.captureException(exception);
|
|
2775
3108
|
});
|
|
2776
3109
|
} catch (error) {
|
|
2777
|
-
|
|
3110
|
+
warnOnce6(
|
|
2778
3111
|
`sentry-exception:${key}`,
|
|
2779
3112
|
"[Blyp] Failed to capture exception in Sentry.",
|
|
2780
3113
|
error
|
|
@@ -2785,7 +3118,7 @@ function createSentrySender(config) {
|
|
|
2785
3118
|
try {
|
|
2786
3119
|
await module.flush(2e3);
|
|
2787
3120
|
} catch (error) {
|
|
2788
|
-
|
|
3121
|
+
warnOnce6(
|
|
2789
3122
|
`sentry-flush:${key}`,
|
|
2790
3123
|
"[Blyp] Failed to flush Sentry logs.",
|
|
2791
3124
|
error
|
|
@@ -2794,9 +3127,9 @@ function createSentrySender(config) {
|
|
|
2794
3127
|
}
|
|
2795
3128
|
};
|
|
2796
3129
|
}
|
|
2797
|
-
var
|
|
2798
|
-
var
|
|
2799
|
-
var
|
|
3130
|
+
var warnedKeys6 = /* @__PURE__ */ new Set();
|
|
3131
|
+
var testHooks5 = {};
|
|
3132
|
+
var warnOnce7 = createErrorOnceLogger(warnedKeys6);
|
|
2800
3133
|
function normalizeOTLPRecord(record, connector, source = "server") {
|
|
2801
3134
|
const severity = resolveSeverity2(record.level);
|
|
2802
3135
|
const body = typeof record.message === "string" ? record.message : String(record.message);
|
|
@@ -2861,14 +3194,14 @@ function resolveSeverity2(level) {
|
|
|
2861
3194
|
return { text: "info", number: apiLogs.SeverityNumber.INFO };
|
|
2862
3195
|
}
|
|
2863
3196
|
}
|
|
2864
|
-
function
|
|
3197
|
+
function registerShutdownHooks4(key, shutdown) {
|
|
2865
3198
|
const handlers = ["beforeExit", "SIGINT", "SIGTERM"];
|
|
2866
3199
|
for (const event of handlers) {
|
|
2867
3200
|
process.once(event, async () => {
|
|
2868
3201
|
try {
|
|
2869
3202
|
await shutdown();
|
|
2870
3203
|
} catch (error) {
|
|
2871
|
-
|
|
3204
|
+
warnOnce7(
|
|
2872
3205
|
`${key}:shutdown`,
|
|
2873
3206
|
"[Blyp] Failed to flush OTLP logs during shutdown.",
|
|
2874
3207
|
error
|
|
@@ -2945,7 +3278,7 @@ function createUnavailableSender(name, connector) {
|
|
|
2945
3278
|
const senderName = name || connector?.name || "otlp";
|
|
2946
3279
|
const key = `${senderName}:${connector?.serviceName ?? "blyp-app"}:${connector?.endpoint ?? "missing"}`;
|
|
2947
3280
|
const emitUnavailableWarning = () => {
|
|
2948
|
-
|
|
3281
|
+
warnOnce7(
|
|
2949
3282
|
`otlp-unavailable:${key}`,
|
|
2950
3283
|
`[Blyp] OTLP target "${senderName}" is not configured or not ready. Skipping OTLP delivery.`
|
|
2951
3284
|
);
|
|
@@ -2976,7 +3309,7 @@ function createSender(connector) {
|
|
|
2976
3309
|
...connector,
|
|
2977
3310
|
headers: resolveTransportHeaders(connector)
|
|
2978
3311
|
};
|
|
2979
|
-
const transport =
|
|
3312
|
+
const transport = testHooks5.createTransport?.(transportConnector) ?? createDefaultTransport2(transportConnector);
|
|
2980
3313
|
return {
|
|
2981
3314
|
name: connector.name,
|
|
2982
3315
|
enabled: connector.enabled,
|
|
@@ -2992,7 +3325,7 @@ function createSender(connector) {
|
|
|
2992
3325
|
const result = transport.emit(normalized);
|
|
2993
3326
|
if (result && typeof result.catch === "function") {
|
|
2994
3327
|
void result.catch((error) => {
|
|
2995
|
-
|
|
3328
|
+
warnOnce7(
|
|
2996
3329
|
`otlp-emit:${key}`,
|
|
2997
3330
|
`[Blyp] Failed to deliver log to OTLP target "${connector.name}".`,
|
|
2998
3331
|
error
|
|
@@ -3000,7 +3333,7 @@ function createSender(connector) {
|
|
|
3000
3333
|
});
|
|
3001
3334
|
}
|
|
3002
3335
|
} catch (error) {
|
|
3003
|
-
|
|
3336
|
+
warnOnce7(
|
|
3004
3337
|
`otlp-emit:${key}`,
|
|
3005
3338
|
`[Blyp] Failed to deliver log to OTLP target "${connector.name}".`,
|
|
3006
3339
|
error
|
|
@@ -3013,7 +3346,7 @@ function createSender(connector) {
|
|
|
3013
3346
|
await transport.flush();
|
|
3014
3347
|
}
|
|
3015
3348
|
} catch (error) {
|
|
3016
|
-
|
|
3349
|
+
warnOnce7(
|
|
3017
3350
|
`otlp-flush:${key}`,
|
|
3018
3351
|
`[Blyp] Failed to flush OTLP logs for target "${connector.name}".`,
|
|
3019
3352
|
error
|
|
@@ -3042,7 +3375,7 @@ function createOTLPRegistry(config) {
|
|
|
3042
3375
|
await Promise.all(Array.from(senders.values()).map((sender) => sender.flush()));
|
|
3043
3376
|
}
|
|
3044
3377
|
};
|
|
3045
|
-
|
|
3378
|
+
registerShutdownHooks4("otlp-registry", () => registry.flush());
|
|
3046
3379
|
return registry;
|
|
3047
3380
|
}
|
|
3048
3381
|
var _RuntimeDetector = class _RuntimeDetector {
|
|
@@ -3433,6 +3766,9 @@ function getPostHogSender(logger2) {
|
|
|
3433
3766
|
function getBetterStackSender(logger2) {
|
|
3434
3767
|
return getLoggerFactory(logger2).betterstack;
|
|
3435
3768
|
}
|
|
3769
|
+
function getDatabuddySender(logger2) {
|
|
3770
|
+
return getLoggerFactory(logger2).databuddy;
|
|
3771
|
+
}
|
|
3436
3772
|
function tryGetPostHogSender(logger2) {
|
|
3437
3773
|
try {
|
|
3438
3774
|
return getPostHogSender(logger2);
|
|
@@ -3447,6 +3783,13 @@ function tryGetBetterStackSender(logger2) {
|
|
|
3447
3783
|
return null;
|
|
3448
3784
|
}
|
|
3449
3785
|
}
|
|
3786
|
+
function tryGetDatabuddySender(logger2) {
|
|
3787
|
+
try {
|
|
3788
|
+
return getDatabuddySender(logger2);
|
|
3789
|
+
} catch {
|
|
3790
|
+
return null;
|
|
3791
|
+
}
|
|
3792
|
+
}
|
|
3450
3793
|
function getSentrySender(logger2) {
|
|
3451
3794
|
return getLoggerFactory(logger2).sentry;
|
|
3452
3795
|
}
|
|
@@ -3506,6 +3849,18 @@ function maybeSendToBetterStack(betterstack, record) {
|
|
|
3506
3849
|
}
|
|
3507
3850
|
betterstack.send(record, { source: "server", warnIfUnavailable: true });
|
|
3508
3851
|
}
|
|
3852
|
+
function maybeSendToDatabuddy(databuddy, record) {
|
|
3853
|
+
if (isClientLogRecord(record)) {
|
|
3854
|
+
return;
|
|
3855
|
+
}
|
|
3856
|
+
if (!databuddy.shouldAutoForwardServerLogs()) {
|
|
3857
|
+
if (databuddy.enabled && !databuddy.ready) {
|
|
3858
|
+
databuddy.send(record, { source: "server", warnIfUnavailable: true });
|
|
3859
|
+
}
|
|
3860
|
+
return;
|
|
3861
|
+
}
|
|
3862
|
+
databuddy.send(record, { source: "server", warnIfUnavailable: true });
|
|
3863
|
+
}
|
|
3509
3864
|
function maybeSendToSentry(sentry, record) {
|
|
3510
3865
|
if (isClientLogRecord(record)) {
|
|
3511
3866
|
return;
|
|
@@ -3526,7 +3881,7 @@ function maybeSendToOTLP(otlp, record) {
|
|
|
3526
3881
|
sender.send(record, { source: "server", warnIfUnavailable: true });
|
|
3527
3882
|
}
|
|
3528
3883
|
}
|
|
3529
|
-
function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry, otlp, bindings = {}, source = "root") {
|
|
3884
|
+
function createLoggerInstance(rootRawLogger, sink, betterstack, databuddy, posthog, sentry, otlp, bindings = {}, source = "root") {
|
|
3530
3885
|
const rawLogger = Object.keys(bindings).length > 0 ? rootRawLogger.child(bindings) : rootRawLogger;
|
|
3531
3886
|
const writeRecord = (level, message, args, writeSource = source) => {
|
|
3532
3887
|
if (writeSource === "root" && shouldDropRootLogWrite()) {
|
|
@@ -3552,6 +3907,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3552
3907
|
);
|
|
3553
3908
|
sink.write(record);
|
|
3554
3909
|
maybeSendToBetterStack(betterstack, record);
|
|
3910
|
+
maybeSendToDatabuddy(databuddy, record);
|
|
3555
3911
|
maybeSendToPostHog(posthog, record);
|
|
3556
3912
|
maybeSendToSentry(sentry, record);
|
|
3557
3913
|
maybeSendToOTLP(otlp, record);
|
|
@@ -3575,6 +3931,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3575
3931
|
sink.write(record);
|
|
3576
3932
|
}
|
|
3577
3933
|
maybeSendToBetterStack(betterstack, record);
|
|
3934
|
+
maybeSendToDatabuddy(databuddy, record);
|
|
3578
3935
|
maybeSendToPostHog(posthog, record);
|
|
3579
3936
|
maybeSendToSentry(sentry, record);
|
|
3580
3937
|
maybeSendToOTLP(otlp, record);
|
|
@@ -3608,8 +3965,26 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3608
3965
|
}
|
|
3609
3966
|
writeRecord("table", message, data === void 0 ? [] : [data]);
|
|
3610
3967
|
},
|
|
3611
|
-
flush: () =>
|
|
3612
|
-
|
|
3968
|
+
flush: async () => {
|
|
3969
|
+
await sink.flush();
|
|
3970
|
+
await Promise.allSettled([
|
|
3971
|
+
betterstack.flush(),
|
|
3972
|
+
databuddy.flush(),
|
|
3973
|
+
posthog.flush(),
|
|
3974
|
+
sentry.flush(),
|
|
3975
|
+
otlp.flush()
|
|
3976
|
+
]);
|
|
3977
|
+
},
|
|
3978
|
+
shutdown: async () => {
|
|
3979
|
+
await sink.shutdown();
|
|
3980
|
+
await Promise.allSettled([
|
|
3981
|
+
betterstack.flush(),
|
|
3982
|
+
databuddy.flush(),
|
|
3983
|
+
posthog.flush(),
|
|
3984
|
+
sentry.flush(),
|
|
3985
|
+
otlp.flush()
|
|
3986
|
+
]);
|
|
3987
|
+
},
|
|
3613
3988
|
createStructuredLog: (groupId, initial) => {
|
|
3614
3989
|
return createStructuredLogForLogger(logger2, groupId, {
|
|
3615
3990
|
initialFields: initial
|
|
@@ -3621,6 +3996,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3621
3996
|
rootRawLogger,
|
|
3622
3997
|
sink,
|
|
3623
3998
|
betterstack,
|
|
3999
|
+
databuddy,
|
|
3624
4000
|
posthog,
|
|
3625
4001
|
sentry,
|
|
3626
4002
|
otlp,
|
|
@@ -3631,6 +4007,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3631
4007
|
[LOGGER_FACTORY]: {
|
|
3632
4008
|
bindings,
|
|
3633
4009
|
betterstack,
|
|
4010
|
+
databuddy,
|
|
3634
4011
|
posthog,
|
|
3635
4012
|
sentry,
|
|
3636
4013
|
otlp,
|
|
@@ -3640,6 +4017,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3640
4017
|
rootRawLogger,
|
|
3641
4018
|
sink,
|
|
3642
4019
|
betterstack,
|
|
4020
|
+
databuddy,
|
|
3643
4021
|
posthog,
|
|
3644
4022
|
sentry,
|
|
3645
4023
|
otlp,
|
|
@@ -3663,6 +4041,7 @@ function createBaseLogger(config) {
|
|
|
3663
4041
|
const rawLogger = createPinoLogger(resolvedConfig);
|
|
3664
4042
|
const sink = createPrimarySink(resolvedConfig);
|
|
3665
4043
|
const betterstack = createBetterStackSender(resolvedConfig);
|
|
4044
|
+
const databuddy = createDatabuddySender(resolvedConfig);
|
|
3666
4045
|
const posthog = createPostHogSender(resolvedConfig);
|
|
3667
4046
|
const sentry = createSentrySender(resolvedConfig);
|
|
3668
4047
|
const otlp = createOTLPRegistry(resolvedConfig);
|
|
@@ -3670,6 +4049,7 @@ function createBaseLogger(config) {
|
|
|
3670
4049
|
rawLogger,
|
|
3671
4050
|
sink,
|
|
3672
4051
|
betterstack,
|
|
4052
|
+
databuddy,
|
|
3673
4053
|
posthog,
|
|
3674
4054
|
sentry,
|
|
3675
4055
|
otlp
|
|
@@ -3752,6 +4132,7 @@ function resolveServerLogger(config = {}, loggerOverride) {
|
|
|
3752
4132
|
return {
|
|
3753
4133
|
logger: logger2,
|
|
3754
4134
|
betterstack: getBetterStackSender(logger2),
|
|
4135
|
+
databuddy: getDatabuddySender(logger2),
|
|
3755
4136
|
posthog: getPostHogSender(logger2),
|
|
3756
4137
|
sentry: getSentrySender(logger2),
|
|
3757
4138
|
otlp: getOtlpRegistry(logger2),
|
|
@@ -3871,6 +4252,22 @@ function emitHttpErrorLog(logger2, level, request, path3, statusCode, responseTi
|
|
|
3871
4252
|
}
|
|
3872
4253
|
});
|
|
3873
4254
|
}
|
|
4255
|
+
const databuddy = tryGetDatabuddySender(logger2);
|
|
4256
|
+
if (databuddy?.shouldAutoCaptureExceptions()) {
|
|
4257
|
+
databuddy.captureException(captureContext.error ?? error ?? message, {
|
|
4258
|
+
source: "server",
|
|
4259
|
+
warnIfUnavailable: true,
|
|
4260
|
+
properties: {
|
|
4261
|
+
method: request.method,
|
|
4262
|
+
path: path3,
|
|
4263
|
+
status_code: statusCode,
|
|
4264
|
+
...request.url ? { current_url: request.url } : {},
|
|
4265
|
+
...getHeaderValue(request.headers, "user-agent") ? { user_agent: getHeaderValue(request.headers, "user-agent") } : {},
|
|
4266
|
+
...errorLogData.ip ? { ip: errorLogData.ip } : {},
|
|
4267
|
+
payload: errorLogData
|
|
4268
|
+
}
|
|
4269
|
+
});
|
|
4270
|
+
}
|
|
3874
4271
|
return errorLogData;
|
|
3875
4272
|
}
|
|
3876
4273
|
async function parseClientLogPayload(request, body) {
|
|
@@ -3962,6 +4359,34 @@ async function handleClientLogIngestion(options) {
|
|
|
3962
4359
|
});
|
|
3963
4360
|
}
|
|
3964
4361
|
}
|
|
4362
|
+
} else if (payload.connector === "databuddy") {
|
|
4363
|
+
headers["x-blyp-databuddy-status"] = config.databuddy.ready ? "enabled" : "missing";
|
|
4364
|
+
if (config.databuddy.ready) {
|
|
4365
|
+
const forwardedRecord = {
|
|
4366
|
+
timestamp: structuredPayload.receivedAt,
|
|
4367
|
+
level: payload.level,
|
|
4368
|
+
message: `[client] ${payload.message}`,
|
|
4369
|
+
data: structuredPayload
|
|
4370
|
+
};
|
|
4371
|
+
config.databuddy.send(forwardedRecord, {
|
|
4372
|
+
source: "client"
|
|
4373
|
+
});
|
|
4374
|
+
if ((payload.level === "error" || payload.level === "critical") && config.databuddy.shouldAutoCaptureExceptions()) {
|
|
4375
|
+
const clientErrorCandidate = payload.data && typeof payload.data === "object" && !Array.isArray(payload.data) && typeof payload.data.message === "string" ? payload.data : payload.message;
|
|
4376
|
+
config.databuddy.captureException(clientErrorCandidate, {
|
|
4377
|
+
source: "client",
|
|
4378
|
+
warnIfUnavailable: true,
|
|
4379
|
+
sessionId: payload.session.sessionId,
|
|
4380
|
+
properties: {
|
|
4381
|
+
page_url: payload.page.url,
|
|
4382
|
+
page_path: payload.page.pathname,
|
|
4383
|
+
client_runtime: payload.device?.runtime,
|
|
4384
|
+
metadata: payload.metadata,
|
|
4385
|
+
payload: structuredPayload
|
|
4386
|
+
}
|
|
4387
|
+
});
|
|
4388
|
+
}
|
|
4389
|
+
}
|
|
3965
4390
|
} else if (payload.connector === "posthog") {
|
|
3966
4391
|
headers["x-blyp-posthog-status"] = config.posthog.ready ? "enabled" : "missing";
|
|
3967
4392
|
if (config.posthog.ready) {
|