@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.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)
|
|
@@ -2553,12 +2578,320 @@ function createBetterStackSender(config) {
|
|
|
2553
2578
|
};
|
|
2554
2579
|
}
|
|
2555
2580
|
var warnedKeys4 = /* @__PURE__ */ new Set();
|
|
2581
|
+
var senderCache = /* @__PURE__ */ new Map();
|
|
2556
2582
|
var testHooks3 = {};
|
|
2557
2583
|
var warnOnce5 = createErrorOnceLogger(warnedKeys4);
|
|
2558
|
-
function
|
|
2559
|
-
|
|
2584
|
+
function registerShutdownHooks3(key, shutdown) {
|
|
2585
|
+
const handlers = ["beforeExit", "SIGINT", "SIGTERM"];
|
|
2586
|
+
for (const event of handlers) {
|
|
2587
|
+
process.once(event, () => {
|
|
2588
|
+
void shutdown().catch((error) => {
|
|
2589
|
+
warnOnce5(
|
|
2590
|
+
`${key}:shutdown`,
|
|
2591
|
+
"[Blyp] Failed to flush Databuddy telemetry during shutdown.",
|
|
2592
|
+
error
|
|
2593
|
+
);
|
|
2594
|
+
});
|
|
2595
|
+
});
|
|
2596
|
+
}
|
|
2560
2597
|
}
|
|
2561
2598
|
function resolveConnectorConfig3(config) {
|
|
2599
|
+
const connector = isBlypConfig(config) ? config.connectors?.databuddy : config;
|
|
2600
|
+
const enabled = connector?.enabled ?? false;
|
|
2601
|
+
const apiKey = connector?.apiKey;
|
|
2602
|
+
const websiteId = connector?.websiteId;
|
|
2603
|
+
const ready = enabled && hasNonEmptyString(apiKey) && hasNonEmptyString(websiteId);
|
|
2604
|
+
return {
|
|
2605
|
+
enabled,
|
|
2606
|
+
mode: connector?.mode ?? "auto",
|
|
2607
|
+
apiKey,
|
|
2608
|
+
websiteId,
|
|
2609
|
+
namespace: connector?.namespace,
|
|
2610
|
+
source: connector?.source,
|
|
2611
|
+
apiUrl: connector?.apiUrl,
|
|
2612
|
+
debug: connector?.debug ?? false,
|
|
2613
|
+
enableBatching: connector?.enableBatching ?? true,
|
|
2614
|
+
batchSize: connector?.batchSize,
|
|
2615
|
+
batchTimeout: connector?.batchTimeout,
|
|
2616
|
+
maxQueueSize: connector?.maxQueueSize,
|
|
2617
|
+
ready,
|
|
2618
|
+
status: ready ? "enabled" : "missing"
|
|
2619
|
+
};
|
|
2620
|
+
}
|
|
2621
|
+
function createDefaultClient2(connector) {
|
|
2622
|
+
return new node$1.Databuddy({
|
|
2623
|
+
apiKey: connector.apiKey ?? "",
|
|
2624
|
+
...connector.websiteId ? { websiteId: connector.websiteId } : {},
|
|
2625
|
+
...connector.namespace ? { namespace: connector.namespace } : {},
|
|
2626
|
+
...connector.source ? { source: connector.source } : {},
|
|
2627
|
+
...connector.apiUrl ? { apiUrl: connector.apiUrl } : {},
|
|
2628
|
+
debug: connector.debug,
|
|
2629
|
+
enableBatching: connector.enableBatching,
|
|
2630
|
+
...connector.batchSize !== void 0 ? { batchSize: connector.batchSize } : {},
|
|
2631
|
+
...connector.batchTimeout !== void 0 ? { batchTimeout: connector.batchTimeout } : {},
|
|
2632
|
+
...connector.maxQueueSize !== void 0 ? { maxQueueSize: connector.maxQueueSize } : {}
|
|
2633
|
+
});
|
|
2634
|
+
}
|
|
2635
|
+
function getDatabuddySenderKey(connector) {
|
|
2636
|
+
return JSON.stringify({
|
|
2637
|
+
enabled: connector.enabled,
|
|
2638
|
+
mode: connector.mode,
|
|
2639
|
+
apiKey: connector.apiKey ?? null,
|
|
2640
|
+
websiteId: connector.websiteId ?? null,
|
|
2641
|
+
namespace: connector.namespace ?? null,
|
|
2642
|
+
source: connector.source ?? null,
|
|
2643
|
+
apiUrl: connector.apiUrl ?? null,
|
|
2644
|
+
debug: connector.debug,
|
|
2645
|
+
enableBatching: connector.enableBatching,
|
|
2646
|
+
batchSize: connector.batchSize ?? null,
|
|
2647
|
+
batchTimeout: connector.batchTimeout ?? null,
|
|
2648
|
+
maxQueueSize: connector.maxQueueSize ?? null
|
|
2649
|
+
});
|
|
2650
|
+
}
|
|
2651
|
+
function getSessionId(record) {
|
|
2652
|
+
const direct = getField(record, "sessionId");
|
|
2653
|
+
if (hasNonEmptyString(direct)) {
|
|
2654
|
+
return direct;
|
|
2655
|
+
}
|
|
2656
|
+
return getClientSessionField(record, "sessionId");
|
|
2657
|
+
}
|
|
2658
|
+
function getAnonymousId(record) {
|
|
2659
|
+
const direct = getField(record, "anonymousId");
|
|
2660
|
+
if (hasNonEmptyString(direct)) {
|
|
2661
|
+
return direct;
|
|
2662
|
+
}
|
|
2663
|
+
const payload = getPrimaryPayload(record);
|
|
2664
|
+
if (isPlainObject(payload.metadata) && hasNonEmptyString(payload.metadata.databuddyAnonymousId)) {
|
|
2665
|
+
return payload.metadata.databuddyAnonymousId;
|
|
2666
|
+
}
|
|
2667
|
+
return void 0;
|
|
2668
|
+
}
|
|
2669
|
+
function getDatabuddyEventName(record) {
|
|
2670
|
+
const recordType = getRecordType(record);
|
|
2671
|
+
if (hasNonEmptyString(recordType)) {
|
|
2672
|
+
return recordType;
|
|
2673
|
+
}
|
|
2674
|
+
return "log";
|
|
2675
|
+
}
|
|
2676
|
+
function buildRecordProperties(record, source) {
|
|
2677
|
+
const properties = {
|
|
2678
|
+
blyp_level: record.level,
|
|
2679
|
+
blyp_source: source,
|
|
2680
|
+
blyp_payload: serializeLogRecord(record),
|
|
2681
|
+
message: typeof record.message === "string" ? record.message : String(record.message)
|
|
2682
|
+
};
|
|
2683
|
+
const caller = typeof record.caller === "string" ? record.caller : void 0;
|
|
2684
|
+
const groupId = getField(record, "groupId");
|
|
2685
|
+
const method = getField(record, "method");
|
|
2686
|
+
const path3 = getField(record, "path");
|
|
2687
|
+
const status = getField(record, "status");
|
|
2688
|
+
const duration = getField(record, "duration");
|
|
2689
|
+
const pagePath = getClientPageField(record, "pathname");
|
|
2690
|
+
const pageUrl = getClientPageField(record, "url");
|
|
2691
|
+
const sessionId = getClientSessionField(record, "sessionId");
|
|
2692
|
+
const pageId = getClientSessionField(record, "pageId");
|
|
2693
|
+
const ifTruthy = [
|
|
2694
|
+
["blyp_type", getRecordType(record)],
|
|
2695
|
+
["caller", caller],
|
|
2696
|
+
["group_id", groupId],
|
|
2697
|
+
["method", method],
|
|
2698
|
+
["path", path3],
|
|
2699
|
+
["page_path", pagePath],
|
|
2700
|
+
["page_url", pageUrl],
|
|
2701
|
+
["session_id", sessionId],
|
|
2702
|
+
["page_id", pageId]
|
|
2703
|
+
];
|
|
2704
|
+
const ifDefined = [
|
|
2705
|
+
["status_code", status],
|
|
2706
|
+
["duration_ms", duration]
|
|
2707
|
+
];
|
|
2708
|
+
for (const [key, value] of ifTruthy) {
|
|
2709
|
+
if (value) {
|
|
2710
|
+
properties[key] = value;
|
|
2711
|
+
}
|
|
2712
|
+
}
|
|
2713
|
+
for (const [key, value] of ifDefined) {
|
|
2714
|
+
if (value !== void 0) {
|
|
2715
|
+
properties[key] = value;
|
|
2716
|
+
}
|
|
2717
|
+
}
|
|
2718
|
+
return properties;
|
|
2719
|
+
}
|
|
2720
|
+
function createTrackEvent(record, source) {
|
|
2721
|
+
return {
|
|
2722
|
+
name: getDatabuddyEventName(record),
|
|
2723
|
+
anonymousId: getAnonymousId(record),
|
|
2724
|
+
sessionId: getSessionId(record),
|
|
2725
|
+
properties: buildRecordProperties(record, source)
|
|
2726
|
+
};
|
|
2727
|
+
}
|
|
2728
|
+
function normalizeExceptionProperties2(value) {
|
|
2729
|
+
if (!isPlainObject(value)) {
|
|
2730
|
+
return {};
|
|
2731
|
+
}
|
|
2732
|
+
return normalizeLogValue(value);
|
|
2733
|
+
}
|
|
2734
|
+
function normalizeExceptionInput3(value, fallbackMessage) {
|
|
2735
|
+
if (value instanceof Error) {
|
|
2736
|
+
return {
|
|
2737
|
+
message: value.message || fallbackMessage,
|
|
2738
|
+
properties: {
|
|
2739
|
+
error_type: value.name,
|
|
2740
|
+
...value.stack ? { stack: value.stack } : {},
|
|
2741
|
+
...normalizeExceptionProperties2(value)
|
|
2742
|
+
}
|
|
2743
|
+
};
|
|
2744
|
+
}
|
|
2745
|
+
if (isPlainObject(value)) {
|
|
2746
|
+
const message = hasNonEmptyString(value.message) ? value.message : hasNonEmptyString(value.error) ? value.error : fallbackMessage;
|
|
2747
|
+
return {
|
|
2748
|
+
message,
|
|
2749
|
+
properties: normalizeExceptionProperties2(value)
|
|
2750
|
+
};
|
|
2751
|
+
}
|
|
2752
|
+
if (typeof value === "string") {
|
|
2753
|
+
return {
|
|
2754
|
+
message: value,
|
|
2755
|
+
properties: {
|
|
2756
|
+
message: value
|
|
2757
|
+
}
|
|
2758
|
+
};
|
|
2759
|
+
}
|
|
2760
|
+
return {
|
|
2761
|
+
message: fallbackMessage,
|
|
2762
|
+
properties: {
|
|
2763
|
+
value: normalizeLogValue(value)
|
|
2764
|
+
}
|
|
2765
|
+
};
|
|
2766
|
+
}
|
|
2767
|
+
function createDatabuddySender(config) {
|
|
2768
|
+
const connector = resolveConnectorConfig3(config);
|
|
2769
|
+
const senderKey = getDatabuddySenderKey(connector);
|
|
2770
|
+
const cached = senderCache.get(senderKey);
|
|
2771
|
+
if (cached) {
|
|
2772
|
+
return cached;
|
|
2773
|
+
}
|
|
2774
|
+
const key = `${connector.apiUrl ?? "default"}:${connector.mode}:${connector.apiKey ?? "missing"}`;
|
|
2775
|
+
const client = connector.ready ? testHooks3.createClient?.(connector) ?? createDefaultClient2(connector) : void 0;
|
|
2776
|
+
if (client) {
|
|
2777
|
+
registerShutdownHooks3(key, async () => {
|
|
2778
|
+
await client.flush();
|
|
2779
|
+
});
|
|
2780
|
+
}
|
|
2781
|
+
const emitUnavailableWarning = () => {
|
|
2782
|
+
warnOnce5(
|
|
2783
|
+
`databuddy-unavailable:${key}`,
|
|
2784
|
+
"[Blyp] Databuddy connector is not configured. Databuddy requires both apiKey and websiteId. Skipping Databuddy delivery."
|
|
2785
|
+
);
|
|
2786
|
+
};
|
|
2787
|
+
const emitExceptionUnavailableWarning = () => {
|
|
2788
|
+
warnOnce5(
|
|
2789
|
+
`databuddy-exception-unavailable:${key}`,
|
|
2790
|
+
"[Blyp] Databuddy error tracking is not configured. Databuddy requires both apiKey and websiteId. Skipping Databuddy exception capture."
|
|
2791
|
+
);
|
|
2792
|
+
};
|
|
2793
|
+
const sender = {
|
|
2794
|
+
enabled: connector.enabled,
|
|
2795
|
+
ready: connector.ready,
|
|
2796
|
+
mode: connector.mode,
|
|
2797
|
+
status: connector.status,
|
|
2798
|
+
shouldAutoForwardServerLogs() {
|
|
2799
|
+
return connector.ready && connector.mode === "auto";
|
|
2800
|
+
},
|
|
2801
|
+
shouldAutoCaptureExceptions() {
|
|
2802
|
+
return connector.ready && connector.mode === "auto";
|
|
2803
|
+
},
|
|
2804
|
+
send(record, options = {}) {
|
|
2805
|
+
if (!connector.ready || !client) {
|
|
2806
|
+
if (options.warnIfUnavailable) {
|
|
2807
|
+
emitUnavailableWarning();
|
|
2808
|
+
}
|
|
2809
|
+
return;
|
|
2810
|
+
}
|
|
2811
|
+
try {
|
|
2812
|
+
const result = client.track(createTrackEvent(record, options.source ?? "server"));
|
|
2813
|
+
if (result && typeof result.catch === "function") {
|
|
2814
|
+
void result.catch((error) => {
|
|
2815
|
+
warnOnce5(
|
|
2816
|
+
`databuddy-send:${key}`,
|
|
2817
|
+
"[Blyp] Failed to deliver log to Databuddy.",
|
|
2818
|
+
error
|
|
2819
|
+
);
|
|
2820
|
+
});
|
|
2821
|
+
}
|
|
2822
|
+
} catch (error) {
|
|
2823
|
+
warnOnce5(
|
|
2824
|
+
`databuddy-send:${key}`,
|
|
2825
|
+
"[Blyp] Failed to deliver log to Databuddy.",
|
|
2826
|
+
error
|
|
2827
|
+
);
|
|
2828
|
+
}
|
|
2829
|
+
},
|
|
2830
|
+
captureException(error, options = {}) {
|
|
2831
|
+
if (!connector.ready || !client) {
|
|
2832
|
+
if (options.warnIfUnavailable) {
|
|
2833
|
+
emitExceptionUnavailableWarning();
|
|
2834
|
+
}
|
|
2835
|
+
return;
|
|
2836
|
+
}
|
|
2837
|
+
const normalized = normalizeExceptionInput3(
|
|
2838
|
+
error,
|
|
2839
|
+
options.source === "client" ? "Client error" : "Server error"
|
|
2840
|
+
);
|
|
2841
|
+
try {
|
|
2842
|
+
const result = client.track({
|
|
2843
|
+
name: "error",
|
|
2844
|
+
anonymousId: options.anonymousId,
|
|
2845
|
+
sessionId: options.sessionId,
|
|
2846
|
+
properties: {
|
|
2847
|
+
message: normalized.message,
|
|
2848
|
+
blyp_source: options.source ?? "server",
|
|
2849
|
+
blyp_level: "error",
|
|
2850
|
+
...normalized.properties,
|
|
2851
|
+
...options.properties ?? {}
|
|
2852
|
+
}
|
|
2853
|
+
});
|
|
2854
|
+
if (result && typeof result.catch === "function") {
|
|
2855
|
+
void result.catch((captureError) => {
|
|
2856
|
+
warnOnce5(
|
|
2857
|
+
`databuddy-capture:${key}`,
|
|
2858
|
+
"[Blyp] Failed to capture exception in Databuddy.",
|
|
2859
|
+
captureError
|
|
2860
|
+
);
|
|
2861
|
+
});
|
|
2862
|
+
}
|
|
2863
|
+
} catch (captureError) {
|
|
2864
|
+
warnOnce5(
|
|
2865
|
+
`databuddy-capture:${key}`,
|
|
2866
|
+
"[Blyp] Failed to capture exception in Databuddy.",
|
|
2867
|
+
captureError
|
|
2868
|
+
);
|
|
2869
|
+
}
|
|
2870
|
+
},
|
|
2871
|
+
async flush() {
|
|
2872
|
+
try {
|
|
2873
|
+
if (client) {
|
|
2874
|
+
await client.flush();
|
|
2875
|
+
}
|
|
2876
|
+
} catch (error) {
|
|
2877
|
+
warnOnce5(
|
|
2878
|
+
`databuddy-flush:${key}`,
|
|
2879
|
+
"[Blyp] Failed to flush Databuddy telemetry.",
|
|
2880
|
+
error
|
|
2881
|
+
);
|
|
2882
|
+
}
|
|
2883
|
+
}
|
|
2884
|
+
};
|
|
2885
|
+
senderCache.set(senderKey, sender);
|
|
2886
|
+
return sender;
|
|
2887
|
+
}
|
|
2888
|
+
var warnedKeys5 = /* @__PURE__ */ new Set();
|
|
2889
|
+
var testHooks4 = {};
|
|
2890
|
+
var warnOnce6 = createErrorOnceLogger(warnedKeys5);
|
|
2891
|
+
function getSentryModule2() {
|
|
2892
|
+
return testHooks4.module ?? Sentry__namespace;
|
|
2893
|
+
}
|
|
2894
|
+
function resolveConnectorConfig4(config) {
|
|
2562
2895
|
const connector = isBlypConfig(config) ? config.connectors?.sentry : config;
|
|
2563
2896
|
const enabled = connector?.enabled ?? false;
|
|
2564
2897
|
const dsn = connector?.dsn;
|
|
@@ -2703,7 +3036,7 @@ function hasConfigMismatch(connector, client) {
|
|
|
2703
3036
|
return hasNonEmptyString(connector.dsn) && connector.dsn !== options.dsn || hasNonEmptyString(connector.environment) && connector.environment !== options.environment || hasNonEmptyString(connector.release) && connector.release !== options.release;
|
|
2704
3037
|
}
|
|
2705
3038
|
function createSentrySender(config) {
|
|
2706
|
-
const connector =
|
|
3039
|
+
const connector = resolveConnectorConfig4(config);
|
|
2707
3040
|
const key = `${connector.mode}:${connector.dsn ?? "missing"}`;
|
|
2708
3041
|
const module = getSentryModule2();
|
|
2709
3042
|
let client = connector.enabled ? module.getClient() : void 0;
|
|
@@ -2717,7 +3050,7 @@ function createSentrySender(config) {
|
|
|
2717
3050
|
});
|
|
2718
3051
|
client = module.getClient();
|
|
2719
3052
|
} catch (error) {
|
|
2720
|
-
|
|
3053
|
+
warnOnce6(
|
|
2721
3054
|
`sentry-init:${key}`,
|
|
2722
3055
|
"[Blyp] Failed to initialize Sentry. Skipping Sentry delivery.",
|
|
2723
3056
|
error
|
|
@@ -2725,14 +3058,14 @@ function createSentrySender(config) {
|
|
|
2725
3058
|
}
|
|
2726
3059
|
}
|
|
2727
3060
|
if (client && hasConfigMismatch(connector, client)) {
|
|
2728
|
-
|
|
3061
|
+
warnOnce6(
|
|
2729
3062
|
`sentry-mismatch:${key}`,
|
|
2730
3063
|
"[Blyp] Sentry is already initialized with different options. Reusing the existing Sentry client."
|
|
2731
3064
|
);
|
|
2732
3065
|
}
|
|
2733
3066
|
const ready = connector.enabled && client !== void 0;
|
|
2734
3067
|
const emitUnavailableWarning = () => {
|
|
2735
|
-
|
|
3068
|
+
warnOnce6(
|
|
2736
3069
|
`sentry-unavailable:${key}`,
|
|
2737
3070
|
"[Blyp] Sentry connector is not configured. Skipping Sentry delivery."
|
|
2738
3071
|
);
|
|
@@ -2758,7 +3091,7 @@ function createSentrySender(config) {
|
|
|
2758
3091
|
try {
|
|
2759
3092
|
logMethod(record.message, attributes);
|
|
2760
3093
|
} catch (error) {
|
|
2761
|
-
|
|
3094
|
+
warnOnce6(
|
|
2762
3095
|
`sentry-log:${key}`,
|
|
2763
3096
|
"[Blyp] Failed to deliver log to Sentry.",
|
|
2764
3097
|
error
|
|
@@ -2776,7 +3109,7 @@ function createSentrySender(config) {
|
|
|
2776
3109
|
module.captureException(exception);
|
|
2777
3110
|
});
|
|
2778
3111
|
} catch (error) {
|
|
2779
|
-
|
|
3112
|
+
warnOnce6(
|
|
2780
3113
|
`sentry-exception:${key}`,
|
|
2781
3114
|
"[Blyp] Failed to capture exception in Sentry.",
|
|
2782
3115
|
error
|
|
@@ -2787,7 +3120,7 @@ function createSentrySender(config) {
|
|
|
2787
3120
|
try {
|
|
2788
3121
|
await module.flush(2e3);
|
|
2789
3122
|
} catch (error) {
|
|
2790
|
-
|
|
3123
|
+
warnOnce6(
|
|
2791
3124
|
`sentry-flush:${key}`,
|
|
2792
3125
|
"[Blyp] Failed to flush Sentry logs.",
|
|
2793
3126
|
error
|
|
@@ -2796,9 +3129,9 @@ function createSentrySender(config) {
|
|
|
2796
3129
|
}
|
|
2797
3130
|
};
|
|
2798
3131
|
}
|
|
2799
|
-
var
|
|
2800
|
-
var
|
|
2801
|
-
var
|
|
3132
|
+
var warnedKeys6 = /* @__PURE__ */ new Set();
|
|
3133
|
+
var testHooks5 = {};
|
|
3134
|
+
var warnOnce7 = createErrorOnceLogger(warnedKeys6);
|
|
2802
3135
|
function normalizeOTLPRecord(record, connector, source = "server") {
|
|
2803
3136
|
const severity = resolveSeverity2(record.level);
|
|
2804
3137
|
const body = typeof record.message === "string" ? record.message : String(record.message);
|
|
@@ -2863,14 +3196,14 @@ function resolveSeverity2(level) {
|
|
|
2863
3196
|
return { text: "info", number: apiLogs.SeverityNumber.INFO };
|
|
2864
3197
|
}
|
|
2865
3198
|
}
|
|
2866
|
-
function
|
|
3199
|
+
function registerShutdownHooks4(key, shutdown) {
|
|
2867
3200
|
const handlers = ["beforeExit", "SIGINT", "SIGTERM"];
|
|
2868
3201
|
for (const event of handlers) {
|
|
2869
3202
|
process.once(event, async () => {
|
|
2870
3203
|
try {
|
|
2871
3204
|
await shutdown();
|
|
2872
3205
|
} catch (error) {
|
|
2873
|
-
|
|
3206
|
+
warnOnce7(
|
|
2874
3207
|
`${key}:shutdown`,
|
|
2875
3208
|
"[Blyp] Failed to flush OTLP logs during shutdown.",
|
|
2876
3209
|
error
|
|
@@ -2947,7 +3280,7 @@ function createUnavailableSender(name, connector) {
|
|
|
2947
3280
|
const senderName = name || connector?.name || "otlp";
|
|
2948
3281
|
const key = `${senderName}:${connector?.serviceName ?? "blyp-app"}:${connector?.endpoint ?? "missing"}`;
|
|
2949
3282
|
const emitUnavailableWarning = () => {
|
|
2950
|
-
|
|
3283
|
+
warnOnce7(
|
|
2951
3284
|
`otlp-unavailable:${key}`,
|
|
2952
3285
|
`[Blyp] OTLP target "${senderName}" is not configured or not ready. Skipping OTLP delivery.`
|
|
2953
3286
|
);
|
|
@@ -2978,7 +3311,7 @@ function createSender(connector) {
|
|
|
2978
3311
|
...connector,
|
|
2979
3312
|
headers: resolveTransportHeaders(connector)
|
|
2980
3313
|
};
|
|
2981
|
-
const transport =
|
|
3314
|
+
const transport = testHooks5.createTransport?.(transportConnector) ?? createDefaultTransport2(transportConnector);
|
|
2982
3315
|
return {
|
|
2983
3316
|
name: connector.name,
|
|
2984
3317
|
enabled: connector.enabled,
|
|
@@ -2994,7 +3327,7 @@ function createSender(connector) {
|
|
|
2994
3327
|
const result = transport.emit(normalized);
|
|
2995
3328
|
if (result && typeof result.catch === "function") {
|
|
2996
3329
|
void result.catch((error) => {
|
|
2997
|
-
|
|
3330
|
+
warnOnce7(
|
|
2998
3331
|
`otlp-emit:${key}`,
|
|
2999
3332
|
`[Blyp] Failed to deliver log to OTLP target "${connector.name}".`,
|
|
3000
3333
|
error
|
|
@@ -3002,7 +3335,7 @@ function createSender(connector) {
|
|
|
3002
3335
|
});
|
|
3003
3336
|
}
|
|
3004
3337
|
} catch (error) {
|
|
3005
|
-
|
|
3338
|
+
warnOnce7(
|
|
3006
3339
|
`otlp-emit:${key}`,
|
|
3007
3340
|
`[Blyp] Failed to deliver log to OTLP target "${connector.name}".`,
|
|
3008
3341
|
error
|
|
@@ -3015,7 +3348,7 @@ function createSender(connector) {
|
|
|
3015
3348
|
await transport.flush();
|
|
3016
3349
|
}
|
|
3017
3350
|
} catch (error) {
|
|
3018
|
-
|
|
3351
|
+
warnOnce7(
|
|
3019
3352
|
`otlp-flush:${key}`,
|
|
3020
3353
|
`[Blyp] Failed to flush OTLP logs for target "${connector.name}".`,
|
|
3021
3354
|
error
|
|
@@ -3044,7 +3377,7 @@ function createOTLPRegistry(config) {
|
|
|
3044
3377
|
await Promise.all(Array.from(senders.values()).map((sender) => sender.flush()));
|
|
3045
3378
|
}
|
|
3046
3379
|
};
|
|
3047
|
-
|
|
3380
|
+
registerShutdownHooks4("otlp-registry", () => registry.flush());
|
|
3048
3381
|
return registry;
|
|
3049
3382
|
}
|
|
3050
3383
|
var _RuntimeDetector = class _RuntimeDetector {
|
|
@@ -3435,6 +3768,9 @@ function getPostHogSender(logger2) {
|
|
|
3435
3768
|
function getBetterStackSender(logger2) {
|
|
3436
3769
|
return getLoggerFactory(logger2).betterstack;
|
|
3437
3770
|
}
|
|
3771
|
+
function getDatabuddySender(logger2) {
|
|
3772
|
+
return getLoggerFactory(logger2).databuddy;
|
|
3773
|
+
}
|
|
3438
3774
|
function tryGetPostHogSender(logger2) {
|
|
3439
3775
|
try {
|
|
3440
3776
|
return getPostHogSender(logger2);
|
|
@@ -3449,6 +3785,13 @@ function tryGetBetterStackSender(logger2) {
|
|
|
3449
3785
|
return null;
|
|
3450
3786
|
}
|
|
3451
3787
|
}
|
|
3788
|
+
function tryGetDatabuddySender(logger2) {
|
|
3789
|
+
try {
|
|
3790
|
+
return getDatabuddySender(logger2);
|
|
3791
|
+
} catch {
|
|
3792
|
+
return null;
|
|
3793
|
+
}
|
|
3794
|
+
}
|
|
3452
3795
|
function getSentrySender(logger2) {
|
|
3453
3796
|
return getLoggerFactory(logger2).sentry;
|
|
3454
3797
|
}
|
|
@@ -3508,6 +3851,18 @@ function maybeSendToBetterStack(betterstack, record) {
|
|
|
3508
3851
|
}
|
|
3509
3852
|
betterstack.send(record, { source: "server", warnIfUnavailable: true });
|
|
3510
3853
|
}
|
|
3854
|
+
function maybeSendToDatabuddy(databuddy, record) {
|
|
3855
|
+
if (isClientLogRecord(record)) {
|
|
3856
|
+
return;
|
|
3857
|
+
}
|
|
3858
|
+
if (!databuddy.shouldAutoForwardServerLogs()) {
|
|
3859
|
+
if (databuddy.enabled && !databuddy.ready) {
|
|
3860
|
+
databuddy.send(record, { source: "server", warnIfUnavailable: true });
|
|
3861
|
+
}
|
|
3862
|
+
return;
|
|
3863
|
+
}
|
|
3864
|
+
databuddy.send(record, { source: "server", warnIfUnavailable: true });
|
|
3865
|
+
}
|
|
3511
3866
|
function maybeSendToSentry(sentry, record) {
|
|
3512
3867
|
if (isClientLogRecord(record)) {
|
|
3513
3868
|
return;
|
|
@@ -3528,7 +3883,7 @@ function maybeSendToOTLP(otlp, record) {
|
|
|
3528
3883
|
sender.send(record, { source: "server", warnIfUnavailable: true });
|
|
3529
3884
|
}
|
|
3530
3885
|
}
|
|
3531
|
-
function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry, otlp, bindings = {}, source = "root") {
|
|
3886
|
+
function createLoggerInstance(rootRawLogger, sink, betterstack, databuddy, posthog, sentry, otlp, bindings = {}, source = "root") {
|
|
3532
3887
|
const rawLogger = Object.keys(bindings).length > 0 ? rootRawLogger.child(bindings) : rootRawLogger;
|
|
3533
3888
|
const writeRecord = (level, message, args, writeSource = source) => {
|
|
3534
3889
|
if (writeSource === "root" && shouldDropRootLogWrite()) {
|
|
@@ -3554,6 +3909,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3554
3909
|
);
|
|
3555
3910
|
sink.write(record);
|
|
3556
3911
|
maybeSendToBetterStack(betterstack, record);
|
|
3912
|
+
maybeSendToDatabuddy(databuddy, record);
|
|
3557
3913
|
maybeSendToPostHog(posthog, record);
|
|
3558
3914
|
maybeSendToSentry(sentry, record);
|
|
3559
3915
|
maybeSendToOTLP(otlp, record);
|
|
@@ -3577,6 +3933,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3577
3933
|
sink.write(record);
|
|
3578
3934
|
}
|
|
3579
3935
|
maybeSendToBetterStack(betterstack, record);
|
|
3936
|
+
maybeSendToDatabuddy(databuddy, record);
|
|
3580
3937
|
maybeSendToPostHog(posthog, record);
|
|
3581
3938
|
maybeSendToSentry(sentry, record);
|
|
3582
3939
|
maybeSendToOTLP(otlp, record);
|
|
@@ -3610,8 +3967,26 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3610
3967
|
}
|
|
3611
3968
|
writeRecord("table", message, data === void 0 ? [] : [data]);
|
|
3612
3969
|
},
|
|
3613
|
-
flush: () =>
|
|
3614
|
-
|
|
3970
|
+
flush: async () => {
|
|
3971
|
+
await sink.flush();
|
|
3972
|
+
await Promise.allSettled([
|
|
3973
|
+
betterstack.flush(),
|
|
3974
|
+
databuddy.flush(),
|
|
3975
|
+
posthog.flush(),
|
|
3976
|
+
sentry.flush(),
|
|
3977
|
+
otlp.flush()
|
|
3978
|
+
]);
|
|
3979
|
+
},
|
|
3980
|
+
shutdown: async () => {
|
|
3981
|
+
await sink.shutdown();
|
|
3982
|
+
await Promise.allSettled([
|
|
3983
|
+
betterstack.flush(),
|
|
3984
|
+
databuddy.flush(),
|
|
3985
|
+
posthog.flush(),
|
|
3986
|
+
sentry.flush(),
|
|
3987
|
+
otlp.flush()
|
|
3988
|
+
]);
|
|
3989
|
+
},
|
|
3615
3990
|
createStructuredLog: (groupId, initial) => {
|
|
3616
3991
|
return createStructuredLogForLogger(logger2, groupId, {
|
|
3617
3992
|
initialFields: initial
|
|
@@ -3623,6 +3998,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3623
3998
|
rootRawLogger,
|
|
3624
3999
|
sink,
|
|
3625
4000
|
betterstack,
|
|
4001
|
+
databuddy,
|
|
3626
4002
|
posthog,
|
|
3627
4003
|
sentry,
|
|
3628
4004
|
otlp,
|
|
@@ -3633,6 +4009,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3633
4009
|
[LOGGER_FACTORY]: {
|
|
3634
4010
|
bindings,
|
|
3635
4011
|
betterstack,
|
|
4012
|
+
databuddy,
|
|
3636
4013
|
posthog,
|
|
3637
4014
|
sentry,
|
|
3638
4015
|
otlp,
|
|
@@ -3642,6 +4019,7 @@ function createLoggerInstance(rootRawLogger, sink, betterstack, posthog, sentry,
|
|
|
3642
4019
|
rootRawLogger,
|
|
3643
4020
|
sink,
|
|
3644
4021
|
betterstack,
|
|
4022
|
+
databuddy,
|
|
3645
4023
|
posthog,
|
|
3646
4024
|
sentry,
|
|
3647
4025
|
otlp,
|
|
@@ -3665,6 +4043,7 @@ function createBaseLogger(config) {
|
|
|
3665
4043
|
const rawLogger = createPinoLogger(resolvedConfig);
|
|
3666
4044
|
const sink = createPrimarySink(resolvedConfig);
|
|
3667
4045
|
const betterstack = createBetterStackSender(resolvedConfig);
|
|
4046
|
+
const databuddy = createDatabuddySender(resolvedConfig);
|
|
3668
4047
|
const posthog = createPostHogSender(resolvedConfig);
|
|
3669
4048
|
const sentry = createSentrySender(resolvedConfig);
|
|
3670
4049
|
const otlp = createOTLPRegistry(resolvedConfig);
|
|
@@ -3672,6 +4051,7 @@ function createBaseLogger(config) {
|
|
|
3672
4051
|
rawLogger,
|
|
3673
4052
|
sink,
|
|
3674
4053
|
betterstack,
|
|
4054
|
+
databuddy,
|
|
3675
4055
|
posthog,
|
|
3676
4056
|
sentry,
|
|
3677
4057
|
otlp
|
|
@@ -3754,6 +4134,7 @@ function resolveServerLogger(config = {}, loggerOverride) {
|
|
|
3754
4134
|
return {
|
|
3755
4135
|
logger: logger2,
|
|
3756
4136
|
betterstack: getBetterStackSender(logger2),
|
|
4137
|
+
databuddy: getDatabuddySender(logger2),
|
|
3757
4138
|
posthog: getPostHogSender(logger2),
|
|
3758
4139
|
sentry: getSentrySender(logger2),
|
|
3759
4140
|
otlp: getOtlpRegistry(logger2),
|
|
@@ -3873,6 +4254,22 @@ function emitHttpErrorLog(logger2, level, request, path3, statusCode, responseTi
|
|
|
3873
4254
|
}
|
|
3874
4255
|
});
|
|
3875
4256
|
}
|
|
4257
|
+
const databuddy = tryGetDatabuddySender(logger2);
|
|
4258
|
+
if (databuddy?.shouldAutoCaptureExceptions()) {
|
|
4259
|
+
databuddy.captureException(captureContext.error ?? error ?? message, {
|
|
4260
|
+
source: "server",
|
|
4261
|
+
warnIfUnavailable: true,
|
|
4262
|
+
properties: {
|
|
4263
|
+
method: request.method,
|
|
4264
|
+
path: path3,
|
|
4265
|
+
status_code: statusCode,
|
|
4266
|
+
...request.url ? { current_url: request.url } : {},
|
|
4267
|
+
...getHeaderValue(request.headers, "user-agent") ? { user_agent: getHeaderValue(request.headers, "user-agent") } : {},
|
|
4268
|
+
...errorLogData.ip ? { ip: errorLogData.ip } : {},
|
|
4269
|
+
payload: errorLogData
|
|
4270
|
+
}
|
|
4271
|
+
});
|
|
4272
|
+
}
|
|
3876
4273
|
return errorLogData;
|
|
3877
4274
|
}
|
|
3878
4275
|
async function parseClientLogPayload(request, body) {
|
|
@@ -3964,6 +4361,34 @@ async function handleClientLogIngestion(options) {
|
|
|
3964
4361
|
});
|
|
3965
4362
|
}
|
|
3966
4363
|
}
|
|
4364
|
+
} else if (payload.connector === "databuddy") {
|
|
4365
|
+
headers["x-blyp-databuddy-status"] = config.databuddy.ready ? "enabled" : "missing";
|
|
4366
|
+
if (config.databuddy.ready) {
|
|
4367
|
+
const forwardedRecord = {
|
|
4368
|
+
timestamp: structuredPayload.receivedAt,
|
|
4369
|
+
level: payload.level,
|
|
4370
|
+
message: `[client] ${payload.message}`,
|
|
4371
|
+
data: structuredPayload
|
|
4372
|
+
};
|
|
4373
|
+
config.databuddy.send(forwardedRecord, {
|
|
4374
|
+
source: "client"
|
|
4375
|
+
});
|
|
4376
|
+
if ((payload.level === "error" || payload.level === "critical") && config.databuddy.shouldAutoCaptureExceptions()) {
|
|
4377
|
+
const clientErrorCandidate = payload.data && typeof payload.data === "object" && !Array.isArray(payload.data) && typeof payload.data.message === "string" ? payload.data : payload.message;
|
|
4378
|
+
config.databuddy.captureException(clientErrorCandidate, {
|
|
4379
|
+
source: "client",
|
|
4380
|
+
warnIfUnavailable: true,
|
|
4381
|
+
sessionId: payload.session.sessionId,
|
|
4382
|
+
properties: {
|
|
4383
|
+
page_url: payload.page.url,
|
|
4384
|
+
page_path: payload.page.pathname,
|
|
4385
|
+
client_runtime: payload.device?.runtime,
|
|
4386
|
+
metadata: payload.metadata,
|
|
4387
|
+
payload: structuredPayload
|
|
4388
|
+
}
|
|
4389
|
+
});
|
|
4390
|
+
}
|
|
4391
|
+
}
|
|
3967
4392
|
} else if (payload.connector === "posthog") {
|
|
3968
4393
|
headers["x-blyp-posthog-status"] = config.posthog.ready ? "enabled" : "missing";
|
|
3969
4394
|
if (config.posthog.ready) {
|