@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/fastify.js
CHANGED
|
@@ -16,6 +16,7 @@ var async_hooks = require('async_hooks');
|
|
|
16
16
|
var crypto = require('crypto');
|
|
17
17
|
var Sentry = require('@sentry/node');
|
|
18
18
|
var node = require('@logtail/node');
|
|
19
|
+
var node$1 = require('@databuddy/sdk/node');
|
|
19
20
|
|
|
20
21
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
21
22
|
|
|
@@ -400,6 +401,7 @@ var CLIENT_LOG_LEVELS = [
|
|
|
400
401
|
];
|
|
401
402
|
var clientConnectorRequestSchema = zod.z.union([
|
|
402
403
|
zod.z.literal("betterstack"),
|
|
404
|
+
zod.z.literal("databuddy"),
|
|
403
405
|
zod.z.literal("posthog"),
|
|
404
406
|
zod.z.literal("sentry"),
|
|
405
407
|
zod.z.undefined(),
|
|
@@ -440,16 +442,16 @@ function normalizeEndpointPath(path3) {
|
|
|
440
442
|
}
|
|
441
443
|
|
|
442
444
|
// src/shared/once.ts
|
|
443
|
-
function createConsoleOnceLogger(method,
|
|
445
|
+
function createConsoleOnceLogger(method, warnedKeys7 = /* @__PURE__ */ new Set()) {
|
|
444
446
|
return (key, message, error) => {
|
|
445
|
-
if (
|
|
447
|
+
if (warnedKeys7.has(key) || typeof console === "undefined") {
|
|
446
448
|
return;
|
|
447
449
|
}
|
|
448
450
|
const writer = console[method];
|
|
449
451
|
if (typeof writer !== "function") {
|
|
450
452
|
return;
|
|
451
453
|
}
|
|
452
|
-
|
|
454
|
+
warnedKeys7.add(key);
|
|
453
455
|
if (error === void 0) {
|
|
454
456
|
writer.call(console, message);
|
|
455
457
|
return;
|
|
@@ -457,11 +459,11 @@ function createConsoleOnceLogger(method, warnedKeys6 = /* @__PURE__ */ new Set()
|
|
|
457
459
|
writer.call(console, message, error);
|
|
458
460
|
};
|
|
459
461
|
}
|
|
460
|
-
function createWarnOnceLogger(
|
|
461
|
-
return createConsoleOnceLogger("warn",
|
|
462
|
+
function createWarnOnceLogger(warnedKeys7) {
|
|
463
|
+
return createConsoleOnceLogger("warn", warnedKeys7);
|
|
462
464
|
}
|
|
463
|
-
function createErrorOnceLogger(
|
|
464
|
-
return createConsoleOnceLogger("error",
|
|
465
|
+
function createErrorOnceLogger(warnedKeys7) {
|
|
466
|
+
return createConsoleOnceLogger("error", warnedKeys7);
|
|
465
467
|
}
|
|
466
468
|
|
|
467
469
|
// src/core/config.ts
|
|
@@ -827,6 +829,28 @@ function mergePostHogConnectorConfig(base, override) {
|
|
|
827
829
|
}
|
|
828
830
|
};
|
|
829
831
|
}
|
|
832
|
+
function mergeDatabuddyConnectorConfig(base, override) {
|
|
833
|
+
const enabled = override?.enabled ?? base?.enabled ?? false;
|
|
834
|
+
const apiKey = override?.apiKey ?? base?.apiKey;
|
|
835
|
+
const websiteId = override?.websiteId ?? base?.websiteId;
|
|
836
|
+
const ready = enabled && hasNonEmptyString(apiKey) && hasNonEmptyString(websiteId);
|
|
837
|
+
return {
|
|
838
|
+
enabled,
|
|
839
|
+
mode: override?.mode ?? base?.mode ?? "auto",
|
|
840
|
+
apiKey,
|
|
841
|
+
websiteId,
|
|
842
|
+
namespace: override?.namespace ?? base?.namespace,
|
|
843
|
+
source: override?.source ?? base?.source,
|
|
844
|
+
apiUrl: override?.apiUrl ?? base?.apiUrl,
|
|
845
|
+
debug: override?.debug ?? base?.debug ?? false,
|
|
846
|
+
enableBatching: override?.enableBatching ?? base?.enableBatching ?? true,
|
|
847
|
+
batchSize: override?.batchSize ?? base?.batchSize,
|
|
848
|
+
batchTimeout: override?.batchTimeout ?? base?.batchTimeout,
|
|
849
|
+
maxQueueSize: override?.maxQueueSize ?? base?.maxQueueSize,
|
|
850
|
+
ready,
|
|
851
|
+
status: ready ? "enabled" : "missing"
|
|
852
|
+
};
|
|
853
|
+
}
|
|
830
854
|
function mergeBetterStackConnectorConfig(base, override) {
|
|
831
855
|
const sourceToken = override?.sourceToken ?? base?.sourceToken;
|
|
832
856
|
const ingestingHost = override?.ingestingHost ?? base?.ingestingHost;
|
|
@@ -917,6 +941,7 @@ function mergeOTLPConnectorsConfig(base, override) {
|
|
|
917
941
|
function mergeConnectorsConfig(base, override) {
|
|
918
942
|
return {
|
|
919
943
|
betterstack: mergeBetterStackConnectorConfig(base?.betterstack, override?.betterstack),
|
|
944
|
+
databuddy: mergeDatabuddyConnectorConfig(base?.databuddy, override?.databuddy),
|
|
920
945
|
posthog: mergePostHogConnectorConfig(base?.posthog, override?.posthog),
|
|
921
946
|
sentry: mergeSentryConnectorConfig(base?.sentry, override?.sentry),
|
|
922
947
|
otlp: mergeOTLPConnectorsConfig(base?.otlp, override?.otlp)
|
|
@@ -2555,12 +2580,320 @@ function createBetterStackSender(config) {
|
|
|
2555
2580
|
};
|
|
2556
2581
|
}
|
|
2557
2582
|
var warnedKeys4 = /* @__PURE__ */ new Set();
|
|
2583
|
+
var senderCache = /* @__PURE__ */ new Map();
|
|
2558
2584
|
var testHooks3 = {};
|
|
2559
2585
|
var warnOnce5 = createErrorOnceLogger(warnedKeys4);
|
|
2560
|
-
function
|
|
2561
|
-
|
|
2586
|
+
function registerShutdownHooks3(key, shutdown) {
|
|
2587
|
+
const handlers = ["beforeExit", "SIGINT", "SIGTERM"];
|
|
2588
|
+
for (const event of handlers) {
|
|
2589
|
+
process.once(event, () => {
|
|
2590
|
+
void shutdown().catch((error) => {
|
|
2591
|
+
warnOnce5(
|
|
2592
|
+
`${key}:shutdown`,
|
|
2593
|
+
"[Blyp] Failed to flush Databuddy telemetry during shutdown.",
|
|
2594
|
+
error
|
|
2595
|
+
);
|
|
2596
|
+
});
|
|
2597
|
+
});
|
|
2598
|
+
}
|
|
2562
2599
|
}
|
|
2563
2600
|
function resolveConnectorConfig3(config) {
|
|
2601
|
+
const connector = isBlypConfig(config) ? config.connectors?.databuddy : config;
|
|
2602
|
+
const enabled = connector?.enabled ?? false;
|
|
2603
|
+
const apiKey = connector?.apiKey;
|
|
2604
|
+
const websiteId = connector?.websiteId;
|
|
2605
|
+
const ready = enabled && hasNonEmptyString(apiKey) && hasNonEmptyString(websiteId);
|
|
2606
|
+
return {
|
|
2607
|
+
enabled,
|
|
2608
|
+
mode: connector?.mode ?? "auto",
|
|
2609
|
+
apiKey,
|
|
2610
|
+
websiteId,
|
|
2611
|
+
namespace: connector?.namespace,
|
|
2612
|
+
source: connector?.source,
|
|
2613
|
+
apiUrl: connector?.apiUrl,
|
|
2614
|
+
debug: connector?.debug ?? false,
|
|
2615
|
+
enableBatching: connector?.enableBatching ?? true,
|
|
2616
|
+
batchSize: connector?.batchSize,
|
|
2617
|
+
batchTimeout: connector?.batchTimeout,
|
|
2618
|
+
maxQueueSize: connector?.maxQueueSize,
|
|
2619
|
+
ready,
|
|
2620
|
+
status: ready ? "enabled" : "missing"
|
|
2621
|
+
};
|
|
2622
|
+
}
|
|
2623
|
+
function createDefaultClient2(connector) {
|
|
2624
|
+
return new node$1.Databuddy({
|
|
2625
|
+
apiKey: connector.apiKey ?? "",
|
|
2626
|
+
...connector.websiteId ? { websiteId: connector.websiteId } : {},
|
|
2627
|
+
...connector.namespace ? { namespace: connector.namespace } : {},
|
|
2628
|
+
...connector.source ? { source: connector.source } : {},
|
|
2629
|
+
...connector.apiUrl ? { apiUrl: connector.apiUrl } : {},
|
|
2630
|
+
debug: connector.debug,
|
|
2631
|
+
enableBatching: connector.enableBatching,
|
|
2632
|
+
...connector.batchSize !== void 0 ? { batchSize: connector.batchSize } : {},
|
|
2633
|
+
...connector.batchTimeout !== void 0 ? { batchTimeout: connector.batchTimeout } : {},
|
|
2634
|
+
...connector.maxQueueSize !== void 0 ? { maxQueueSize: connector.maxQueueSize } : {}
|
|
2635
|
+
});
|
|
2636
|
+
}
|
|
2637
|
+
function getDatabuddySenderKey(connector) {
|
|
2638
|
+
return JSON.stringify({
|
|
2639
|
+
enabled: connector.enabled,
|
|
2640
|
+
mode: connector.mode,
|
|
2641
|
+
apiKey: connector.apiKey ?? null,
|
|
2642
|
+
websiteId: connector.websiteId ?? null,
|
|
2643
|
+
namespace: connector.namespace ?? null,
|
|
2644
|
+
source: connector.source ?? null,
|
|
2645
|
+
apiUrl: connector.apiUrl ?? null,
|
|
2646
|
+
debug: connector.debug,
|
|
2647
|
+
enableBatching: connector.enableBatching,
|
|
2648
|
+
batchSize: connector.batchSize ?? null,
|
|
2649
|
+
batchTimeout: connector.batchTimeout ?? null,
|
|
2650
|
+
maxQueueSize: connector.maxQueueSize ?? null
|
|
2651
|
+
});
|
|
2652
|
+
}
|
|
2653
|
+
function getSessionId(record) {
|
|
2654
|
+
const direct = getField(record, "sessionId");
|
|
2655
|
+
if (hasNonEmptyString(direct)) {
|
|
2656
|
+
return direct;
|
|
2657
|
+
}
|
|
2658
|
+
return getClientSessionField(record, "sessionId");
|
|
2659
|
+
}
|
|
2660
|
+
function getAnonymousId(record) {
|
|
2661
|
+
const direct = getField(record, "anonymousId");
|
|
2662
|
+
if (hasNonEmptyString(direct)) {
|
|
2663
|
+
return direct;
|
|
2664
|
+
}
|
|
2665
|
+
const payload = getPrimaryPayload(record);
|
|
2666
|
+
if (isPlainObject(payload.metadata) && hasNonEmptyString(payload.metadata.databuddyAnonymousId)) {
|
|
2667
|
+
return payload.metadata.databuddyAnonymousId;
|
|
2668
|
+
}
|
|
2669
|
+
return void 0;
|
|
2670
|
+
}
|
|
2671
|
+
function getDatabuddyEventName(record) {
|
|
2672
|
+
const recordType = getRecordType(record);
|
|
2673
|
+
if (hasNonEmptyString(recordType)) {
|
|
2674
|
+
return recordType;
|
|
2675
|
+
}
|
|
2676
|
+
return "log";
|
|
2677
|
+
}
|
|
2678
|
+
function buildRecordProperties(record, source) {
|
|
2679
|
+
const properties = {
|
|
2680
|
+
blyp_level: record.level,
|
|
2681
|
+
blyp_source: source,
|
|
2682
|
+
blyp_payload: serializeLogRecord(record),
|
|
2683
|
+
message: typeof record.message === "string" ? record.message : String(record.message)
|
|
2684
|
+
};
|
|
2685
|
+
const caller = typeof record.caller === "string" ? record.caller : void 0;
|
|
2686
|
+
const groupId = getField(record, "groupId");
|
|
2687
|
+
const method = getField(record, "method");
|
|
2688
|
+
const path3 = getField(record, "path");
|
|
2689
|
+
const status = getField(record, "status");
|
|
2690
|
+
const duration = getField(record, "duration");
|
|
2691
|
+
const pagePath = getClientPageField(record, "pathname");
|
|
2692
|
+
const pageUrl = getClientPageField(record, "url");
|
|
2693
|
+
const sessionId = getClientSessionField(record, "sessionId");
|
|
2694
|
+
const pageId = getClientSessionField(record, "pageId");
|
|
2695
|
+
const ifTruthy = [
|
|
2696
|
+
["blyp_type", getRecordType(record)],
|
|
2697
|
+
["caller", caller],
|
|
2698
|
+
["group_id", groupId],
|
|
2699
|
+
["method", method],
|
|
2700
|
+
["path", path3],
|
|
2701
|
+
["page_path", pagePath],
|
|
2702
|
+
["page_url", pageUrl],
|
|
2703
|
+
["session_id", sessionId],
|
|
2704
|
+
["page_id", pageId]
|
|
2705
|
+
];
|
|
2706
|
+
const ifDefined = [
|
|
2707
|
+
["status_code", status],
|
|
2708
|
+
["duration_ms", duration]
|
|
2709
|
+
];
|
|
2710
|
+
for (const [key, value] of ifTruthy) {
|
|
2711
|
+
if (value) {
|
|
2712
|
+
properties[key] = value;
|
|
2713
|
+
}
|
|
2714
|
+
}
|
|
2715
|
+
for (const [key, value] of ifDefined) {
|
|
2716
|
+
if (value !== void 0) {
|
|
2717
|
+
properties[key] = value;
|
|
2718
|
+
}
|
|
2719
|
+
}
|
|
2720
|
+
return properties;
|
|
2721
|
+
}
|
|
2722
|
+
function createTrackEvent(record, source) {
|
|
2723
|
+
return {
|
|
2724
|
+
name: getDatabuddyEventName(record),
|
|
2725
|
+
anonymousId: getAnonymousId(record),
|
|
2726
|
+
sessionId: getSessionId(record),
|
|
2727
|
+
properties: buildRecordProperties(record, source)
|
|
2728
|
+
};
|
|
2729
|
+
}
|
|
2730
|
+
function normalizeExceptionProperties2(value) {
|
|
2731
|
+
if (!isPlainObject(value)) {
|
|
2732
|
+
return {};
|
|
2733
|
+
}
|
|
2734
|
+
return normalizeLogValue(value);
|
|
2735
|
+
}
|
|
2736
|
+
function normalizeExceptionInput3(value, fallbackMessage) {
|
|
2737
|
+
if (value instanceof Error) {
|
|
2738
|
+
return {
|
|
2739
|
+
message: value.message || fallbackMessage,
|
|
2740
|
+
properties: {
|
|
2741
|
+
error_type: value.name,
|
|
2742
|
+
...value.stack ? { stack: value.stack } : {},
|
|
2743
|
+
...normalizeExceptionProperties2(value)
|
|
2744
|
+
}
|
|
2745
|
+
};
|
|
2746
|
+
}
|
|
2747
|
+
if (isPlainObject(value)) {
|
|
2748
|
+
const message = hasNonEmptyString(value.message) ? value.message : hasNonEmptyString(value.error) ? value.error : fallbackMessage;
|
|
2749
|
+
return {
|
|
2750
|
+
message,
|
|
2751
|
+
properties: normalizeExceptionProperties2(value)
|
|
2752
|
+
};
|
|
2753
|
+
}
|
|
2754
|
+
if (typeof value === "string") {
|
|
2755
|
+
return {
|
|
2756
|
+
message: value,
|
|
2757
|
+
properties: {
|
|
2758
|
+
message: value
|
|
2759
|
+
}
|
|
2760
|
+
};
|
|
2761
|
+
}
|
|
2762
|
+
return {
|
|
2763
|
+
message: fallbackMessage,
|
|
2764
|
+
properties: {
|
|
2765
|
+
value: normalizeLogValue(value)
|
|
2766
|
+
}
|
|
2767
|
+
};
|
|
2768
|
+
}
|
|
2769
|
+
function createDatabuddySender(config) {
|
|
2770
|
+
const connector = resolveConnectorConfig3(config);
|
|
2771
|
+
const senderKey = getDatabuddySenderKey(connector);
|
|
2772
|
+
const cached = senderCache.get(senderKey);
|
|
2773
|
+
if (cached) {
|
|
2774
|
+
return cached;
|
|
2775
|
+
}
|
|
2776
|
+
const key = `${connector.apiUrl ?? "default"}:${connector.mode}:${connector.apiKey ?? "missing"}`;
|
|
2777
|
+
const client = connector.ready ? testHooks3.createClient?.(connector) ?? createDefaultClient2(connector) : void 0;
|
|
2778
|
+
if (client) {
|
|
2779
|
+
registerShutdownHooks3(key, async () => {
|
|
2780
|
+
await client.flush();
|
|
2781
|
+
});
|
|
2782
|
+
}
|
|
2783
|
+
const emitUnavailableWarning = () => {
|
|
2784
|
+
warnOnce5(
|
|
2785
|
+
`databuddy-unavailable:${key}`,
|
|
2786
|
+
"[Blyp] Databuddy connector is not configured. Databuddy requires both apiKey and websiteId. Skipping Databuddy delivery."
|
|
2787
|
+
);
|
|
2788
|
+
};
|
|
2789
|
+
const emitExceptionUnavailableWarning = () => {
|
|
2790
|
+
warnOnce5(
|
|
2791
|
+
`databuddy-exception-unavailable:${key}`,
|
|
2792
|
+
"[Blyp] Databuddy error tracking is not configured. Databuddy requires both apiKey and websiteId. Skipping Databuddy exception capture."
|
|
2793
|
+
);
|
|
2794
|
+
};
|
|
2795
|
+
const sender = {
|
|
2796
|
+
enabled: connector.enabled,
|
|
2797
|
+
ready: connector.ready,
|
|
2798
|
+
mode: connector.mode,
|
|
2799
|
+
status: connector.status,
|
|
2800
|
+
shouldAutoForwardServerLogs() {
|
|
2801
|
+
return connector.ready && connector.mode === "auto";
|
|
2802
|
+
},
|
|
2803
|
+
shouldAutoCaptureExceptions() {
|
|
2804
|
+
return connector.ready && connector.mode === "auto";
|
|
2805
|
+
},
|
|
2806
|
+
send(record, options = {}) {
|
|
2807
|
+
if (!connector.ready || !client) {
|
|
2808
|
+
if (options.warnIfUnavailable) {
|
|
2809
|
+
emitUnavailableWarning();
|
|
2810
|
+
}
|
|
2811
|
+
return;
|
|
2812
|
+
}
|
|
2813
|
+
try {
|
|
2814
|
+
const result = client.track(createTrackEvent(record, options.source ?? "server"));
|
|
2815
|
+
if (result && typeof result.catch === "function") {
|
|
2816
|
+
void result.catch((error) => {
|
|
2817
|
+
warnOnce5(
|
|
2818
|
+
`databuddy-send:${key}`,
|
|
2819
|
+
"[Blyp] Failed to deliver log to Databuddy.",
|
|
2820
|
+
error
|
|
2821
|
+
);
|
|
2822
|
+
});
|
|
2823
|
+
}
|
|
2824
|
+
} catch (error) {
|
|
2825
|
+
warnOnce5(
|
|
2826
|
+
`databuddy-send:${key}`,
|
|
2827
|
+
"[Blyp] Failed to deliver log to Databuddy.",
|
|
2828
|
+
error
|
|
2829
|
+
);
|
|
2830
|
+
}
|
|
2831
|
+
},
|
|
2832
|
+
captureException(error, options = {}) {
|
|
2833
|
+
if (!connector.ready || !client) {
|
|
2834
|
+
if (options.warnIfUnavailable) {
|
|
2835
|
+
emitExceptionUnavailableWarning();
|
|
2836
|
+
}
|
|
2837
|
+
return;
|
|
2838
|
+
}
|
|
2839
|
+
const normalized = normalizeExceptionInput3(
|
|
2840
|
+
error,
|
|
2841
|
+
options.source === "client" ? "Client error" : "Server error"
|
|
2842
|
+
);
|
|
2843
|
+
try {
|
|
2844
|
+
const result = client.track({
|
|
2845
|
+
name: "error",
|
|
2846
|
+
anonymousId: options.anonymousId,
|
|
2847
|
+
sessionId: options.sessionId,
|
|
2848
|
+
properties: {
|
|
2849
|
+
message: normalized.message,
|
|
2850
|
+
blyp_source: options.source ?? "server",
|
|
2851
|
+
blyp_level: "error",
|
|
2852
|
+
...normalized.properties,
|
|
2853
|
+
...options.properties ?? {}
|
|
2854
|
+
}
|
|
2855
|
+
});
|
|
2856
|
+
if (result && typeof result.catch === "function") {
|
|
2857
|
+
void result.catch((captureError) => {
|
|
2858
|
+
warnOnce5(
|
|
2859
|
+
`databuddy-capture:${key}`,
|
|
2860
|
+
"[Blyp] Failed to capture exception in Databuddy.",
|
|
2861
|
+
captureError
|
|
2862
|
+
);
|
|
2863
|
+
});
|
|
2864
|
+
}
|
|
2865
|
+
} catch (captureError) {
|
|
2866
|
+
warnOnce5(
|
|
2867
|
+
`databuddy-capture:${key}`,
|
|
2868
|
+
"[Blyp] Failed to capture exception in Databuddy.",
|
|
2869
|
+
captureError
|
|
2870
|
+
);
|
|
2871
|
+
}
|
|
2872
|
+
},
|
|
2873
|
+
async flush() {
|
|
2874
|
+
try {
|
|
2875
|
+
if (client) {
|
|
2876
|
+
await client.flush();
|
|
2877
|
+
}
|
|
2878
|
+
} catch (error) {
|
|
2879
|
+
warnOnce5(
|
|
2880
|
+
`databuddy-flush:${key}`,
|
|
2881
|
+
"[Blyp] Failed to flush Databuddy telemetry.",
|
|
2882
|
+
error
|
|
2883
|
+
);
|
|
2884
|
+
}
|
|
2885
|
+
}
|
|
2886
|
+
};
|
|
2887
|
+
senderCache.set(senderKey, sender);
|
|
2888
|
+
return sender;
|
|
2889
|
+
}
|
|
2890
|
+
var warnedKeys5 = /* @__PURE__ */ new Set();
|
|
2891
|
+
var testHooks4 = {};
|
|
2892
|
+
var warnOnce6 = createErrorOnceLogger(warnedKeys5);
|
|
2893
|
+
function getSentryModule2() {
|
|
2894
|
+
return testHooks4.module ?? Sentry__namespace;
|
|
2895
|
+
}
|
|
2896
|
+
function resolveConnectorConfig4(config) {
|
|
2564
2897
|
const connector = isBlypConfig(config) ? config.connectors?.sentry : config;
|
|
2565
2898
|
const enabled = connector?.enabled ?? false;
|
|
2566
2899
|
const dsn = connector?.dsn;
|
|
@@ -2705,7 +3038,7 @@ function hasConfigMismatch(connector, client) {
|
|
|
2705
3038
|
return hasNonEmptyString(connector.dsn) && connector.dsn !== options.dsn || hasNonEmptyString(connector.environment) && connector.environment !== options.environment || hasNonEmptyString(connector.release) && connector.release !== options.release;
|
|
2706
3039
|
}
|
|
2707
3040
|
function createSentrySender(config) {
|
|
2708
|
-
const connector =
|
|
3041
|
+
const connector = resolveConnectorConfig4(config);
|
|
2709
3042
|
const key = `${connector.mode}:${connector.dsn ?? "missing"}`;
|
|
2710
3043
|
const module = getSentryModule2();
|
|
2711
3044
|
let client = connector.enabled ? module.getClient() : void 0;
|
|
@@ -2719,7 +3052,7 @@ function createSentrySender(config) {
|
|
|
2719
3052
|
});
|
|
2720
3053
|
client = module.getClient();
|
|
2721
3054
|
} catch (error) {
|
|
2722
|
-
|
|
3055
|
+
warnOnce6(
|
|
2723
3056
|
`sentry-init:${key}`,
|
|
2724
3057
|
"[Blyp] Failed to initialize Sentry. Skipping Sentry delivery.",
|
|
2725
3058
|
error
|
|
@@ -2727,14 +3060,14 @@ function createSentrySender(config) {
|
|
|
2727
3060
|
}
|
|
2728
3061
|
}
|
|
2729
3062
|
if (client && hasConfigMismatch(connector, client)) {
|
|
2730
|
-
|
|
3063
|
+
warnOnce6(
|
|
2731
3064
|
`sentry-mismatch:${key}`,
|
|
2732
3065
|
"[Blyp] Sentry is already initialized with different options. Reusing the existing Sentry client."
|
|
2733
3066
|
);
|
|
2734
3067
|
}
|
|
2735
3068
|
const ready = connector.enabled && client !== void 0;
|
|
2736
3069
|
const emitUnavailableWarning = () => {
|
|
2737
|
-
|
|
3070
|
+
warnOnce6(
|
|
2738
3071
|
`sentry-unavailable:${key}`,
|
|
2739
3072
|
"[Blyp] Sentry connector is not configured. Skipping Sentry delivery."
|
|
2740
3073
|
);
|
|
@@ -2760,7 +3093,7 @@ function createSentrySender(config) {
|
|
|
2760
3093
|
try {
|
|
2761
3094
|
logMethod(record.message, attributes);
|
|
2762
3095
|
} catch (error) {
|
|
2763
|
-
|
|
3096
|
+
warnOnce6(
|
|
2764
3097
|
`sentry-log:${key}`,
|
|
2765
3098
|
"[Blyp] Failed to deliver log to Sentry.",
|
|
2766
3099
|
error
|
|
@@ -2778,7 +3111,7 @@ function createSentrySender(config) {
|
|
|
2778
3111
|
module.captureException(exception);
|
|
2779
3112
|
});
|
|
2780
3113
|
} catch (error) {
|
|
2781
|
-
|
|
3114
|
+
warnOnce6(
|
|
2782
3115
|
`sentry-exception:${key}`,
|
|
2783
3116
|
"[Blyp] Failed to capture exception in Sentry.",
|
|
2784
3117
|
error
|
|
@@ -2789,7 +3122,7 @@ function createSentrySender(config) {
|
|
|
2789
3122
|
try {
|
|
2790
3123
|
await module.flush(2e3);
|
|
2791
3124
|
} catch (error) {
|
|
2792
|
-
|
|
3125
|
+
warnOnce6(
|
|
2793
3126
|
`sentry-flush:${key}`,
|
|
2794
3127
|
"[Blyp] Failed to flush Sentry logs.",
|
|
2795
3128
|
error
|
|
@@ -2798,9 +3131,9 @@ function createSentrySender(config) {
|
|
|
2798
3131
|
}
|
|
2799
3132
|
};
|
|
2800
3133
|
}
|
|
2801
|
-
var
|
|
2802
|
-
var
|
|
2803
|
-
var
|
|
3134
|
+
var warnedKeys6 = /* @__PURE__ */ new Set();
|
|
3135
|
+
var testHooks5 = {};
|
|
3136
|
+
var warnOnce7 = createErrorOnceLogger(warnedKeys6);
|
|
2804
3137
|
function normalizeOTLPRecord(record, connector, source = "server") {
|
|
2805
3138
|
const severity = resolveSeverity2(record.level);
|
|
2806
3139
|
const body = typeof record.message === "string" ? record.message : String(record.message);
|
|
@@ -2865,14 +3198,14 @@ function resolveSeverity2(level) {
|
|
|
2865
3198
|
return { text: "info", number: apiLogs.SeverityNumber.INFO };
|
|
2866
3199
|
}
|
|
2867
3200
|
}
|
|
2868
|
-
function
|
|
3201
|
+
function registerShutdownHooks4(key, shutdown) {
|
|
2869
3202
|
const handlers = ["beforeExit", "SIGINT", "SIGTERM"];
|
|
2870
3203
|
for (const event of handlers) {
|
|
2871
3204
|
process.once(event, async () => {
|
|
2872
3205
|
try {
|
|
2873
3206
|
await shutdown();
|
|
2874
3207
|
} catch (error) {
|
|
2875
|
-
|
|
3208
|
+
warnOnce7(
|
|
2876
3209
|
`${key}:shutdown`,
|
|
2877
3210
|
"[Blyp] Failed to flush OTLP logs during shutdown.",
|
|
2878
3211
|
error
|
|
@@ -2949,7 +3282,7 @@ function createUnavailableSender(name, connector) {
|
|
|
2949
3282
|
const senderName = name || connector?.name || "otlp";
|
|
2950
3283
|
const key = `${senderName}:${connector?.serviceName ?? "blyp-app"}:${connector?.endpoint ?? "missing"}`;
|
|
2951
3284
|
const emitUnavailableWarning = () => {
|
|
2952
|
-
|
|
3285
|
+
warnOnce7(
|
|
2953
3286
|
`otlp-unavailable:${key}`,
|
|
2954
3287
|
`[Blyp] OTLP target "${senderName}" is not configured or not ready. Skipping OTLP delivery.`
|
|
2955
3288
|
);
|
|
@@ -2980,7 +3313,7 @@ function createSender(connector) {
|
|
|
2980
3313
|
...connector,
|
|
2981
3314
|
headers: resolveTransportHeaders(connector)
|
|
2982
3315
|
};
|
|
2983
|
-
const transport =
|
|
3316
|
+
const transport = testHooks5.createTransport?.(transportConnector) ?? createDefaultTransport2(transportConnector);
|
|
2984
3317
|
return {
|
|
2985
3318
|
name: connector.name,
|
|
2986
3319
|
enabled: connector.enabled,
|
|
@@ -2996,7 +3329,7 @@ function createSender(connector) {
|
|
|
2996
3329
|
const result = transport.emit(normalized);
|
|
2997
3330
|
if (result && typeof result.catch === "function") {
|
|
2998
3331
|
void result.catch((error) => {
|
|
2999
|
-
|
|
3332
|
+
warnOnce7(
|
|
3000
3333
|
`otlp-emit:${key}`,
|
|
3001
3334
|
`[Blyp] Failed to deliver log to OTLP target "${connector.name}".`,
|
|
3002
3335
|
error
|
|
@@ -3004,7 +3337,7 @@ function createSender(connector) {
|
|
|
3004
3337
|
});
|
|
3005
3338
|
}
|
|
3006
3339
|
} catch (error) {
|
|
3007
|
-
|
|
3340
|
+
warnOnce7(
|
|
3008
3341
|
`otlp-emit:${key}`,
|
|
3009
3342
|
`[Blyp] Failed to deliver log to OTLP target "${connector.name}".`,
|
|
3010
3343
|
error
|
|
@@ -3017,7 +3350,7 @@ function createSender(connector) {
|
|
|
3017
3350
|
await transport.flush();
|
|
3018
3351
|
}
|
|
3019
3352
|
} catch (error) {
|
|
3020
|
-
|
|
3353
|
+
warnOnce7(
|
|
3021
3354
|
`otlp-flush:${key}`,
|
|
3022
3355
|
`[Blyp] Failed to flush OTLP logs for target "${connector.name}".`,
|
|
3023
3356
|
error
|
|
@@ -3046,7 +3379,7 @@ function createOTLPRegistry(config) {
|
|
|
3046
3379
|
await Promise.all(Array.from(senders.values()).map((sender) => sender.flush()));
|
|
3047
3380
|
}
|
|
3048
3381
|
};
|
|
3049
|
-
|
|
3382
|
+
registerShutdownHooks4("otlp-registry", () => registry.flush());
|
|
3050
3383
|
return registry;
|
|
3051
3384
|
}
|
|
3052
3385
|
var _RuntimeDetector = class _RuntimeDetector {
|
|
@@ -3437,6 +3770,9 @@ function getPostHogSender(logger2) {
|
|
|
3437
3770
|
function getBetterStackSender(logger2) {
|
|
3438
3771
|
return getLoggerFactory(logger2).betterstack;
|
|
3439
3772
|
}
|
|
3773
|
+
function getDatabuddySender(logger2) {
|
|
3774
|
+
return getLoggerFactory(logger2).databuddy;
|
|
3775
|
+
}
|
|
3440
3776
|
function tryGetPostHogSender(logger2) {
|
|
3441
3777
|
try {
|
|
3442
3778
|
return getPostHogSender(logger2);
|
|
@@ -3451,6 +3787,13 @@ function tryGetBetterStackSender(logger2) {
|
|
|
3451
3787
|
return null;
|
|
3452
3788
|
}
|
|
3453
3789
|
}
|
|
3790
|
+
function tryGetDatabuddySender(logger2) {
|
|
3791
|
+
try {
|
|
3792
|
+
return getDatabuddySender(logger2);
|
|
3793
|
+
} catch {
|
|
3794
|
+
return null;
|
|
3795
|
+
}
|
|
3796
|
+
}
|
|
3454
3797
|
function getSentrySender(logger2) {
|
|
3455
3798
|
return getLoggerFactory(logger2).sentry;
|
|
3456
3799
|
}
|
|
@@ -3510,6 +3853,18 @@ function maybeSendToBetterStack(betterstack, record) {
|
|
|
3510
3853
|
}
|
|
3511
3854
|
betterstack.send(record, { source: "server", warnIfUnavailable: true });
|
|
3512
3855
|
}
|
|
3856
|
+
function maybeSendToDatabuddy(databuddy, record) {
|
|
3857
|
+
if (isClientLogRecord(record)) {
|
|
3858
|
+
return;
|
|
3859
|
+
}
|
|
3860
|
+
if (!databuddy.shouldAutoForwardServerLogs()) {
|
|
3861
|
+
if (databuddy.enabled && !databuddy.ready) {
|
|
3862
|
+
databuddy.send(record, { source: "server", warnIfUnavailable: true });
|
|
3863
|
+
}
|
|
3864
|
+
return;
|
|
3865
|
+
}
|
|
3866
|
+
databuddy.send(record, { source: "server", warnIfUnavailable: true });
|
|
3867
|
+
}
|
|
3513
3868
|
function maybeSendToSentry(sentry, record) {
|
|
3514
3869
|
if (isClientLogRecord(record)) {
|
|
3515
3870
|
return;
|
|
@@ -3530,7 +3885,7 @@ function maybeSendToOTLP(otlp, record) {
|
|
|
3530
3885
|
sender.send(record, { source: "server", warnIfUnavailable: true });
|
|
3531
3886
|
}
|
|
3532
3887
|
}
|
|
3533
|
-
function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry, otlp, bindings = {}, source = "root") {
|
|
3888
|
+
function createLoggerInstance(rootRawLogger, sink, betterstack, databuddy, posthog, sentry, otlp, bindings = {}, source = "root") {
|
|
3534
3889
|
const rawLogger = Object.keys(bindings).length > 0 ? rootRawLogger.child(bindings) : rootRawLogger;
|
|
3535
3890
|
const writeRecord = (level, message, args, writeSource = source) => {
|
|
3536
3891
|
if (writeSource === "root" && shouldDropRootLogWrite()) {
|
|
@@ -3556,6 +3911,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3556
3911
|
);
|
|
3557
3912
|
sink.write(record);
|
|
3558
3913
|
maybeSendToBetterStack(betterstack, record);
|
|
3914
|
+
maybeSendToDatabuddy(databuddy, record);
|
|
3559
3915
|
maybeSendToPostHog(posthog, record);
|
|
3560
3916
|
maybeSendToSentry(sentry, record);
|
|
3561
3917
|
maybeSendToOTLP(otlp, record);
|
|
@@ -3579,6 +3935,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3579
3935
|
sink.write(record);
|
|
3580
3936
|
}
|
|
3581
3937
|
maybeSendToBetterStack(betterstack, record);
|
|
3938
|
+
maybeSendToDatabuddy(databuddy, record);
|
|
3582
3939
|
maybeSendToPostHog(posthog, record);
|
|
3583
3940
|
maybeSendToSentry(sentry, record);
|
|
3584
3941
|
maybeSendToOTLP(otlp, record);
|
|
@@ -3612,8 +3969,26 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3612
3969
|
}
|
|
3613
3970
|
writeRecord("table", message, data === void 0 ? [] : [data]);
|
|
3614
3971
|
},
|
|
3615
|
-
flush: () =>
|
|
3616
|
-
|
|
3972
|
+
flush: async () => {
|
|
3973
|
+
await sink.flush();
|
|
3974
|
+
await Promise.allSettled([
|
|
3975
|
+
betterstack.flush(),
|
|
3976
|
+
databuddy.flush(),
|
|
3977
|
+
posthog.flush(),
|
|
3978
|
+
sentry.flush(),
|
|
3979
|
+
otlp.flush()
|
|
3980
|
+
]);
|
|
3981
|
+
},
|
|
3982
|
+
shutdown: async () => {
|
|
3983
|
+
await sink.shutdown();
|
|
3984
|
+
await Promise.allSettled([
|
|
3985
|
+
betterstack.flush(),
|
|
3986
|
+
databuddy.flush(),
|
|
3987
|
+
posthog.flush(),
|
|
3988
|
+
sentry.flush(),
|
|
3989
|
+
otlp.flush()
|
|
3990
|
+
]);
|
|
3991
|
+
},
|
|
3617
3992
|
createStructuredLog: (groupId, initial) => {
|
|
3618
3993
|
return createStructuredLogForLogger(logger2, groupId, {
|
|
3619
3994
|
initialFields: initial
|
|
@@ -3625,6 +4000,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3625
4000
|
rootRawLogger,
|
|
3626
4001
|
sink,
|
|
3627
4002
|
betterstack,
|
|
4003
|
+
databuddy,
|
|
3628
4004
|
posthog,
|
|
3629
4005
|
sentry,
|
|
3630
4006
|
otlp,
|
|
@@ -3635,6 +4011,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3635
4011
|
[LOGGER_FACTORY]: {
|
|
3636
4012
|
bindings,
|
|
3637
4013
|
betterstack,
|
|
4014
|
+
databuddy,
|
|
3638
4015
|
posthog,
|
|
3639
4016
|
sentry,
|
|
3640
4017
|
otlp,
|
|
@@ -3644,6 +4021,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3644
4021
|
rootRawLogger,
|
|
3645
4022
|
sink,
|
|
3646
4023
|
betterstack,
|
|
4024
|
+
databuddy,
|
|
3647
4025
|
posthog,
|
|
3648
4026
|
sentry,
|
|
3649
4027
|
otlp,
|
|
@@ -3667,6 +4045,7 @@ function createBaseLogger(config) {
|
|
|
3667
4045
|
const rawLogger = createPinoLogger(resolvedConfig);
|
|
3668
4046
|
const sink = createPrimarySink(resolvedConfig);
|
|
3669
4047
|
const betterstack = createBetterStackSender(resolvedConfig);
|
|
4048
|
+
const databuddy = createDatabuddySender(resolvedConfig);
|
|
3670
4049
|
const posthog = createPostHogSender(resolvedConfig);
|
|
3671
4050
|
const sentry = createSentrySender(resolvedConfig);
|
|
3672
4051
|
const otlp = createOTLPRegistry(resolvedConfig);
|
|
@@ -3674,6 +4053,7 @@ function createBaseLogger(config) {
|
|
|
3674
4053
|
rawLogger,
|
|
3675
4054
|
sink,
|
|
3676
4055
|
betterstack,
|
|
4056
|
+
databuddy,
|
|
3677
4057
|
posthog,
|
|
3678
4058
|
sentry,
|
|
3679
4059
|
otlp
|
|
@@ -3756,6 +4136,7 @@ function resolveServerLogger(config = {}, loggerOverride) {
|
|
|
3756
4136
|
return {
|
|
3757
4137
|
logger: logger2,
|
|
3758
4138
|
betterstack: getBetterStackSender(logger2),
|
|
4139
|
+
databuddy: getDatabuddySender(logger2),
|
|
3759
4140
|
posthog: getPostHogSender(logger2),
|
|
3760
4141
|
sentry: getSentrySender(logger2),
|
|
3761
4142
|
otlp: getOtlpRegistry(logger2),
|
|
@@ -3875,6 +4256,22 @@ function emitHttpErrorLog(logger2, level, request, path3, statusCode, responseTi
|
|
|
3875
4256
|
}
|
|
3876
4257
|
});
|
|
3877
4258
|
}
|
|
4259
|
+
const databuddy = tryGetDatabuddySender(logger2);
|
|
4260
|
+
if (databuddy?.shouldAutoCaptureExceptions()) {
|
|
4261
|
+
databuddy.captureException(captureContext.error ?? error ?? message, {
|
|
4262
|
+
source: "server",
|
|
4263
|
+
warnIfUnavailable: true,
|
|
4264
|
+
properties: {
|
|
4265
|
+
method: request.method,
|
|
4266
|
+
path: path3,
|
|
4267
|
+
status_code: statusCode,
|
|
4268
|
+
...request.url ? { current_url: request.url } : {},
|
|
4269
|
+
...getHeaderValue(request.headers, "user-agent") ? { user_agent: getHeaderValue(request.headers, "user-agent") } : {},
|
|
4270
|
+
...errorLogData.ip ? { ip: errorLogData.ip } : {},
|
|
4271
|
+
payload: errorLogData
|
|
4272
|
+
}
|
|
4273
|
+
});
|
|
4274
|
+
}
|
|
3878
4275
|
return errorLogData;
|
|
3879
4276
|
}
|
|
3880
4277
|
async function parseClientLogPayload(request, body) {
|
|
@@ -3966,6 +4363,34 @@ async function handleClientLogIngestion(options) {
|
|
|
3966
4363
|
});
|
|
3967
4364
|
}
|
|
3968
4365
|
}
|
|
4366
|
+
} else if (payload.connector === "databuddy") {
|
|
4367
|
+
headers["x-blyp-databuddy-status"] = config.databuddy.ready ? "enabled" : "missing";
|
|
4368
|
+
if (config.databuddy.ready) {
|
|
4369
|
+
const forwardedRecord = {
|
|
4370
|
+
timestamp: structuredPayload.receivedAt,
|
|
4371
|
+
level: payload.level,
|
|
4372
|
+
message: `[client] ${payload.message}`,
|
|
4373
|
+
data: structuredPayload
|
|
4374
|
+
};
|
|
4375
|
+
config.databuddy.send(forwardedRecord, {
|
|
4376
|
+
source: "client"
|
|
4377
|
+
});
|
|
4378
|
+
if ((payload.level === "error" || payload.level === "critical") && config.databuddy.shouldAutoCaptureExceptions()) {
|
|
4379
|
+
const clientErrorCandidate = payload.data && typeof payload.data === "object" && !Array.isArray(payload.data) && typeof payload.data.message === "string" ? payload.data : payload.message;
|
|
4380
|
+
config.databuddy.captureException(clientErrorCandidate, {
|
|
4381
|
+
source: "client",
|
|
4382
|
+
warnIfUnavailable: true,
|
|
4383
|
+
sessionId: payload.session.sessionId,
|
|
4384
|
+
properties: {
|
|
4385
|
+
page_url: payload.page.url,
|
|
4386
|
+
page_path: payload.page.pathname,
|
|
4387
|
+
client_runtime: payload.device?.runtime,
|
|
4388
|
+
metadata: payload.metadata,
|
|
4389
|
+
payload: structuredPayload
|
|
4390
|
+
}
|
|
4391
|
+
});
|
|
4392
|
+
}
|
|
4393
|
+
}
|
|
3969
4394
|
} else if (payload.connector === "posthog") {
|
|
3970
4395
|
headers["x-blyp-posthog-status"] = config.posthog.ready ? "enabled" : "missing";
|
|
3971
4396
|
if (config.posthog.ready) {
|