@interfere/react 0.1.0-alpha.6 → 0.2.0-alpha.2
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 +90 -0
- package/dist/error-boundary.d.mts +27 -0
- package/dist/error-boundary.d.mts.map +1 -0
- package/dist/error-boundary.mjs +42 -0
- package/dist/error-boundary.mjs.map +1 -0
- package/dist/internal/client.d.mts +13 -0
- package/dist/internal/client.d.mts.map +1 -0
- package/dist/internal/client.mjs +80 -0
- package/dist/internal/client.mjs.map +1 -0
- package/dist/internal/config.d.mts +9 -0
- package/dist/internal/config.d.mts.map +1 -0
- package/dist/internal/config.mjs +27 -0
- package/dist/internal/config.mjs.map +1 -0
- package/dist/internal/context.d.mts +6 -0
- package/dist/internal/context.d.mts.map +1 -0
- package/dist/internal/context.mjs +32 -0
- package/dist/internal/context.mjs.map +1 -0
- package/dist/internal/envelope.d.mts +14 -0
- package/dist/internal/envelope.d.mts.map +1 -0
- package/dist/internal/envelope.mjs +20 -0
- package/dist/internal/envelope.mjs.map +1 -0
- package/dist/internal/errors.d.mts +4 -0
- package/dist/internal/errors.d.mts.map +1 -0
- package/dist/internal/errors.mjs +4 -0
- package/dist/internal/errors.mjs.map +1 -0
- package/dist/internal/sw.d.mts +4 -0
- package/dist/internal/sw.d.mts.map +1 -0
- package/dist/internal/sw.mjs +10 -0
- package/dist/internal/sw.mjs.map +1 -0
- package/dist/plugins/errors.d.mts +6 -0
- package/dist/plugins/errors.d.mts.map +1 -0
- package/dist/plugins/errors.mjs +59 -0
- package/dist/plugins/errors.mjs.map +1 -0
- package/dist/plugins/lib/loader.d.mts +9 -0
- package/dist/plugins/lib/loader.d.mts.map +1 -0
- package/dist/plugins/lib/loader.mjs +47 -0
- package/dist/plugins/lib/loader.mjs.map +1 -0
- package/dist/plugins/lib/types.d.mts +14 -0
- package/dist/plugins/lib/types.d.mts.map +1 -0
- package/dist/plugins/lib/types.mjs +1 -0
- package/dist/plugins/pages.d.mts +6 -0
- package/dist/plugins/pages.d.mts.map +1 -0
- package/dist/plugins/pages.mjs +102 -0
- package/dist/plugins/pages.mjs.map +1 -0
- package/dist/plugins/rage-clicks.d.mts +6 -0
- package/dist/plugins/rage-clicks.d.mts.map +1 -0
- package/dist/plugins/rage-clicks.mjs +53 -0
- package/dist/plugins/rage-clicks.mjs.map +1 -0
- package/dist/plugins/replay.d.mts +6 -0
- package/dist/plugins/replay.d.mts.map +1 -0
- package/dist/plugins/replay.mjs +62 -0
- package/dist/plugins/replay.mjs.map +1 -0
- package/dist/provider.d.mts +17 -11
- package/dist/provider.d.mts.map +1 -1
- package/dist/provider.mjs +18 -17
- package/dist/provider.mjs.map +1 -1
- package/dist/tracking/api.d.mts +22 -0
- package/dist/tracking/api.d.mts.map +1 -0
- package/dist/tracking/api.mjs +88 -0
- package/dist/tracking/api.mjs.map +1 -0
- package/dist/tracking/session.d.mts +19 -0
- package/dist/tracking/session.d.mts.map +1 -0
- package/dist/tracking/session.mjs +92 -0
- package/dist/tracking/session.mjs.map +1 -0
- package/dist/tracking/visitor.d.mts +6 -0
- package/dist/tracking/visitor.d.mts.map +1 -0
- package/dist/tracking/visitor.mjs +35 -0
- package/dist/tracking/visitor.mjs.map +1 -0
- package/dist/transport/http.d.mts +15 -0
- package/dist/transport/http.d.mts.map +1 -0
- package/dist/transport/http.mjs +56 -0
- package/dist/transport/http.mjs.map +1 -0
- package/dist/transport/queue.d.mts +25 -0
- package/dist/transport/queue.d.mts.map +1 -0
- package/dist/transport/queue.mjs +60 -0
- package/dist/transport/queue.mjs.map +1 -0
- package/dist/util/log.d.mts +13 -0
- package/dist/util/log.d.mts.map +1 -0
- package/dist/util/log.mjs +37 -0
- package/dist/util/log.mjs.map +1 -0
- package/package.json +38 -64
- package/dist/client.d.mts +0 -8
- package/dist/client.d.mts.map +0 -1
- package/dist/client.mjs +0 -14
- package/dist/client.mjs.map +0 -1
- package/dist/core/events/define-event.d.mts +0 -12
- package/dist/core/events/define-event.d.mts.map +0 -1
- package/dist/core/events/define-event.mjs +0 -39
- package/dist/core/events/define-event.mjs.map +0 -1
- package/dist/core/events/event-registry.d.mts +0 -23
- package/dist/core/events/event-registry.d.mts.map +0 -1
- package/dist/core/events/event-registry.mjs +0 -32
- package/dist/core/events/event-registry.mjs.map +0 -1
- package/dist/core/events/plugin-event-types.d.mts +0 -130
- package/dist/core/events/plugin-event-types.d.mts.map +0 -1
- package/dist/core/events/plugin-event-types.mjs +0 -25
- package/dist/core/events/plugin-event-types.mjs.map +0 -1
- package/dist/core/plugins/define-plugin.d.mts +0 -43
- package/dist/core/plugins/define-plugin.d.mts.map +0 -1
- package/dist/core/plugins/define-plugin.mjs +0 -23
- package/dist/core/plugins/define-plugin.mjs.map +0 -1
- package/dist/core/plugins/dom-utils.d.mts +0 -9
- package/dist/core/plugins/dom-utils.d.mts.map +0 -1
- package/dist/core/plugins/dom-utils.mjs +0 -25
- package/dist/core/plugins/dom-utils.mjs.map +0 -1
- package/dist/core/plugins/impl/ai-summary/ai-summary-plugin-api.d.mts +0 -18
- package/dist/core/plugins/impl/ai-summary/ai-summary-plugin-api.d.mts.map +0 -1
- package/dist/core/plugins/impl/ai-summary/ai-summary-plugin-api.mjs +0 -17
- package/dist/core/plugins/impl/ai-summary/ai-summary-plugin-api.mjs.map +0 -1
- package/dist/core/plugins/impl/ai-summary/plugin.d.mts +0 -6
- package/dist/core/plugins/impl/ai-summary/plugin.d.mts.map +0 -1
- package/dist/core/plugins/impl/ai-summary/plugin.mjs +0 -151
- package/dist/core/plugins/impl/ai-summary/plugin.mjs.map +0 -1
- package/dist/core/plugins/impl/errors/errors-plugin-api.d.mts +0 -17
- package/dist/core/plugins/impl/errors/errors-plugin-api.d.mts.map +0 -1
- package/dist/core/plugins/impl/errors/errors-plugin-api.mjs +0 -58
- package/dist/core/plugins/impl/errors/errors-plugin-api.mjs.map +0 -1
- package/dist/core/plugins/impl/errors/logic.d.mts +0 -15
- package/dist/core/plugins/impl/errors/logic.d.mts.map +0 -1
- package/dist/core/plugins/impl/errors/logic.mjs +0 -48
- package/dist/core/plugins/impl/errors/logic.mjs.map +0 -1
- package/dist/core/plugins/impl/errors/patches.d.mts +0 -13
- package/dist/core/plugins/impl/errors/patches.d.mts.map +0 -1
- package/dist/core/plugins/impl/errors/patches.mjs +0 -43
- package/dist/core/plugins/impl/errors/patches.mjs.map +0 -1
- package/dist/core/plugins/impl/errors/plugin.d.mts +0 -9
- package/dist/core/plugins/impl/errors/plugin.d.mts.map +0 -1
- package/dist/core/plugins/impl/errors/plugin.mjs +0 -91
- package/dist/core/plugins/impl/errors/plugin.mjs.map +0 -1
- package/dist/core/plugins/impl/page-events/page-events-plugin-api.d.mts +0 -19
- package/dist/core/plugins/impl/page-events/page-events-plugin-api.d.mts.map +0 -1
- package/dist/core/plugins/impl/page-events/page-events-plugin-api.mjs +0 -38
- package/dist/core/plugins/impl/page-events/page-events-plugin-api.mjs.map +0 -1
- package/dist/core/plugins/impl/page-events/plugin.d.mts +0 -6
- package/dist/core/plugins/impl/page-events/plugin.d.mts.map +0 -1
- package/dist/core/plugins/impl/page-events/plugin.mjs +0 -95
- package/dist/core/plugins/impl/page-events/plugin.mjs.map +0 -1
- package/dist/core/plugins/impl/rage-click/plugin.d.mts +0 -6
- package/dist/core/plugins/impl/rage-click/plugin.d.mts.map +0 -1
- package/dist/core/plugins/impl/rage-click/plugin.mjs +0 -38
- package/dist/core/plugins/impl/rage-click/plugin.mjs.map +0 -1
- package/dist/core/plugins/impl/rage-click/rage-click.layer.d.mts +0 -9
- package/dist/core/plugins/impl/rage-click/rage-click.layer.d.mts.map +0 -1
- package/dist/core/plugins/impl/rage-click/rage-click.layer.mjs +0 -35
- package/dist/core/plugins/impl/rage-click/rage-click.layer.mjs.map +0 -1
- package/dist/core/plugins/impl/rage-click/rage-click.service.d.mts +0 -16
- package/dist/core/plugins/impl/rage-click/rage-click.service.d.mts.map +0 -1
- package/dist/core/plugins/impl/rage-click/rage-click.service.mjs +0 -7
- package/dist/core/plugins/impl/rage-click/rage-click.service.mjs.map +0 -1
- package/dist/core/plugins/impl/rage-click/rage-click.test-layer.d.mts +0 -16
- package/dist/core/plugins/impl/rage-click/rage-click.test-layer.d.mts.map +0 -1
- package/dist/core/plugins/impl/rage-click/rage-click.test-layer.mjs +0 -18
- package/dist/core/plugins/impl/rage-click/rage-click.test-layer.mjs.map +0 -1
- package/dist/core/plugins/impl/replay/plugin.d.mts +0 -9
- package/dist/core/plugins/impl/replay/plugin.d.mts.map +0 -1
- package/dist/core/plugins/impl/replay/plugin.mjs +0 -83
- package/dist/core/plugins/impl/replay/plugin.mjs.map +0 -1
- package/dist/core/plugins/impl/replay/replay-plugin-api.d.mts +0 -18
- package/dist/core/plugins/impl/replay/replay-plugin-api.d.mts.map +0 -1
- package/dist/core/plugins/impl/replay/replay-plugin-api.mjs +0 -50
- package/dist/core/plugins/impl/replay/replay-plugin-api.mjs.map +0 -1
- package/dist/core/plugins/impl/server-tracing/plugin.d.mts +0 -13
- package/dist/core/plugins/impl/server-tracing/plugin.d.mts.map +0 -1
- package/dist/core/plugins/impl/server-tracing/plugin.mjs +0 -75
- package/dist/core/plugins/impl/server-tracing/plugin.mjs.map +0 -1
- package/dist/core/plugins/impl/server-tracing/server-tracing-plugin-api.d.mts +0 -16
- package/dist/core/plugins/impl/server-tracing/server-tracing-plugin-api.d.mts.map +0 -1
- package/dist/core/plugins/impl/server-tracing/server-tracing-plugin-api.mjs +0 -17
- package/dist/core/plugins/impl/server-tracing/server-tracing-plugin-api.mjs.map +0 -1
- package/dist/core/plugins/impl/server-tracing/tracing-logic.d.mts +0 -29
- package/dist/core/plugins/impl/server-tracing/tracing-logic.d.mts.map +0 -1
- package/dist/core/plugins/impl/server-tracing/tracing-logic.mjs +0 -55
- package/dist/core/plugins/impl/server-tracing/tracing-logic.mjs.map +0 -1
- package/dist/core/plugins/plugin-loader.d.mts +0 -75
- package/dist/core/plugins/plugin-loader.d.mts.map +0 -1
- package/dist/core/plugins/plugin-loader.mjs +0 -79
- package/dist/core/plugins/plugin-loader.mjs.map +0 -1
- package/dist/core/plugins/services/event-capture.d.mts +0 -12
- package/dist/core/plugins/services/event-capture.d.mts.map +0 -1
- package/dist/core/plugins/services/event-capture.layer.d.mts +0 -11
- package/dist/core/plugins/services/event-capture.layer.d.mts.map +0 -1
- package/dist/core/plugins/services/event-capture.layer.mjs +0 -79
- package/dist/core/plugins/services/event-capture.layer.mjs.map +0 -1
- package/dist/core/plugins/services/event-capture.mjs +0 -7
- package/dist/core/plugins/services/event-capture.mjs.map +0 -1
- package/dist/core/plugins/services/event-capture.test-layer.d.mts +0 -17
- package/dist/core/plugins/services/event-capture.test-layer.d.mts.map +0 -1
- package/dist/core/plugins/services/event-capture.test-layer.mjs +0 -21
- package/dist/core/plugins/services/event-capture.test-layer.mjs.map +0 -1
- package/dist/core/plugins/services/plugin-config.d.mts +0 -11
- package/dist/core/plugins/services/plugin-config.d.mts.map +0 -1
- package/dist/core/plugins/services/plugin-config.mjs +0 -7
- package/dist/core/plugins/services/plugin-config.mjs.map +0 -1
- package/dist/core/plugins/services/plugin-config.test-layer.d.mts +0 -60
- package/dist/core/plugins/services/plugin-config.test-layer.d.mts.map +0 -1
- package/dist/core/plugins/services/plugin-config.test-layer.mjs +0 -8
- package/dist/core/plugins/services/plugin-config.test-layer.mjs.map +0 -1
- package/dist/core/plugins/services/plugin-logger.d.mts +0 -14
- package/dist/core/plugins/services/plugin-logger.d.mts.map +0 -1
- package/dist/core/plugins/services/plugin-logger.mjs +0 -7
- package/dist/core/plugins/services/plugin-logger.mjs.map +0 -1
- package/dist/core/plugins/services/plugin-logger.test-layer.d.mts +0 -18
- package/dist/core/plugins/services/plugin-logger.test-layer.d.mts.map +0 -1
- package/dist/core/plugins/services/plugin-logger.test-layer.mjs +0 -28
- package/dist/core/plugins/services/plugin-logger.test-layer.mjs.map +0 -1
- package/dist/core/plugins/services/plugin-runtime.d.mts +0 -10
- package/dist/core/plugins/services/plugin-runtime.d.mts.map +0 -1
- package/dist/core/plugins/services/plugin-runtime.mjs +0 -7
- package/dist/core/plugins/services/plugin-runtime.mjs.map +0 -1
- package/dist/core/plugins/services/plugin-runtime.test-layer.d.mts +0 -16
- package/dist/core/plugins/services/plugin-runtime.test-layer.d.mts.map +0 -1
- package/dist/core/plugins/services/plugin-runtime.test-layer.mjs +0 -21
- package/dist/core/plugins/services/plugin-runtime.test-layer.mjs.map +0 -1
- package/dist/core/plugins/services/session-info.d.mts +0 -11
- package/dist/core/plugins/services/session-info.d.mts.map +0 -1
- package/dist/core/plugins/services/session-info.mjs +0 -7
- package/dist/core/plugins/services/session-info.mjs.map +0 -1
- package/dist/core/plugins/services/session-info.test-layer.d.mts +0 -18
- package/dist/core/plugins/services/session-info.test-layer.d.mts.map +0 -1
- package/dist/core/plugins/services/session-info.test-layer.mjs +0 -20
- package/dist/core/plugins/services/session-info.test-layer.mjs.map +0 -1
- package/dist/core/runtime/config.d.mts +0 -14
- package/dist/core/runtime/config.d.mts.map +0 -1
- package/dist/core/runtime/config.mjs +0 -33
- package/dist/core/runtime/config.mjs.map +0 -1
- package/dist/core/runtime/context.d.mts +0 -50
- package/dist/core/runtime/context.d.mts.map +0 -1
- package/dist/core/runtime/context.mjs +0 -46
- package/dist/core/runtime/context.mjs.map +0 -1
- package/dist/core/runtime/ingest-target.d.mts +0 -10
- package/dist/core/runtime/ingest-target.d.mts.map +0 -1
- package/dist/core/runtime/ingest-target.mjs +0 -15
- package/dist/core/runtime/ingest-target.mjs.map +0 -1
- package/dist/core/runtime/native-fetch.d.mts +0 -32
- package/dist/core/runtime/native-fetch.d.mts.map +0 -1
- package/dist/core/runtime/native-fetch.mjs +0 -49
- package/dist/core/runtime/native-fetch.mjs.map +0 -1
- package/dist/core/schemas.d.mts +0 -26
- package/dist/core/schemas.d.mts.map +0 -1
- package/dist/core/schemas.mjs +0 -1
- package/dist/effect/errors.d.mts +0 -22
- package/dist/effect/errors.d.mts.map +0 -1
- package/dist/effect/errors.mjs +0 -17
- package/dist/effect/errors.mjs.map +0 -1
- package/dist/effect/layers/circuit-breaker.layer.d.mts +0 -9
- package/dist/effect/layers/circuit-breaker.layer.d.mts.map +0 -1
- package/dist/effect/layers/circuit-breaker.layer.mjs +0 -9
- package/dist/effect/layers/circuit-breaker.layer.mjs.map +0 -1
- package/dist/effect/layers/circuit-breaker.layer.test-layer.d.mts +0 -18
- package/dist/effect/layers/circuit-breaker.layer.test-layer.d.mts.map +0 -1
- package/dist/effect/layers/circuit-breaker.layer.test-layer.mjs +0 -43
- package/dist/effect/layers/circuit-breaker.layer.test-layer.mjs.map +0 -1
- package/dist/effect/layers/config.layer.d.mts +0 -13
- package/dist/effect/layers/config.layer.d.mts.map +0 -1
- package/dist/effect/layers/config.layer.mjs +0 -21
- package/dist/effect/layers/config.layer.mjs.map +0 -1
- package/dist/effect/layers/context.layer.d.mts +0 -12
- package/dist/effect/layers/context.layer.d.mts.map +0 -1
- package/dist/effect/layers/context.layer.mjs +0 -14
- package/dist/effect/layers/context.layer.mjs.map +0 -1
- package/dist/effect/layers/http.layer.d.mts +0 -21
- package/dist/effect/layers/http.layer.d.mts.map +0 -1
- package/dist/effect/layers/http.layer.mjs +0 -118
- package/dist/effect/layers/http.layer.mjs.map +0 -1
- package/dist/effect/layers/queue.layer.d.mts +0 -31
- package/dist/effect/layers/queue.layer.d.mts.map +0 -1
- package/dist/effect/layers/queue.layer.mjs +0 -257
- package/dist/effect/layers/queue.layer.mjs.map +0 -1
- package/dist/effect/layers/queue.layer.test-layer.d.mts +0 -19
- package/dist/effect/layers/queue.layer.test-layer.d.mts.map +0 -1
- package/dist/effect/layers/queue.layer.test-layer.mjs +0 -44
- package/dist/effect/layers/queue.layer.test-layer.mjs.map +0 -1
- package/dist/effect/layers/session.layer.d.mts +0 -34
- package/dist/effect/layers/session.layer.d.mts.map +0 -1
- package/dist/effect/layers/session.layer.mjs +0 -127
- package/dist/effect/layers/session.layer.mjs.map +0 -1
- package/dist/effect/layers/storage.layer.d.mts +0 -50
- package/dist/effect/layers/storage.layer.d.mts.map +0 -1
- package/dist/effect/layers/storage.layer.mjs +0 -180
- package/dist/effect/layers/storage.layer.mjs.map +0 -1
- package/dist/effect/layers/test-utils.d.mts +0 -19
- package/dist/effect/layers/test-utils.d.mts.map +0 -1
- package/dist/effect/layers/test-utils.mjs +0 -32
- package/dist/effect/layers/test-utils.mjs.map +0 -1
- package/dist/effect/runtime-services.d.mts +0 -23
- package/dist/effect/runtime-services.d.mts.map +0 -1
- package/dist/effect/runtime-services.mjs +0 -79
- package/dist/effect/runtime-services.mjs.map +0 -1
- package/dist/effect/tags.d.mts +0 -58
- package/dist/effect/tags.d.mts.map +0 -1
- package/dist/effect/tags.mjs +0 -7
- package/dist/effect/tags.mjs.map +0 -1
- package/dist/hooks/use-runtime-and-plugins.d.mts +0 -7
- package/dist/hooks/use-runtime-and-plugins.d.mts.map +0 -1
- package/dist/hooks/use-runtime-and-plugins.mjs +0 -121
- package/dist/hooks/use-runtime-and-plugins.mjs.map +0 -1
- package/dist/hooks/use-session.d.mts +0 -40
- package/dist/hooks/use-session.d.mts.map +0 -1
- package/dist/hooks/use-session.mjs +0 -96
- package/dist/hooks/use-session.mjs.map +0 -1
- package/dist/package.mjs +0 -103
- package/dist/package.mjs.map +0 -1
- package/dist/server/auth.d.mts +0 -15
- package/dist/server/auth.d.mts.map +0 -1
- package/dist/server/auth.mjs +0 -45
- package/dist/server/auth.mjs.map +0 -1
- package/dist/server/capture.d.mts +0 -34
- package/dist/server/capture.d.mts.map +0 -1
- package/dist/server/capture.mjs +0 -172
- package/dist/server/capture.mjs.map +0 -1
package/dist/server/capture.mjs
DELETED
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
import { Effect } from "effect";
|
|
2
|
-
import { withInterfereLogger } from "@interfere/effect-utils/observability";
|
|
3
|
-
import { v7 } from "uuid";
|
|
4
|
-
import { normalizeEnv, normalizeRuntime } from "@interfere/types/sdk/runtime";
|
|
5
|
-
|
|
6
|
-
//#region src/server/capture.ts
|
|
7
|
-
function toJsonBytes(obj) {
|
|
8
|
-
const encoder = new TextEncoder();
|
|
9
|
-
return Array.from(encoder.encode(JSON.stringify(obj)));
|
|
10
|
-
}
|
|
11
|
-
const X_INTERFERE_REQUEST_HEADER = "x-interfere-request";
|
|
12
|
-
/**
|
|
13
|
-
* Parse x-interfere-request header to extract session ID and request ID
|
|
14
|
-
* Format: {sessionId}/{requestId}
|
|
15
|
-
*/
|
|
16
|
-
function parseInterfereRequestHeader(headerValue) {
|
|
17
|
-
if (!headerValue) return {
|
|
18
|
-
sessionId: null,
|
|
19
|
-
requestId: null
|
|
20
|
-
};
|
|
21
|
-
const parts = headerValue.split("/");
|
|
22
|
-
if (parts.length !== 2) return {
|
|
23
|
-
sessionId: null,
|
|
24
|
-
requestId: null
|
|
25
|
-
};
|
|
26
|
-
return {
|
|
27
|
-
sessionId: parts[0] || null,
|
|
28
|
-
requestId: parts[1] || null
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
function resolveSessionId(request, deps = {}) {
|
|
32
|
-
const { getAsyncContext } = deps;
|
|
33
|
-
if (request) {
|
|
34
|
-
const parsed = parseInterfereRequestHeader(request.headers.get(X_INTERFERE_REQUEST_HEADER));
|
|
35
|
-
if (parsed.sessionId) return {
|
|
36
|
-
sessionId: parsed.sessionId,
|
|
37
|
-
source: "header"
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
if (getAsyncContext) {
|
|
41
|
-
const asyncContext = getAsyncContext();
|
|
42
|
-
if (asyncContext?.sessionId) return {
|
|
43
|
-
sessionId: asyncContext.sessionId,
|
|
44
|
-
source: "async_context"
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
return {
|
|
48
|
-
sessionId: `server_${v7()}`,
|
|
49
|
-
source: "fallback"
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Parse stack trace to extract frames
|
|
54
|
-
* Similar logic to client-side error parsing
|
|
55
|
-
*/
|
|
56
|
-
const STACK_TRACE_REGEX = /at\s+(?:(.+?)\s+\()?(.+?):(\d+):(\d+)\)?/;
|
|
57
|
-
function parseStackTrace(stack) {
|
|
58
|
-
if (!stack) return [{
|
|
59
|
-
file: { reported: null },
|
|
60
|
-
line: { reported: null },
|
|
61
|
-
column: { reported: null },
|
|
62
|
-
fn: { reported: null }
|
|
63
|
-
}];
|
|
64
|
-
const lines = stack.split("\n");
|
|
65
|
-
const frames = [];
|
|
66
|
-
for (const line of lines) {
|
|
67
|
-
const match = line.match(STACK_TRACE_REGEX);
|
|
68
|
-
if (match) frames.push({
|
|
69
|
-
file: { reported: match[2] || null },
|
|
70
|
-
line: { reported: match[3] ? Number.parseInt(match[3], 10) : null },
|
|
71
|
-
column: { reported: match[4] ? Number.parseInt(match[4], 10) : null },
|
|
72
|
-
fn: { reported: match[1] || null }
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
return frames.length > 0 ? frames : [{
|
|
76
|
-
file: { reported: null },
|
|
77
|
-
line: { reported: null },
|
|
78
|
-
column: { reported: null },
|
|
79
|
-
fn: { reported: null }
|
|
80
|
-
}];
|
|
81
|
-
}
|
|
82
|
-
const ROUTER_KINDS = ["Pages Router", "App Router"];
|
|
83
|
-
const ROUTE_TYPES = [
|
|
84
|
-
"render",
|
|
85
|
-
"route",
|
|
86
|
-
"action",
|
|
87
|
-
"middleware",
|
|
88
|
-
"proxy"
|
|
89
|
-
];
|
|
90
|
-
const RENDER_SOURCES = [
|
|
91
|
-
"react-server-components",
|
|
92
|
-
"react-server-components-payload",
|
|
93
|
-
"server-rendering"
|
|
94
|
-
];
|
|
95
|
-
const REVALIDATE_REASONS = ["on-demand", "stale"];
|
|
96
|
-
const RENDER_TYPES = ["dynamic", "dynamic-resume"];
|
|
97
|
-
function isOneOf(value, allowed) {
|
|
98
|
-
return typeof value === "string" && allowed.includes(value);
|
|
99
|
-
}
|
|
100
|
-
function extractNextjsContext(context) {
|
|
101
|
-
if (!context) return;
|
|
102
|
-
const nextjsContext = {};
|
|
103
|
-
if (isOneOf(context.routerKind, ROUTER_KINDS)) nextjsContext.routerKind = context.routerKind;
|
|
104
|
-
if (typeof context.routePath === "string") nextjsContext.routePath = context.routePath;
|
|
105
|
-
if (isOneOf(context.routeType, ROUTE_TYPES)) nextjsContext.routeType = context.routeType;
|
|
106
|
-
if (isOneOf(context.renderSource, RENDER_SOURCES)) nextjsContext.renderSource = context.renderSource;
|
|
107
|
-
if (isOneOf(context.revalidateReason, REVALIDATE_REASONS)) nextjsContext.revalidateReason = context.revalidateReason;
|
|
108
|
-
if (isOneOf(context.renderType, RENDER_TYPES)) nextjsContext.renderType = context.renderType;
|
|
109
|
-
if (typeof context.requestPath === "string") nextjsContext.requestPath = context.requestPath;
|
|
110
|
-
if (typeof context.requestMethod === "string") nextjsContext.requestMethod = context.requestMethod;
|
|
111
|
-
if (typeof context.errorDigest === "string") nextjsContext.errorDigest = context.errorDigest;
|
|
112
|
-
return Object.keys(nextjsContext).length > 0 ? nextjsContext : void 0;
|
|
113
|
-
}
|
|
114
|
-
function extractMechanism(context) {
|
|
115
|
-
if (!context?.mechanism) return;
|
|
116
|
-
const mech = context.mechanism;
|
|
117
|
-
if (typeof mech.type !== "string" || typeof mech.handled !== "boolean") return;
|
|
118
|
-
return {
|
|
119
|
-
type: mech.type,
|
|
120
|
-
handled: mech.handled,
|
|
121
|
-
synthetic: typeof mech.synthetic === "boolean" ? mech.synthetic : void 0
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
function buildServerErrorEnvelope(input) {
|
|
125
|
-
const { error, request, buildId, releaseId, environment, runtime, context, sessionResolverDeps } = input;
|
|
126
|
-
const { sessionId, source: sessionSource } = resolveSessionId(request, sessionResolverDeps);
|
|
127
|
-
const nextjsContext = extractNextjsContext(context);
|
|
128
|
-
const mechanism = extractMechanism(context);
|
|
129
|
-
const captureSource = typeof context?.captureSource === "string" ? context.captureSource : void 0;
|
|
130
|
-
const errorObj = error;
|
|
131
|
-
const errorPayload = {
|
|
132
|
-
frames: parseStackTrace(errorObj?.stack),
|
|
133
|
-
message: errorObj?.message ?? String(error ?? "Unknown error"),
|
|
134
|
-
name: errorObj?.name ?? "Error",
|
|
135
|
-
stack: errorObj?.stack ?? null,
|
|
136
|
-
errorSource: "server",
|
|
137
|
-
...mechanism && { mechanism },
|
|
138
|
-
...nextjsContext && { nextjs: nextjsContext },
|
|
139
|
-
...captureSource && { captureSource }
|
|
140
|
-
};
|
|
141
|
-
return {
|
|
142
|
-
v: 0,
|
|
143
|
-
runtime: normalizeRuntime(runtime),
|
|
144
|
-
environment: normalizeEnv(environment),
|
|
145
|
-
clientTs: Date.now(),
|
|
146
|
-
sessionId,
|
|
147
|
-
sessionSource,
|
|
148
|
-
type: "error",
|
|
149
|
-
payload: errorPayload,
|
|
150
|
-
buildId: buildId ?? "unknown",
|
|
151
|
-
releaseId: releaseId ?? "unknown",
|
|
152
|
-
uuid: v7()
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
async function sendEnvelopesToIngest(envelopes, ingestUrl, surfaceToken) {
|
|
156
|
-
const response = await Effect.runPromise(withInterfereLogger("react", Effect.promise(() => fetch(ingestUrl, {
|
|
157
|
-
method: "POST",
|
|
158
|
-
headers: {
|
|
159
|
-
"Content-Type": "application/json",
|
|
160
|
-
"x-interfere-pub-token": surfaceToken
|
|
161
|
-
},
|
|
162
|
-
body: JSON.stringify(envelopes),
|
|
163
|
-
keepalive: true
|
|
164
|
-
})).pipe(Effect.withSpan("server.sendEnvelopes"))));
|
|
165
|
-
if (!response.ok) {
|
|
166
|
-
const errorText = await response.text().catch(() => "");
|
|
167
|
-
throw new Error(`Failed to send envelopes to ingest: ${response.status} ${response.statusText}${errorText ? ` - ${errorText}` : ""}`);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
//#endregion
|
|
172
|
-
export { buildServerErrorEnvelope, sendEnvelopesToIngest, toJsonBytes };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"capture.mjs","names":["uuidv7"],"sources":["../../src/server/capture.ts"],"sourcesContent":["import { withInterfereLogger } from \"@interfere/effect-utils/observability\";\nimport type { IngestedFrame } from \"@interfere/types/data/frame\";\nimport type { Config } from \"@interfere/types/sdk/config\";\nimport type { Envelope, SessionSource } from \"@interfere/types/sdk/envelope\";\nimport type {\n ErrorEnvelopePayload,\n ErrorMechanism,\n NextjsErrorContext,\n} from \"@interfere/types/sdk/plugins/payload/errors\";\nimport {\n type Env,\n normalizeEnv,\n normalizeRuntime,\n type Runtime,\n} from \"@interfere/types/sdk/runtime\";\n\nimport { Effect } from \"effect\";\nimport { v7 as uuidv7 } from \"uuid\";\n\nexport function toJsonBytes(obj: unknown): number[] {\n const encoder = new TextEncoder();\n return Array.from(encoder.encode(JSON.stringify(obj)));\n}\n\nconst X_INTERFERE_REQUEST_HEADER = \"x-interfere-request\";\n\n/**\n * Parse x-interfere-request header to extract session ID and request ID\n * Format: {sessionId}/{requestId}\n */\nfunction parseInterfereRequestHeader(headerValue: string | null): {\n sessionId: string | null;\n requestId: string | null;\n} {\n if (!headerValue) {\n return { sessionId: null, requestId: null };\n }\n\n const parts = headerValue.split(\"/\");\n if (parts.length !== 2) {\n return { sessionId: null, requestId: null };\n }\n\n return {\n sessionId: parts[0] || null,\n requestId: parts[1] || null,\n };\n}\n\n/**\n * Session resolution result with source tracking for debugging.\n */\ninterface SessionResolution {\n sessionId: string;\n source: SessionSource;\n}\n\n/**\n * Session resolution strategy.\n *\n * Attempts to resolve session ID in order of preference:\n * 1. Header: Parse x-interfere-request header (ideal case)\n * 2. AsyncContext: Check AsyncLocalStorage context (for async code paths)\n * 3. Fallback: Generate server-side session ID (breaks continuity - tracked for monitoring)\n */\nexport interface SessionResolverDeps {\n /** Get session context from AsyncLocalStorage */\n getAsyncContext?: () =>\n | { sessionId: string | null; requestId: string | null }\n | undefined;\n}\n\nfunction resolveSessionId(\n request: Request | undefined,\n deps: SessionResolverDeps = {}\n): SessionResolution {\n const { getAsyncContext } = deps;\n\n // Level 1: Parse x-interfere-request header\n if (request) {\n const headerValue = request.headers.get(X_INTERFERE_REQUEST_HEADER);\n const parsed = parseInterfereRequestHeader(headerValue);\n\n if (parsed.sessionId) {\n return { sessionId: parsed.sessionId, source: \"header\" };\n }\n }\n\n // Level 2: Check AsyncLocalStorage context\n if (getAsyncContext) {\n const asyncContext = getAsyncContext();\n if (asyncContext?.sessionId) {\n return { sessionId: asyncContext.sessionId, source: \"async_context\" };\n }\n }\n\n // Level 3: Fallback - generate server-side session ID\n // This breaks session continuity but at least captures the error\n return {\n sessionId: `server_${uuidv7()}`,\n source: \"fallback\",\n };\n}\n\n/**\n * Parse stack trace to extract frames\n * Similar logic to client-side error parsing\n */\nconst STACK_TRACE_REGEX = /at\\s+(?:(.+?)\\s+\\()?(.+?):(\\d+):(\\d+)\\)?/;\n\nfunction parseStackTrace(stack?: string): IngestedFrame[] {\n if (!stack) {\n return [\n {\n file: { reported: null },\n line: { reported: null },\n column: { reported: null },\n fn: { reported: null },\n },\n ];\n }\n\n const lines = stack.split(\"\\n\");\n const frames: IngestedFrame[] = [];\n\n for (const line of lines) {\n const match = line.match(STACK_TRACE_REGEX);\n\n if (match) {\n frames.push({\n file: { reported: match[2] || null },\n line: { reported: match[3] ? Number.parseInt(match[3], 10) : null },\n column: { reported: match[4] ? Number.parseInt(match[4], 10) : null },\n fn: { reported: match[1] || null },\n });\n }\n }\n\n return frames.length > 0\n ? frames\n : [\n {\n file: { reported: null },\n line: { reported: null },\n column: { reported: null },\n fn: { reported: null },\n },\n ];\n}\n\ntype ServerErrorMeta = Pick<Config[\"metadata\"], \"buildId\" | \"releaseId\">;\n\nexport type ServerErrorEnvelopeInput = ServerErrorMeta & {\n error: unknown;\n request?: Request;\n context?: Record<string, unknown>;\n environment: string | Env;\n runtime?: string | Runtime;\n /** Optional dependency injection for session resolution */\n sessionResolverDeps?: SessionResolverDeps;\n};\n\nconst ROUTER_KINDS = [\"Pages Router\", \"App Router\"] as const;\nconst ROUTE_TYPES = [\n \"render\",\n \"route\",\n \"action\",\n \"middleware\",\n \"proxy\",\n] as const;\nconst RENDER_SOURCES = [\n \"react-server-components\",\n \"react-server-components-payload\",\n \"server-rendering\",\n] as const;\nconst REVALIDATE_REASONS = [\"on-demand\", \"stale\"] as const;\nconst RENDER_TYPES = [\"dynamic\", \"dynamic-resume\"] as const;\n\ntype RouterKind = (typeof ROUTER_KINDS)[number];\ntype RouteType = (typeof ROUTE_TYPES)[number];\ntype RenderSource = (typeof RENDER_SOURCES)[number];\ntype RevalidateReason = (typeof REVALIDATE_REASONS)[number];\ntype RenderType = (typeof RENDER_TYPES)[number];\n\nfunction isOneOf<T extends string>(\n value: unknown,\n allowed: readonly T[]\n): value is T {\n return (\n typeof value === \"string\" && (allowed as readonly string[]).includes(value)\n );\n}\n\nfunction extractNextjsContext(\n context?: Record<string, unknown>\n): NextjsErrorContext | undefined {\n if (!context) {\n return undefined;\n }\n\n const nextjsContext: NextjsErrorContext = {};\n\n if (isOneOf<RouterKind>(context.routerKind, ROUTER_KINDS)) {\n nextjsContext.routerKind = context.routerKind;\n }\n if (typeof context.routePath === \"string\") {\n nextjsContext.routePath = context.routePath;\n }\n if (isOneOf<RouteType>(context.routeType, ROUTE_TYPES)) {\n nextjsContext.routeType = context.routeType;\n }\n if (isOneOf<RenderSource>(context.renderSource, RENDER_SOURCES)) {\n nextjsContext.renderSource = context.renderSource;\n }\n if (isOneOf<RevalidateReason>(context.revalidateReason, REVALIDATE_REASONS)) {\n nextjsContext.revalidateReason = context.revalidateReason;\n }\n if (isOneOf<RenderType>(context.renderType, RENDER_TYPES)) {\n nextjsContext.renderType = context.renderType;\n }\n if (typeof context.requestPath === \"string\") {\n nextjsContext.requestPath = context.requestPath;\n }\n if (typeof context.requestMethod === \"string\") {\n nextjsContext.requestMethod = context.requestMethod;\n }\n if (typeof context.errorDigest === \"string\") {\n nextjsContext.errorDigest = context.errorDigest;\n }\n\n return Object.keys(nextjsContext).length > 0 ? nextjsContext : undefined;\n}\n\nfunction extractMechanism(\n context?: Record<string, unknown>\n): ErrorMechanism | undefined {\n if (!context?.mechanism) {\n return undefined;\n }\n\n const mech = context.mechanism as Record<string, unknown>;\n if (typeof mech.type !== \"string\" || typeof mech.handled !== \"boolean\") {\n return undefined;\n }\n\n return {\n type: mech.type,\n handled: mech.handled,\n synthetic: typeof mech.synthetic === \"boolean\" ? mech.synthetic : undefined,\n };\n}\n\nexport function buildServerErrorEnvelope(\n input: ServerErrorEnvelopeInput\n): Envelope {\n const {\n error,\n request,\n buildId,\n releaseId,\n environment,\n runtime,\n context,\n sessionResolverDeps,\n } = input;\n\n // Multi-level session resolution\n const { sessionId, source: sessionSource } = resolveSessionId(\n request,\n sessionResolverDeps\n );\n\n // Extract Next.js-specific context and mechanism\n const nextjsContext = extractNextjsContext(context);\n const mechanism = extractMechanism(context);\n const captureSource =\n typeof context?.captureSource === \"string\"\n ? context.captureSource\n : undefined;\n\n // Build error payload matching ErrorEnvelopePayload schema\n const errorObj = error as Error;\n const errorPayload: ErrorEnvelopePayload = {\n frames: parseStackTrace(errorObj?.stack),\n message: errorObj?.message ?? String(error ?? \"Unknown error\"),\n name: errorObj?.name ?? \"Error\",\n stack: errorObj?.stack ?? null,\n errorSource: \"server\",\n ...(mechanism && { mechanism }),\n ...(nextjsContext && { nextjs: nextjsContext }),\n ...(captureSource && { captureSource }),\n };\n\n return {\n v: 0,\n runtime: normalizeRuntime(runtime),\n environment: normalizeEnv(environment),\n clientTs: Date.now(),\n sessionId,\n sessionSource,\n type: \"error\",\n payload: errorPayload,\n buildId: buildId ?? \"unknown\",\n releaseId: releaseId ?? \"unknown\",\n uuid: uuidv7(),\n };\n}\n\nexport async function sendEnvelopesToIngest(\n envelopes: Envelope[],\n ingestUrl: string,\n surfaceToken: string\n): Promise<void> {\n const response = await Effect.runPromise(\n withInterfereLogger(\n \"react\",\n Effect.promise(() =>\n fetch(ingestUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-interfere-pub-token\": surfaceToken,\n },\n body: JSON.stringify(envelopes),\n keepalive: true,\n })\n ).pipe(Effect.withSpan(\"server.sendEnvelopes\"))\n )\n );\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => \"\");\n throw new Error(\n `Failed to send envelopes to ingest: ${response.status} ${response.statusText}${\n errorText ? ` - ${errorText}` : \"\"\n }`\n );\n }\n}\n"],"mappings":"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"}
|