@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
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rage-click.service.mjs","names":[],"sources":["../../../../../src/core/plugins/impl/rage-click/rage-click.service.ts"],"sourcesContent":["import { Context, type Effect } from \"effect\";\n\ninterface RageClickServiceApi {\n readonly onClick: (input: {\n readonly now: number;\n readonly x: number;\n readonly y: number;\n readonly selector: string;\n readonly text: string;\n }) => Effect.Effect<void>;\n}\n\nexport class RageClickService extends Context.Tag(\n \"@interfere/plugins/rage-click/RageClickService\"\n)<RageClickService, RageClickServiceApi>() {}\n"],"mappings":";;;AAYA,IAAa,mBAAb,cAAsC,QAAQ,IAC5C,iDACD,EAAyC,CAAC"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { EventCapture } from "../../services/event-capture.mjs";
|
|
2
|
-
import { PluginLogger } from "../../services/plugin-logger.mjs";
|
|
3
|
-
import { RageClickService } from "./rage-click.service.mjs";
|
|
4
|
-
import { EventCaptureTestState } from "../../services/event-capture.test-layer.mjs";
|
|
5
|
-
import { PluginLoggerTestState } from "../../services/plugin-logger.test-layer.mjs";
|
|
6
|
-
import { Effect, Layer } from "effect";
|
|
7
|
-
import * as effect_Ref0 from "effect/Ref";
|
|
8
|
-
|
|
9
|
-
//#region src/core/plugins/impl/rage-click/rage-click.test-layer.d.ts
|
|
10
|
-
declare const makeRageClickTestLayer: () => Effect.Effect<{
|
|
11
|
-
layer: Layer.Layer<EventCapture | PluginLogger | RageClickService, never, never>;
|
|
12
|
-
captureStateRef: effect_Ref0.Ref<EventCaptureTestState>;
|
|
13
|
-
loggerStateRef: effect_Ref0.Ref<PluginLoggerTestState>;
|
|
14
|
-
}, never, never>;
|
|
15
|
-
//#endregion
|
|
16
|
-
export { makeRageClickTestLayer };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rage-click.test-layer.d.mts","names":[],"sources":["../../../../../src/core/plugins/impl/rage-click/rage-click.test-layer.ts"],"mappings":";;;;;;;;;cAMa,sBAAA,QAAsB,MAAA,CAAA,MAAA;qBAclC,YAAA"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { makeEventCaptureTestLayer } from "../../services/event-capture.test-layer.mjs";
|
|
2
|
-
import { makePluginLoggerTestLayer } from "../../services/plugin-logger.test-layer.mjs";
|
|
3
|
-
import { RageClickLive } from "./rage-click.layer.mjs";
|
|
4
|
-
import { Effect, Layer } from "effect";
|
|
5
|
-
|
|
6
|
-
//#region src/core/plugins/impl/rage-click/rage-click.test-layer.ts
|
|
7
|
-
const makeRageClickTestLayer = Effect.fn("makeRageClickTestLayer")(function* () {
|
|
8
|
-
const { stateRef: captureStateRef, layer: captureLayer } = yield* makeEventCaptureTestLayer();
|
|
9
|
-
const { stateRef: loggerStateRef, layer: loggerLayer } = yield* makePluginLoggerTestLayer();
|
|
10
|
-
return {
|
|
11
|
-
layer: RageClickLive.pipe(Layer.provideMerge(captureLayer), Layer.provideMerge(loggerLayer)),
|
|
12
|
-
captureStateRef,
|
|
13
|
-
loggerStateRef
|
|
14
|
-
};
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
//#endregion
|
|
18
|
-
export { makeRageClickTestLayer };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rage-click.test-layer.mjs","names":[],"sources":["../../../../../src/core/plugins/impl/rage-click/rage-click.test-layer.ts"],"sourcesContent":["import { Effect, Layer } from \"effect\";\n\nimport { makeEventCaptureTestLayer } from \"../../services/event-capture.test-layer.js\";\nimport { makePluginLoggerTestLayer } from \"../../services/plugin-logger.test-layer.js\";\nimport { RageClickLive } from \"./rage-click.layer.js\";\n\nexport const makeRageClickTestLayer = Effect.fn(\"makeRageClickTestLayer\")(\n function* () {\n const { stateRef: captureStateRef, layer: captureLayer } =\n yield* makeEventCaptureTestLayer();\n const { stateRef: loggerStateRef, layer: loggerLayer } =\n yield* makePluginLoggerTestLayer();\n\n const layer = RageClickLive.pipe(\n Layer.provideMerge(captureLayer),\n Layer.provideMerge(loggerLayer)\n );\n\n return { layer, captureStateRef, loggerStateRef };\n }\n);\n"],"mappings":";;;;;;AAMA,MAAa,yBAAyB,OAAO,GAAG,yBAAyB,CACvE,aAAa;CACX,MAAM,EAAE,UAAU,iBAAiB,OAAO,iBACxC,OAAO,2BAA2B;CACpC,MAAM,EAAE,UAAU,gBAAgB,OAAO,gBACvC,OAAO,2BAA2B;AAOpC,QAAO;EAAE,OALK,cAAc,KAC1B,MAAM,aAAa,aAAa,EAChC,MAAM,aAAa,YAAY,CAChC;EAEe;EAAiB;EAAgB;EAEpD"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { PluginDef } from "../../define-plugin.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/core/plugins/impl/replay/plugin.d.ts
|
|
4
|
-
interface ReplayAPI {
|
|
5
|
-
stop: () => void;
|
|
6
|
-
}
|
|
7
|
-
declare const _default: PluginDef<"replay", ReplayAPI>;
|
|
8
|
-
//#endregion
|
|
9
|
-
export { ReplayAPI, _default as default };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.mts","names":[],"sources":["../../../../../src/core/plugins/impl/replay/plugin.ts"],"mappings":";;;UAaiB,SAAA;EACf,IAAA;AAAA;AAAA,cACD,QAAA"}
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import { PluginRuntime } from "../../services/plugin-runtime.mjs";
|
|
2
|
-
import { definePlugin } from "../../define-plugin.mjs";
|
|
3
|
-
import { defineEvent } from "../../../events/define-event.mjs";
|
|
4
|
-
import { ReplayPluginApi, ReplayPluginApiLayer } from "./replay-plugin-api.mjs";
|
|
5
|
-
import { Effect, Option } from "effect";
|
|
6
|
-
import { record } from "rrweb";
|
|
7
|
-
|
|
8
|
-
//#region src/core/plugins/impl/replay/plugin.ts
|
|
9
|
-
let replayStarted = false;
|
|
10
|
-
let replayStopFn = null;
|
|
11
|
-
var plugin_default = definePlugin("replay", {
|
|
12
|
-
name: "replay",
|
|
13
|
-
events: [defineEvent("replay_chunk").value()],
|
|
14
|
-
layer: ReplayPluginApiLayer,
|
|
15
|
-
setup: Effect.gen(function* () {
|
|
16
|
-
const api = yield* ReplayPluginApi;
|
|
17
|
-
const runtime = yield* PluginRuntime;
|
|
18
|
-
if (typeof window === "undefined" || replayStarted || api.config.features.replay !== true) return {};
|
|
19
|
-
const stopFnOpt = yield* Effect.gen(function* () {
|
|
20
|
-
const beforeUnload = () => runtime.fork(api.flush("before_unload"));
|
|
21
|
-
const visibility = () => {
|
|
22
|
-
if (document.visibilityState === "hidden") runtime.fork(api.flush("visibility_hidden"));
|
|
23
|
-
};
|
|
24
|
-
window.addEventListener("beforeunload", beforeUnload);
|
|
25
|
-
document.addEventListener("visibilitychange", visibility);
|
|
26
|
-
const detach = () => {
|
|
27
|
-
window.removeEventListener("beforeunload", beforeUnload);
|
|
28
|
-
document.removeEventListener("visibilitychange", visibility);
|
|
29
|
-
};
|
|
30
|
-
const stopRecord = record({
|
|
31
|
-
emit: (event) => runtime.fork(api.onRecordEvent(event)),
|
|
32
|
-
sampling: {
|
|
33
|
-
mousemove: 50,
|
|
34
|
-
mouseInteraction: true,
|
|
35
|
-
scroll: 150,
|
|
36
|
-
media: 800,
|
|
37
|
-
input: "last"
|
|
38
|
-
},
|
|
39
|
-
slimDOMOptions: "all",
|
|
40
|
-
inlineStylesheet: false,
|
|
41
|
-
collectFonts: false,
|
|
42
|
-
recordCanvas: false
|
|
43
|
-
});
|
|
44
|
-
if (typeof stopRecord !== "function") {
|
|
45
|
-
detach();
|
|
46
|
-
return Option.none();
|
|
47
|
-
}
|
|
48
|
-
const intervalId = window.setInterval(() => {
|
|
49
|
-
runtime.fork(api.flush("interval"));
|
|
50
|
-
}, 1e4);
|
|
51
|
-
const stop = () => {
|
|
52
|
-
try {
|
|
53
|
-
stopRecord();
|
|
54
|
-
} catch {}
|
|
55
|
-
try {
|
|
56
|
-
window.clearInterval(intervalId);
|
|
57
|
-
} catch {}
|
|
58
|
-
detach();
|
|
59
|
-
runtime.fork(api.flush("stop"));
|
|
60
|
-
};
|
|
61
|
-
return Option.fromNullable(stop);
|
|
62
|
-
});
|
|
63
|
-
if (Option.isNone(stopFnOpt)) return {};
|
|
64
|
-
replayStopFn = stopFnOpt.value;
|
|
65
|
-
replayStarted = true;
|
|
66
|
-
const apiPublic = { stop: () => {
|
|
67
|
-
if (replayStopFn) {
|
|
68
|
-
replayStopFn();
|
|
69
|
-
replayStopFn = null;
|
|
70
|
-
replayStarted = false;
|
|
71
|
-
}
|
|
72
|
-
} };
|
|
73
|
-
return {
|
|
74
|
-
api: apiPublic,
|
|
75
|
-
cleanup: () => {
|
|
76
|
-
apiPublic.stop();
|
|
77
|
-
}
|
|
78
|
-
};
|
|
79
|
-
}).pipe(Effect.withSpan("plugins.replay.setup"))
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
//#endregion
|
|
83
|
-
export { plugin_default as default };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.mjs","names":[],"sources":["../../../../../src/core/plugins/impl/replay/plugin.ts"],"sourcesContent":["import type { eventWithTime } from \"@rrweb/types\";\nimport { Effect, Option } from \"effect\";\nimport { record, type recordOptions } from \"rrweb\";\n\nimport { defineEvent } from \"../../../events/define-event.js\";\nimport { definePlugin } from \"../../define-plugin.js\";\nimport { PluginRuntime } from \"../../services/plugin-runtime.js\";\nimport { ReplayPluginApi, ReplayPluginApiLayer } from \"./replay-plugin-api.js\";\n\n// Ensure recording starts only once across multiple setup() calls\nlet replayStarted = false;\nlet replayStopFn: (() => void) | null = null;\n\nexport interface ReplayAPI {\n stop: () => void;\n}\n\nexport default definePlugin(\"replay\", {\n name: \"replay\",\n events: [defineEvent(\"replay_chunk\").value()],\n layer: ReplayPluginApiLayer,\n setup: Effect.gen(function* () {\n const api = yield* ReplayPluginApi;\n const runtime = yield* PluginRuntime;\n\n if (\n typeof window === \"undefined\" ||\n replayStarted ||\n api.config.features.replay !== true\n ) {\n return {};\n }\n\n const startRecording = Effect.gen(function* () {\n const beforeUnload = () => runtime.fork(api.flush(\"before_unload\"));\n const visibility = () => {\n if (document.visibilityState === \"hidden\") {\n runtime.fork(api.flush(\"visibility_hidden\"));\n }\n };\n\n window.addEventListener(\"beforeunload\", beforeUnload);\n document.addEventListener(\"visibilitychange\", visibility);\n\n const detach = () => {\n window.removeEventListener(\"beforeunload\", beforeUnload);\n document.removeEventListener(\"visibilitychange\", visibility);\n };\n\n const options: recordOptions<eventWithTime> = {\n emit: (event) => runtime.fork(api.onRecordEvent(event)),\n sampling: {\n mousemove: 50,\n mouseInteraction: true,\n scroll: 150,\n media: 800,\n input: \"last\",\n },\n slimDOMOptions: \"all\",\n inlineStylesheet: false,\n collectFonts: false,\n recordCanvas: false,\n };\n\n const stopRecord = record(options);\n\n if (typeof stopRecord !== \"function\") {\n detach();\n\n return Option.none<() => void>();\n }\n\n const FLUSH_INTERVAL_MS = 10_000;\n const intervalId = window.setInterval(() => {\n runtime.fork(api.flush(\"interval\"));\n }, FLUSH_INTERVAL_MS);\n\n const stop = () => {\n try {\n stopRecord();\n } catch {\n // ignore\n }\n try {\n window.clearInterval(intervalId);\n } catch {\n // ignore\n }\n detach();\n runtime.fork(api.flush(\"stop\"));\n };\n\n return Option.fromNullable(stop);\n });\n\n const stopFnOpt = yield* startRecording;\n if (Option.isNone(stopFnOpt)) {\n return {};\n }\n\n replayStopFn = stopFnOpt.value;\n replayStarted = true;\n\n const apiPublic: ReplayAPI = {\n stop: () => {\n if (replayStopFn) {\n replayStopFn();\n replayStopFn = null;\n replayStarted = false;\n }\n },\n };\n\n return {\n api: apiPublic,\n cleanup: () => {\n apiPublic.stop();\n },\n };\n }).pipe(Effect.withSpan(\"plugins.replay.setup\")),\n});\n"],"mappings":";;;;;;;;AAUA,IAAI,gBAAgB;AACpB,IAAI,eAAoC;AAMxC,qBAAe,aAAa,UAAU;CACpC,MAAM;CACN,QAAQ,CAAC,YAAY,eAAe,CAAC,OAAO,CAAC;CAC7C,OAAO;CACP,OAAO,OAAO,IAAI,aAAa;EAC7B,MAAM,MAAM,OAAO;EACnB,MAAM,UAAU,OAAO;AAEvB,MACE,OAAO,WAAW,eAClB,iBACA,IAAI,OAAO,SAAS,WAAW,KAE/B,QAAO,EAAE;EAiEX,MAAM,YAAY,OA9DK,OAAO,IAAI,aAAa;GAC7C,MAAM,qBAAqB,QAAQ,KAAK,IAAI,MAAM,gBAAgB,CAAC;GACnE,MAAM,mBAAmB;AACvB,QAAI,SAAS,oBAAoB,SAC/B,SAAQ,KAAK,IAAI,MAAM,oBAAoB,CAAC;;AAIhD,UAAO,iBAAiB,gBAAgB,aAAa;AACrD,YAAS,iBAAiB,oBAAoB,WAAW;GAEzD,MAAM,eAAe;AACnB,WAAO,oBAAoB,gBAAgB,aAAa;AACxD,aAAS,oBAAoB,oBAAoB,WAAW;;GAkB9D,MAAM,aAAa,OAf2B;IAC5C,OAAO,UAAU,QAAQ,KAAK,IAAI,cAAc,MAAM,CAAC;IACvD,UAAU;KACR,WAAW;KACX,kBAAkB;KAClB,QAAQ;KACR,OAAO;KACP,OAAO;KACR;IACD,gBAAgB;IAChB,kBAAkB;IAClB,cAAc;IACd,cAAc;IACf,CAEiC;AAElC,OAAI,OAAO,eAAe,YAAY;AACpC,YAAQ;AAER,WAAO,OAAO,MAAkB;;GAIlC,MAAM,aAAa,OAAO,kBAAkB;AAC1C,YAAQ,KAAK,IAAI,MAAM,WAAW,CAAC;MAFX,IAGL;GAErB,MAAM,aAAa;AACjB,QAAI;AACF,iBAAY;YACN;AAGR,QAAI;AACF,YAAO,cAAc,WAAW;YAC1B;AAGR,YAAQ;AACR,YAAQ,KAAK,IAAI,MAAM,OAAO,CAAC;;AAGjC,UAAO,OAAO,aAAa,KAAK;IAChC;AAGF,MAAI,OAAO,OAAO,UAAU,CAC1B,QAAO,EAAE;AAGX,iBAAe,UAAU;AACzB,kBAAgB;EAEhB,MAAM,YAAuB,EAC3B,YAAY;AACV,OAAI,cAAc;AAChB,kBAAc;AACd,mBAAe;AACf,oBAAgB;;KAGrB;AAED,SAAO;GACL,KAAK;GACL,eAAe;AACb,cAAU,MAAM;;GAEnB;GACD,CAAC,KAAK,OAAO,SAAS,uBAAuB,CAAC;CACjD,CAAC"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { EventCapture } from "../../services/event-capture.mjs";
|
|
2
|
-
import { PluginConfig } from "../../services/plugin-config.mjs";
|
|
3
|
-
import { PluginLogger } from "../../services/plugin-logger.mjs";
|
|
4
|
-
import { Context, Effect, Layer } from "effect";
|
|
5
|
-
import { Config } from "@interfere/types/sdk/config";
|
|
6
|
-
import { eventWithTime } from "@rrweb/types";
|
|
7
|
-
|
|
8
|
-
//#region src/core/plugins/impl/replay/replay-plugin-api.d.ts
|
|
9
|
-
interface ReplayPluginApiService {
|
|
10
|
-
readonly config: Config;
|
|
11
|
-
readonly flush: (reason: string) => Effect.Effect<void>;
|
|
12
|
-
readonly onRecordEvent: (event: eventWithTime) => Effect.Effect<void>;
|
|
13
|
-
}
|
|
14
|
-
declare const ReplayPluginApi_base: Context.TagClass<ReplayPluginApi, "@interfere/plugins/replay/ReplayPluginApi", ReplayPluginApiService>;
|
|
15
|
-
declare class ReplayPluginApi extends ReplayPluginApi_base {}
|
|
16
|
-
declare const ReplayPluginApiLayer: Layer.Layer<ReplayPluginApi, never, EventCapture | PluginLogger | PluginConfig>;
|
|
17
|
-
//#endregion
|
|
18
|
-
export { ReplayPluginApi, ReplayPluginApiLayer };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"replay-plugin-api.d.mts","names":[],"sources":["../../../../../src/core/plugins/impl/replay/replay-plugin-api.ts"],"mappings":";;;;;;;;UAeU,sBAAA;EAAA,SACC,MAAA,EAAQ,MAAA;EAAA,SACR,KAAA,GAAQ,MAAA,aAAmB,MAAA,CAAO,MAAA;EAAA,SAClC,aAAA,GAAgB,KAAA,EAAO,aAAA,KAAkB,MAAA,CAAO,MAAA;AAAA;AAAA,cAAM,oBAAA;cAGpD,eAAA,SAAwB,oBAAA;AAAA,cAIxB,oBAAA,EAAoB,KAAA,CAAA,KAAA,CAAA,eAAA,SAAA,YAAA,GAAA,YAAA,GAAA,YAAA"}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { EventCapture } from "../../services/event-capture.mjs";
|
|
2
|
-
import { PluginConfig } from "../../services/plugin-config.mjs";
|
|
3
|
-
import { PluginLogger } from "../../services/plugin-logger.mjs";
|
|
4
|
-
import { Context, Effect, Layer, Ref, Schema } from "effect";
|
|
5
|
-
|
|
6
|
-
//#region src/core/plugins/impl/replay/replay-plugin-api.ts
|
|
7
|
-
const MAX_CHUNK_AGE_MS = 6e4;
|
|
8
|
-
const MAX_CHUNK_EVENTS = 100;
|
|
9
|
-
const MAX_CHUNK_SIZE_BYTES = 1e6;
|
|
10
|
-
const encodeJson = Schema.encodeSync(Schema.parseJson());
|
|
11
|
-
var ReplayPluginApi = class extends Context.Tag("@interfere/plugins/replay/ReplayPluginApi")() {};
|
|
12
|
-
const ReplayPluginApiLayer = Layer.effect(ReplayPluginApi, Effect.gen(function* () {
|
|
13
|
-
const capture = yield* EventCapture;
|
|
14
|
-
const config = (yield* PluginConfig).config;
|
|
15
|
-
const logger = yield* PluginLogger;
|
|
16
|
-
const chunkRef = yield* Ref.make([]);
|
|
17
|
-
const flush = Effect.fn("ReplayPluginApi.flush")((reason) => Effect.gen(function* () {
|
|
18
|
-
const chunk = yield* Ref.get(chunkRef);
|
|
19
|
-
if (chunk.length === 0) return;
|
|
20
|
-
yield* Ref.set(chunkRef, []);
|
|
21
|
-
yield* logger.trace("Sending replay chunk").pipe(Effect.annotateLogs({ reason }));
|
|
22
|
-
const firstTs = chunk[0]?.timestamp;
|
|
23
|
-
const lastTs = chunk.at(-1)?.timestamp;
|
|
24
|
-
yield* capture.capture("replay_chunk", {
|
|
25
|
-
ts: Date.now(),
|
|
26
|
-
count: chunk.length,
|
|
27
|
-
events: chunk.map((e) => encodeJson(e)),
|
|
28
|
-
...typeof firstTs === "number" && typeof lastTs === "number" ? {
|
|
29
|
-
first_event_ts: firstTs,
|
|
30
|
-
last_event_ts: lastTs
|
|
31
|
-
} : {}
|
|
32
|
-
}).pipe(Effect.withSpan("plugin.replay.send_chunk"));
|
|
33
|
-
}));
|
|
34
|
-
const onRecordEvent = Effect.fn("ReplayPluginApi.onRecordEvent")((event) => Effect.gen(function* () {
|
|
35
|
-
const first = (yield* Ref.get(chunkRef)).at(0);
|
|
36
|
-
if (first && event.timestamp - first.timestamp > MAX_CHUNK_AGE_MS) yield* flush("max_age");
|
|
37
|
-
const nextChunk = [...yield* Ref.get(chunkRef), event];
|
|
38
|
-
yield* Ref.set(chunkRef, nextChunk);
|
|
39
|
-
const estimatedSize = encodeJson(nextChunk).length;
|
|
40
|
-
if (nextChunk.length >= MAX_CHUNK_EVENTS || estimatedSize > MAX_CHUNK_SIZE_BYTES) yield* flush("threshold");
|
|
41
|
-
}));
|
|
42
|
-
return ReplayPluginApi.of({
|
|
43
|
-
config,
|
|
44
|
-
onRecordEvent,
|
|
45
|
-
flush
|
|
46
|
-
});
|
|
47
|
-
}));
|
|
48
|
-
|
|
49
|
-
//#endregion
|
|
50
|
-
export { ReplayPluginApi, ReplayPluginApiLayer };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"replay-plugin-api.mjs","names":[],"sources":["../../../../../src/core/plugins/impl/replay/replay-plugin-api.ts"],"sourcesContent":["import type { Config } from \"@interfere/types/sdk/config\";\n\nimport type { eventWithTime } from \"@rrweb/types\";\nimport { Context, Effect, Layer, Ref, Schema } from \"effect\";\n\nimport { EventCapture } from \"../../services/event-capture.js\";\nimport { PluginConfig } from \"../../services/plugin-config.js\";\nimport { PluginLogger } from \"../../services/plugin-logger.js\";\n\nconst MAX_CHUNK_AGE_MS = 60_000;\nconst MAX_CHUNK_EVENTS = 100;\nconst MAX_CHUNK_SIZE_BYTES = 1_000_000;\n\nconst encodeJson = Schema.encodeSync(Schema.parseJson());\n\ninterface ReplayPluginApiService {\n readonly config: Config;\n readonly flush: (reason: string) => Effect.Effect<void>;\n readonly onRecordEvent: (event: eventWithTime) => Effect.Effect<void>;\n}\n\nexport class ReplayPluginApi extends Context.Tag(\n \"@interfere/plugins/replay/ReplayPluginApi\"\n)<ReplayPluginApi, ReplayPluginApiService>() {}\n\nexport const ReplayPluginApiLayer = Layer.effect(\n ReplayPluginApi,\n Effect.gen(function* () {\n const capture = yield* EventCapture;\n const config = (yield* PluginConfig).config;\n const logger = yield* PluginLogger;\n\n const chunkRef = yield* Ref.make<readonly eventWithTime[]>([]);\n\n const flush = Effect.fn(\"ReplayPluginApi.flush\")((reason: string) =>\n Effect.gen(function* () {\n const chunk = yield* Ref.get(chunkRef);\n if (chunk.length === 0) {\n return;\n }\n\n yield* Ref.set(chunkRef, []);\n yield* logger\n .trace(\"Sending replay chunk\")\n .pipe(Effect.annotateLogs({ reason }));\n\n const firstTs = chunk[0]?.timestamp;\n const lastTs = chunk.at(-1)?.timestamp;\n yield* capture\n .capture(\"replay_chunk\", {\n ts: Date.now(),\n count: chunk.length,\n events: chunk.map((e) => encodeJson(e)),\n ...(typeof firstTs === \"number\" && typeof lastTs === \"number\"\n ? { first_event_ts: firstTs, last_event_ts: lastTs }\n : {}),\n })\n .pipe(Effect.withSpan(\"plugin.replay.send_chunk\"));\n })\n );\n\n const onRecordEvent = Effect.fn(\"ReplayPluginApi.onRecordEvent\")(\n (event: eventWithTime) =>\n Effect.gen(function* () {\n const chunk = yield* Ref.get(chunkRef);\n const first = chunk.at(0);\n if (first && event.timestamp - first.timestamp > MAX_CHUNK_AGE_MS) {\n yield* flush(\"max_age\");\n }\n\n const nextChunk = [...(yield* Ref.get(chunkRef)), event];\n yield* Ref.set(chunkRef, nextChunk);\n\n const estimatedSize = encodeJson(nextChunk).length;\n if (\n nextChunk.length >= MAX_CHUNK_EVENTS ||\n estimatedSize > MAX_CHUNK_SIZE_BYTES\n ) {\n yield* flush(\"threshold\");\n }\n })\n );\n\n return ReplayPluginApi.of({\n config,\n onRecordEvent,\n flush,\n });\n })\n);\n"],"mappings":";;;;;;AASA,MAAM,mBAAmB;AACzB,MAAM,mBAAmB;AACzB,MAAM,uBAAuB;AAE7B,MAAM,aAAa,OAAO,WAAW,OAAO,WAAW,CAAC;AAQxD,IAAa,kBAAb,cAAqC,QAAQ,IAC3C,4CACD,EAA2C,CAAC;AAE7C,MAAa,uBAAuB,MAAM,OACxC,iBACA,OAAO,IAAI,aAAa;CACtB,MAAM,UAAU,OAAO;CACvB,MAAM,UAAU,OAAO,cAAc;CACrC,MAAM,SAAS,OAAO;CAEtB,MAAM,WAAW,OAAO,IAAI,KAA+B,EAAE,CAAC;CAE9D,MAAM,QAAQ,OAAO,GAAG,wBAAwB,EAAE,WAChD,OAAO,IAAI,aAAa;EACtB,MAAM,QAAQ,OAAO,IAAI,IAAI,SAAS;AACtC,MAAI,MAAM,WAAW,EACnB;AAGF,SAAO,IAAI,IAAI,UAAU,EAAE,CAAC;AAC5B,SAAO,OACJ,MAAM,uBAAuB,CAC7B,KAAK,OAAO,aAAa,EAAE,QAAQ,CAAC,CAAC;EAExC,MAAM,UAAU,MAAM,IAAI;EAC1B,MAAM,SAAS,MAAM,GAAG,GAAG,EAAE;AAC7B,SAAO,QACJ,QAAQ,gBAAgB;GACvB,IAAI,KAAK,KAAK;GACd,OAAO,MAAM;GACb,QAAQ,MAAM,KAAK,MAAM,WAAW,EAAE,CAAC;GACvC,GAAI,OAAO,YAAY,YAAY,OAAO,WAAW,WACjD;IAAE,gBAAgB;IAAS,eAAe;IAAQ,GAClD,EAAE;GACP,CAAC,CACD,KAAK,OAAO,SAAS,2BAA2B,CAAC;GACpD,CACH;CAED,MAAM,gBAAgB,OAAO,GAAG,gCAAgC,EAC7D,UACC,OAAO,IAAI,aAAa;EAEtB,MAAM,SADQ,OAAO,IAAI,IAAI,SAAS,EAClB,GAAG,EAAE;AACzB,MAAI,SAAS,MAAM,YAAY,MAAM,YAAY,iBAC/C,QAAO,MAAM,UAAU;EAGzB,MAAM,YAAY,CAAC,GAAI,OAAO,IAAI,IAAI,SAAS,EAAG,MAAM;AACxD,SAAO,IAAI,IAAI,UAAU,UAAU;EAEnC,MAAM,gBAAgB,WAAW,UAAU,CAAC;AAC5C,MACE,UAAU,UAAU,oBACpB,gBAAgB,qBAEhB,QAAO,MAAM,YAAY;GAE3B,CACL;AAED,QAAO,gBAAgB,GAAG;EACxB;EACA;EACA;EACD,CAAC;EACF,CACH"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { PluginDef } from "../../define-plugin.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/core/plugins/impl/server-tracing/plugin.d.ts
|
|
4
|
-
type ServerTracingAPI = null;
|
|
5
|
-
/**
|
|
6
|
-
* Server tracing plugin - adds x-interfere-request headers to same-origin requests.
|
|
7
|
-
*
|
|
8
|
-
* This enables request/response correlation in server-side error tracking.
|
|
9
|
-
* The plugin patches fetch and XMLHttpRequest to inject tracing headers.
|
|
10
|
-
*/
|
|
11
|
-
declare const _default: PluginDef<"serverTracing", unknown>;
|
|
12
|
-
//#endregion
|
|
13
|
-
export { ServerTracingAPI, _default as default };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.mts","names":[],"sources":["../../../../../src/core/plugins/impl/server-tracing/plugin.ts"],"mappings":";;;KAeY,gBAAA;;;AAAZ;;;;cAAoC,QAAA"}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import { definePlugin } from "../../define-plugin.mjs";
|
|
2
|
-
import { ServerTracingPluginApi, ServerTracingPluginApiLayer } from "./server-tracing-plugin-api.mjs";
|
|
3
|
-
import { X_INTERFERE_REQUEST_HEADER, createRequestHeader, extractUrlFromFetchInput, generateRequestId, shouldTraceUrl } from "./tracing-logic.mjs";
|
|
4
|
-
import { Effect } from "effect";
|
|
5
|
-
|
|
6
|
-
//#region src/core/plugins/impl/server-tracing/plugin.ts
|
|
7
|
-
/**
|
|
8
|
-
* Server tracing plugin - adds x-interfere-request headers to same-origin requests.
|
|
9
|
-
*
|
|
10
|
-
* This enables request/response correlation in server-side error tracking.
|
|
11
|
-
* The plugin patches fetch and XMLHttpRequest to inject tracing headers.
|
|
12
|
-
*/
|
|
13
|
-
var plugin_default = definePlugin("serverTracing", {
|
|
14
|
-
name: "serverTracing",
|
|
15
|
-
layer: ServerTracingPluginApiLayer,
|
|
16
|
-
setup: Effect.gen(function* () {
|
|
17
|
-
const api = yield* ServerTracingPluginApi;
|
|
18
|
-
if (typeof window === "undefined") {
|
|
19
|
-
yield* api.log.debug("serverTracing: SSR - skipping setup");
|
|
20
|
-
return {};
|
|
21
|
-
}
|
|
22
|
-
const tracingOrigins = true;
|
|
23
|
-
const currentOrigin = window.location.origin;
|
|
24
|
-
const baseUrl = window.location.href;
|
|
25
|
-
yield* api.log.debug("serverTracing: patching fetch and XMLHttpRequest");
|
|
26
|
-
const originalFetch = window.fetch.bind(window);
|
|
27
|
-
const patchedFetch = (input, init) => {
|
|
28
|
-
if (!shouldTraceUrl(extractUrlFromFetchInput(input, baseUrl), currentOrigin, tracingOrigins)) return originalFetch(input, init);
|
|
29
|
-
const headerValue = createRequestHeader(api.getSessionIdSync(), generateRequestId());
|
|
30
|
-
const headers = new Headers(init?.headers);
|
|
31
|
-
if (input instanceof Request) {
|
|
32
|
-
for (const [key, value] of input.headers.entries()) if (!headers.has(key)) headers.set(key, value);
|
|
33
|
-
}
|
|
34
|
-
headers.set(X_INTERFERE_REQUEST_HEADER, headerValue);
|
|
35
|
-
if (input instanceof Request) return originalFetch(new Request(input, { headers }));
|
|
36
|
-
return originalFetch(input, {
|
|
37
|
-
...init,
|
|
38
|
-
headers
|
|
39
|
-
});
|
|
40
|
-
};
|
|
41
|
-
window.fetch = patchedFetch;
|
|
42
|
-
const originalXHROpen = XMLHttpRequest.prototype.open;
|
|
43
|
-
const originalXHRSend = XMLHttpRequest.prototype.send;
|
|
44
|
-
const originalSetRequestHeader = XMLHttpRequest.prototype.setRequestHeader;
|
|
45
|
-
const injectHeader = (xhr) => {
|
|
46
|
-
if (xhr._interfereHeaderSet) return;
|
|
47
|
-
const url = xhr._interfereUrl;
|
|
48
|
-
if (!(url && shouldTraceUrl(url, currentOrigin, tracingOrigins))) return;
|
|
49
|
-
const headerValue = createRequestHeader(api.getSessionIdSync(), generateRequestId());
|
|
50
|
-
originalSetRequestHeader.call(xhr, X_INTERFERE_REQUEST_HEADER, headerValue);
|
|
51
|
-
xhr._interfereHeaderSet = true;
|
|
52
|
-
};
|
|
53
|
-
XMLHttpRequest.prototype.open = function(method, url, ...rest) {
|
|
54
|
-
this._interfereUrl = typeof url === "string" ? url : url.href;
|
|
55
|
-
return originalXHROpen.call(this, method, url, ...rest);
|
|
56
|
-
};
|
|
57
|
-
XMLHttpRequest.prototype.setRequestHeader = function(name, value) {
|
|
58
|
-
injectHeader(this);
|
|
59
|
-
return originalSetRequestHeader.call(this, name, value);
|
|
60
|
-
};
|
|
61
|
-
XMLHttpRequest.prototype.send = function(body) {
|
|
62
|
-
injectHeader(this);
|
|
63
|
-
return originalXHRSend.call(this, body);
|
|
64
|
-
};
|
|
65
|
-
return { cleanup: () => {
|
|
66
|
-
window.fetch = originalFetch;
|
|
67
|
-
XMLHttpRequest.prototype.open = originalXHROpen;
|
|
68
|
-
XMLHttpRequest.prototype.send = originalXHRSend;
|
|
69
|
-
XMLHttpRequest.prototype.setRequestHeader = originalSetRequestHeader;
|
|
70
|
-
} };
|
|
71
|
-
}).pipe(Effect.withSpan("plugins.serverTracing.setup"))
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
//#endregion
|
|
75
|
-
export { plugin_default as default };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.mjs","names":[],"sources":["../../../../../src/core/plugins/impl/server-tracing/plugin.ts"],"sourcesContent":["import { Effect } from \"effect\";\n\nimport { definePlugin } from \"../../define-plugin.js\";\nimport {\n ServerTracingPluginApi,\n ServerTracingPluginApiLayer,\n} from \"./server-tracing-plugin-api.js\";\nimport {\n createRequestHeader,\n extractUrlFromFetchInput,\n generateRequestId,\n shouldTraceUrl,\n X_INTERFERE_REQUEST_HEADER,\n} from \"./tracing-logic.js\";\n\nexport type ServerTracingAPI = null;\n\n/**\n * Server tracing plugin - adds x-interfere-request headers to same-origin requests.\n *\n * This enables request/response correlation in server-side error tracking.\n * The plugin patches fetch and XMLHttpRequest to inject tracing headers.\n */\nexport default definePlugin(\"serverTracing\", {\n name: \"serverTracing\",\n layer: ServerTracingPluginApiLayer,\n setup: Effect.gen(function* () {\n const api = yield* ServerTracingPluginApi;\n\n if (typeof window === \"undefined\") {\n yield* api.log.debug(\"serverTracing: SSR - skipping setup\");\n return {};\n }\n\n const tracingOrigins = true;\n const currentOrigin = window.location.origin;\n const baseUrl = window.location.href;\n\n yield* api.log.debug(\"serverTracing: patching fetch and XMLHttpRequest\");\n\n const originalFetch = window.fetch.bind(window);\n\n const patchedFetch: typeof window.fetch = (input, init) => {\n const url = extractUrlFromFetchInput(input, baseUrl);\n\n if (!shouldTraceUrl(url, currentOrigin, tracingOrigins)) {\n return originalFetch(input, init);\n }\n\n const sessionId = api.getSessionIdSync();\n const requestId = generateRequestId();\n const headerValue = createRequestHeader(sessionId, requestId);\n\n const headers = new Headers(init?.headers);\n if (input instanceof Request) {\n for (const [key, value] of input.headers.entries()) {\n if (!headers.has(key)) {\n headers.set(key, value);\n }\n }\n }\n headers.set(X_INTERFERE_REQUEST_HEADER, headerValue);\n\n if (input instanceof Request) {\n return originalFetch(new Request(input, { headers }));\n }\n\n return originalFetch(input, { ...init, headers });\n };\n\n window.fetch = patchedFetch;\n\n const originalXHROpen = XMLHttpRequest.prototype.open;\n const originalXHRSend = XMLHttpRequest.prototype.send;\n const originalSetRequestHeader = XMLHttpRequest.prototype.setRequestHeader;\n\n type TrackedXHR = XMLHttpRequest & {\n _interfereUrl?: string;\n _interfereHeaderSet?: boolean;\n };\n\n const injectHeader = (xhr: TrackedXHR) => {\n if (xhr._interfereHeaderSet) {\n return;\n }\n\n const url = xhr._interfereUrl;\n if (!(url && shouldTraceUrl(url, currentOrigin, tracingOrigins))) {\n return;\n }\n\n const sessionId = api.getSessionIdSync();\n const requestId = generateRequestId();\n const headerValue = createRequestHeader(sessionId, requestId);\n\n originalSetRequestHeader.call(\n xhr,\n X_INTERFERE_REQUEST_HEADER,\n headerValue\n );\n xhr._interfereHeaderSet = true;\n };\n\n XMLHttpRequest.prototype.open = function (\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ) {\n (this as TrackedXHR)._interfereUrl =\n typeof url === \"string\" ? url : url.href;\n // biome-ignore lint/suspicious/noExplicitAny: XMLHttpRequest.open has variable arity\n return (originalXHROpen as any).call(this, method, url, ...rest);\n };\n\n XMLHttpRequest.prototype.setRequestHeader = function (\n name: string,\n value: string\n ) {\n injectHeader(this as TrackedXHR);\n return originalSetRequestHeader.call(this, name, value);\n };\n\n XMLHttpRequest.prototype.send = function (\n body?: XMLHttpRequestBodyInit | null\n ) {\n injectHeader(this as TrackedXHR);\n return originalXHRSend.call(this, body);\n };\n\n return {\n cleanup: () => {\n window.fetch = originalFetch;\n XMLHttpRequest.prototype.open = originalXHROpen;\n XMLHttpRequest.prototype.send = originalXHRSend;\n XMLHttpRequest.prototype.setRequestHeader = originalSetRequestHeader;\n },\n };\n }).pipe(Effect.withSpan(\"plugins.serverTracing.setup\")),\n});\n"],"mappings":";;;;;;;;;;;;AAuBA,qBAAe,aAAa,iBAAiB;CAC3C,MAAM;CACN,OAAO;CACP,OAAO,OAAO,IAAI,aAAa;EAC7B,MAAM,MAAM,OAAO;AAEnB,MAAI,OAAO,WAAW,aAAa;AACjC,UAAO,IAAI,IAAI,MAAM,sCAAsC;AAC3D,UAAO,EAAE;;EAGX,MAAM,iBAAiB;EACvB,MAAM,gBAAgB,OAAO,SAAS;EACtC,MAAM,UAAU,OAAO,SAAS;AAEhC,SAAO,IAAI,IAAI,MAAM,mDAAmD;EAExE,MAAM,gBAAgB,OAAO,MAAM,KAAK,OAAO;EAE/C,MAAM,gBAAqC,OAAO,SAAS;AAGzD,OAAI,CAAC,eAFO,yBAAyB,OAAO,QAAQ,EAE3B,eAAe,eAAe,CACrD,QAAO,cAAc,OAAO,KAAK;GAKnC,MAAM,cAAc,oBAFF,IAAI,kBAAkB,EACtB,mBAAmB,CACwB;GAE7D,MAAM,UAAU,IAAI,QAAQ,MAAM,QAAQ;AAC1C,OAAI,iBAAiB,SACnB;SAAK,MAAM,CAAC,KAAK,UAAU,MAAM,QAAQ,SAAS,CAChD,KAAI,CAAC,QAAQ,IAAI,IAAI,CACnB,SAAQ,IAAI,KAAK,MAAM;;AAI7B,WAAQ,IAAI,4BAA4B,YAAY;AAEpD,OAAI,iBAAiB,QACnB,QAAO,cAAc,IAAI,QAAQ,OAAO,EAAE,SAAS,CAAC,CAAC;AAGvD,UAAO,cAAc,OAAO;IAAE,GAAG;IAAM;IAAS,CAAC;;AAGnD,SAAO,QAAQ;EAEf,MAAM,kBAAkB,eAAe,UAAU;EACjD,MAAM,kBAAkB,eAAe,UAAU;EACjD,MAAM,2BAA2B,eAAe,UAAU;EAO1D,MAAM,gBAAgB,QAAoB;AACxC,OAAI,IAAI,oBACN;GAGF,MAAM,MAAM,IAAI;AAChB,OAAI,EAAE,OAAO,eAAe,KAAK,eAAe,eAAe,EAC7D;GAKF,MAAM,cAAc,oBAFF,IAAI,kBAAkB,EACtB,mBAAmB,CACwB;AAE7D,4BAAyB,KACvB,KACA,4BACA,YACD;AACD,OAAI,sBAAsB;;AAG5B,iBAAe,UAAU,OAAO,SAC9B,QACA,KACA,GAAG,MACH;AACA,GAAC,KAAoB,gBACnB,OAAO,QAAQ,WAAW,MAAM,IAAI;AAEtC,UAAQ,gBAAwB,KAAK,MAAM,QAAQ,KAAK,GAAG,KAAK;;AAGlE,iBAAe,UAAU,mBAAmB,SAC1C,MACA,OACA;AACA,gBAAa,KAAmB;AAChC,UAAO,yBAAyB,KAAK,MAAM,MAAM,MAAM;;AAGzD,iBAAe,UAAU,OAAO,SAC9B,MACA;AACA,gBAAa,KAAmB;AAChC,UAAO,gBAAgB,KAAK,MAAM,KAAK;;AAGzC,SAAO,EACL,eAAe;AACb,UAAO,QAAQ;AACf,kBAAe,UAAU,OAAO;AAChC,kBAAe,UAAU,OAAO;AAChC,kBAAe,UAAU,mBAAmB;KAE/C;GACD,CAAC,KAAK,OAAO,SAAS,8BAA8B,CAAC;CACxD,CAAC"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { PluginLogger } from "../../services/plugin-logger.mjs";
|
|
2
|
-
import { SessionInfo } from "../../services/session-info.mjs";
|
|
3
|
-
import { Context, Effect, Layer } from "effect";
|
|
4
|
-
|
|
5
|
-
//#region src/core/plugins/impl/server-tracing/server-tracing-plugin-api.d.ts
|
|
6
|
-
interface ServerTracingPluginApiService {
|
|
7
|
-
readonly getSessionIdSync: () => string | null;
|
|
8
|
-
readonly log: {
|
|
9
|
-
readonly debug: (message: string) => Effect.Effect<void>;
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
declare const ServerTracingPluginApi_base: Context.TagClass<ServerTracingPluginApi, "@interfere/plugins/server-tracing/ServerTracingPluginApi", ServerTracingPluginApiService>;
|
|
13
|
-
declare class ServerTracingPluginApi extends ServerTracingPluginApi_base {}
|
|
14
|
-
declare const ServerTracingPluginApiLayer: Layer.Layer<ServerTracingPluginApi, never, PluginLogger | SessionInfo>;
|
|
15
|
-
//#endregion
|
|
16
|
-
export { ServerTracingPluginApi, ServerTracingPluginApiLayer };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server-tracing-plugin-api.d.mts","names":[],"sources":["../../../../../src/core/plugins/impl/server-tracing/server-tracing-plugin-api.ts"],"mappings":";;;;;UAKU,6BAAA;EAAA,SACC,gBAAA;EAAA,SACA,GAAA;IAAA,SACE,KAAA,GAAQ,OAAA,aAAoB,MAAA,CAAO,MAAA;EAAA;AAAA;AAAA,cAAM,2BAAA;cAIzC,sBAAA,SAA+B,2BAAA;AAAA,cAI/B,2BAAA,EAA2B,KAAA,CAAA,KAAA,CAAA,sBAAA,SAAA,YAAA,GAAA,WAAA"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { PluginLogger } from "../../services/plugin-logger.mjs";
|
|
2
|
-
import { SessionInfo } from "../../services/session-info.mjs";
|
|
3
|
-
import { Context, Effect, Layer } from "effect";
|
|
4
|
-
|
|
5
|
-
//#region src/core/plugins/impl/server-tracing/server-tracing-plugin-api.ts
|
|
6
|
-
var ServerTracingPluginApi = class extends Context.Tag("@interfere/plugins/server-tracing/ServerTracingPluginApi")() {};
|
|
7
|
-
const ServerTracingPluginApiLayer = Layer.effect(ServerTracingPluginApi, Effect.gen(function* () {
|
|
8
|
-
const logger = yield* PluginLogger;
|
|
9
|
-
const session = yield* SessionInfo;
|
|
10
|
-
return ServerTracingPluginApi.of({
|
|
11
|
-
getSessionIdSync: session.getSessionIdSync,
|
|
12
|
-
log: { debug: logger.debug }
|
|
13
|
-
});
|
|
14
|
-
}));
|
|
15
|
-
|
|
16
|
-
//#endregion
|
|
17
|
-
export { ServerTracingPluginApi, ServerTracingPluginApiLayer };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server-tracing-plugin-api.mjs","names":[],"sources":["../../../../../src/core/plugins/impl/server-tracing/server-tracing-plugin-api.ts"],"sourcesContent":["import { Context, Effect, Layer } from \"effect\";\n\nimport { PluginLogger } from \"../../services/plugin-logger.js\";\nimport { SessionInfo } from \"../../services/session-info.js\";\n\ninterface ServerTracingPluginApiService {\n readonly getSessionIdSync: () => string | null;\n readonly log: {\n readonly debug: (message: string) => Effect.Effect<void>;\n };\n}\n\nexport class ServerTracingPluginApi extends Context.Tag(\n \"@interfere/plugins/server-tracing/ServerTracingPluginApi\"\n)<ServerTracingPluginApi, ServerTracingPluginApiService>() {}\n\nexport const ServerTracingPluginApiLayer = Layer.effect(\n ServerTracingPluginApi,\n Effect.gen(function* () {\n const logger = yield* PluginLogger;\n const session = yield* SessionInfo;\n\n return ServerTracingPluginApi.of({\n getSessionIdSync: session.getSessionIdSync,\n log: {\n debug: logger.debug,\n },\n });\n })\n);\n"],"mappings":";;;;;AAYA,IAAa,yBAAb,cAA4C,QAAQ,IAClD,2DACD,EAAyD,CAAC;AAE3D,MAAa,8BAA8B,MAAM,OAC/C,wBACA,OAAO,IAAI,aAAa;CACtB,MAAM,SAAS,OAAO;CACtB,MAAM,UAAU,OAAO;AAEvB,QAAO,uBAAuB,GAAG;EAC/B,kBAAkB,QAAQ;EAC1B,KAAK,EACH,OAAO,OAAO,OACf;EACF,CAAC;EACF,CACH"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
//#region src/core/plugins/impl/server-tracing/tracing-logic.d.ts
|
|
2
|
-
declare const X_INTERFERE_REQUEST_HEADER = "x-interfere-request";
|
|
3
|
-
/**
|
|
4
|
-
* Generate a unique request ID using nanoid.
|
|
5
|
-
*/
|
|
6
|
-
declare function generateRequestId(): string;
|
|
7
|
-
/**
|
|
8
|
-
* Create the x-interfere-request header value.
|
|
9
|
-
* Format: {sessionId}/{requestId}
|
|
10
|
-
*/
|
|
11
|
-
declare function createRequestHeader(sessionId: string | null, requestId: string): string;
|
|
12
|
-
/**
|
|
13
|
-
* Check if a URL matches the tracing origins configuration.
|
|
14
|
-
*
|
|
15
|
-
* @param url - The URL to check (should be absolute)
|
|
16
|
-
* @param currentOrigin - The current page origin for same-origin checks
|
|
17
|
-
* @param tracingOrigins - Configuration: true for same-origin, or array of patterns
|
|
18
|
-
*/
|
|
19
|
-
declare function shouldTraceUrl(url: string, currentOrigin: string, tracingOrigins: boolean | (string | RegExp)[]): boolean;
|
|
20
|
-
/**
|
|
21
|
-
* Normalize a URL to absolute form.
|
|
22
|
-
*/
|
|
23
|
-
declare function normalizeUrl(url: string, baseUrl: string): string;
|
|
24
|
-
/**
|
|
25
|
-
* Extract URL string from various fetch input types.
|
|
26
|
-
*/
|
|
27
|
-
declare function extractUrlFromFetchInput(input: RequestInfo | URL, baseUrl: string): string;
|
|
28
|
-
//#endregion
|
|
29
|
-
export { X_INTERFERE_REQUEST_HEADER, createRequestHeader, extractUrlFromFetchInput, generateRequestId, normalizeUrl, shouldTraceUrl };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tracing-logic.d.mts","names":[],"sources":["../../../../../src/core/plugins/impl/server-tracing/tracing-logic.ts"],"mappings":";cAEM,0BAAA;;;;iBAKU,iBAAA,CAAA;;AAAhB;;;iBAQgB,mBAAA,CACd,SAAA,iBACA,SAAA;;AAFF;;;;;AAcA;iBAAgB,cAAA,CACd,GAAA,UACA,aAAA,UACA,cAAA,sBAAoC,MAAA;;;;iBA8BtB,YAAA,CAAa,GAAA,UAAa,OAAA;;;;iBAW1B,wBAAA,CACd,KAAA,EAAO,WAAA,GAAc,GAAA,EACrB,OAAA"}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { nanoid } from "nanoid";
|
|
2
|
-
|
|
3
|
-
//#region src/core/plugins/impl/server-tracing/tracing-logic.ts
|
|
4
|
-
const X_INTERFERE_REQUEST_HEADER = "x-interfere-request";
|
|
5
|
-
/**
|
|
6
|
-
* Generate a unique request ID using nanoid.
|
|
7
|
-
*/
|
|
8
|
-
function generateRequestId() {
|
|
9
|
-
return nanoid();
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Create the x-interfere-request header value.
|
|
13
|
-
* Format: {sessionId}/{requestId}
|
|
14
|
-
*/
|
|
15
|
-
function createRequestHeader(sessionId, requestId) {
|
|
16
|
-
return `${sessionId ?? ""}/${requestId}`;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Check if a URL matches the tracing origins configuration.
|
|
20
|
-
*
|
|
21
|
-
* @param url - The URL to check (should be absolute)
|
|
22
|
-
* @param currentOrigin - The current page origin for same-origin checks
|
|
23
|
-
* @param tracingOrigins - Configuration: true for same-origin, or array of patterns
|
|
24
|
-
*/
|
|
25
|
-
function shouldTraceUrl(url, currentOrigin, tracingOrigins) {
|
|
26
|
-
if (!tracingOrigins) return false;
|
|
27
|
-
if (tracingOrigins === true) try {
|
|
28
|
-
return new URL(url).origin === currentOrigin;
|
|
29
|
-
} catch {
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
|
-
for (const pattern of tracingOrigins) if (typeof pattern === "string" && url.includes(pattern) || pattern instanceof RegExp && pattern.test(url)) return true;
|
|
33
|
-
return false;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Normalize a URL to absolute form.
|
|
37
|
-
*/
|
|
38
|
-
function normalizeUrl(url, baseUrl) {
|
|
39
|
-
try {
|
|
40
|
-
return new URL(url, baseUrl).href;
|
|
41
|
-
} catch {
|
|
42
|
-
return url;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Extract URL string from various fetch input types.
|
|
47
|
-
*/
|
|
48
|
-
function extractUrlFromFetchInput(input, baseUrl) {
|
|
49
|
-
if (typeof input === "string") return normalizeUrl(input, baseUrl);
|
|
50
|
-
if (input instanceof URL) return input.href;
|
|
51
|
-
return normalizeUrl(input.url, baseUrl);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
//#endregion
|
|
55
|
-
export { X_INTERFERE_REQUEST_HEADER, createRequestHeader, extractUrlFromFetchInput, generateRequestId, normalizeUrl, shouldTraceUrl };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tracing-logic.mjs","names":[],"sources":["../../../../../src/core/plugins/impl/server-tracing/tracing-logic.ts"],"sourcesContent":["import { nanoid } from \"nanoid\";\n\nconst X_INTERFERE_REQUEST_HEADER = \"x-interfere-request\";\n\n/**\n * Generate a unique request ID using nanoid.\n */\nexport function generateRequestId(): string {\n return nanoid();\n}\n\n/**\n * Create the x-interfere-request header value.\n * Format: {sessionId}/{requestId}\n */\nexport function createRequestHeader(\n sessionId: string | null,\n requestId: string\n): string {\n return `${sessionId ?? \"\"}/${requestId}`;\n}\n\n/**\n * Check if a URL matches the tracing origins configuration.\n *\n * @param url - The URL to check (should be absolute)\n * @param currentOrigin - The current page origin for same-origin checks\n * @param tracingOrigins - Configuration: true for same-origin, or array of patterns\n */\nexport function shouldTraceUrl(\n url: string,\n currentOrigin: string,\n tracingOrigins: boolean | (string | RegExp)[]\n): boolean {\n if (!tracingOrigins) {\n return false;\n }\n\n if (tracingOrigins === true) {\n try {\n const urlObj = new URL(url);\n return urlObj.origin === currentOrigin;\n } catch {\n return false;\n }\n }\n\n for (const pattern of tracingOrigins) {\n if (\n (typeof pattern === \"string\" && url.includes(pattern)) ||\n (pattern instanceof RegExp && pattern.test(url))\n ) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Normalize a URL to absolute form.\n */\nexport function normalizeUrl(url: string, baseUrl: string): string {\n try {\n return new URL(url, baseUrl).href;\n } catch {\n return url;\n }\n}\n\n/**\n * Extract URL string from various fetch input types.\n */\nexport function extractUrlFromFetchInput(\n input: RequestInfo | URL,\n baseUrl: string\n): string {\n if (typeof input === \"string\") {\n return normalizeUrl(input, baseUrl);\n }\n if (input instanceof URL) {\n return input.href;\n }\n return normalizeUrl(input.url, baseUrl);\n}\n\nexport { X_INTERFERE_REQUEST_HEADER };\n"],"mappings":";;;AAEA,MAAM,6BAA6B;;;;AAKnC,SAAgB,oBAA4B;AAC1C,QAAO,QAAQ;;;;;;AAOjB,SAAgB,oBACd,WACA,WACQ;AACR,QAAO,GAAG,aAAa,GAAG,GAAG;;;;;;;;;AAU/B,SAAgB,eACd,KACA,eACA,gBACS;AACT,KAAI,CAAC,eACH,QAAO;AAGT,KAAI,mBAAmB,KACrB,KAAI;AAEF,SADe,IAAI,IAAI,IAAI,CACb,WAAW;SACnB;AACN,SAAO;;AAIX,MAAK,MAAM,WAAW,eACpB,KACG,OAAO,YAAY,YAAY,IAAI,SAAS,QAAQ,IACpD,mBAAmB,UAAU,QAAQ,KAAK,IAAI,CAE/C,QAAO;AAIX,QAAO;;;;;AAMT,SAAgB,aAAa,KAAa,SAAyB;AACjE,KAAI;AACF,SAAO,IAAI,IAAI,KAAK,QAAQ,CAAC;SACvB;AACN,SAAO;;;;;;AAOX,SAAgB,yBACd,OACA,SACQ;AACR,KAAI,OAAO,UAAU,SACnB,QAAO,aAAa,OAAO,QAAQ;AAErC,KAAI,iBAAiB,IACnB,QAAO,MAAM;AAEf,QAAO,aAAa,MAAM,KAAK,QAAQ"}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import { PluginDef } from "./define-plugin.mjs";
|
|
2
|
-
import { ConfigTag } from "../../effect/tags.mjs";
|
|
3
|
-
import { QueueServiceTag } from "../../effect/layers/queue.layer.mjs";
|
|
4
|
-
import { ContextServiceTag } from "../../effect/layers/context.layer.mjs";
|
|
5
|
-
import { SessionServiceTag } from "../../effect/layers/session.layer.mjs";
|
|
6
|
-
import { Effect } from "effect";
|
|
7
|
-
import { PluginKey } from "@interfere/types/sdk/plugins/lib/types";
|
|
8
|
-
|
|
9
|
-
//#region src/core/plugins/plugin-loader.d.ts
|
|
10
|
-
type PluginCleanup = () => void;
|
|
11
|
-
interface LoadedPlugins {
|
|
12
|
-
readonly apis: Readonly<Record<string, unknown>>;
|
|
13
|
-
readonly cleanups: readonly PluginCleanup[];
|
|
14
|
-
readonly keys: ReadonlySet<PluginKey>;
|
|
15
|
-
}
|
|
16
|
-
declare const loadAndSetupPluginsEffect: (config: ({
|
|
17
|
-
features: {
|
|
18
|
-
errors?: boolean | undefined;
|
|
19
|
-
replay?: boolean | undefined;
|
|
20
|
-
rageClick?: boolean | undefined;
|
|
21
|
-
aiSummary?: boolean | undefined;
|
|
22
|
-
pageEvents?: boolean | undefined;
|
|
23
|
-
serverTracing?: boolean | undefined;
|
|
24
|
-
};
|
|
25
|
-
metadata: {
|
|
26
|
-
buildId: string | null;
|
|
27
|
-
releaseId: string | null;
|
|
28
|
-
environment: "development" | "preview" | "production" | null;
|
|
29
|
-
runtime: "edge" | "browser" | "node" | null;
|
|
30
|
-
};
|
|
31
|
-
batch: {
|
|
32
|
-
size: number;
|
|
33
|
-
ms: number;
|
|
34
|
-
};
|
|
35
|
-
offline: {
|
|
36
|
-
enabled: boolean;
|
|
37
|
-
maxQueueSize: number;
|
|
38
|
-
};
|
|
39
|
-
} & {
|
|
40
|
-
proxyUrl: string;
|
|
41
|
-
}) | ({
|
|
42
|
-
features: {
|
|
43
|
-
errors?: boolean | undefined;
|
|
44
|
-
replay?: boolean | undefined;
|
|
45
|
-
rageClick?: boolean | undefined;
|
|
46
|
-
aiSummary?: boolean | undefined;
|
|
47
|
-
pageEvents?: boolean | undefined;
|
|
48
|
-
serverTracing?: boolean | undefined;
|
|
49
|
-
};
|
|
50
|
-
metadata: {
|
|
51
|
-
buildId: string | null;
|
|
52
|
-
releaseId: string | null;
|
|
53
|
-
environment: "development" | "preview" | "production" | null;
|
|
54
|
-
runtime: "edge" | "browser" | "node" | null;
|
|
55
|
-
};
|
|
56
|
-
batch: {
|
|
57
|
-
size: number;
|
|
58
|
-
ms: number;
|
|
59
|
-
};
|
|
60
|
-
offline: {
|
|
61
|
-
enabled: boolean;
|
|
62
|
-
maxQueueSize: number;
|
|
63
|
-
};
|
|
64
|
-
} & {
|
|
65
|
-
ingestUrl: string;
|
|
66
|
-
surfaceToken: string;
|
|
67
|
-
}), userPlugins?: readonly PluginDef<string, unknown>[] | undefined) => Effect.Effect<{
|
|
68
|
-
cleanups: readonly PluginCleanup[];
|
|
69
|
-
apis: Readonly<{
|
|
70
|
-
[x: string]: unknown;
|
|
71
|
-
}>;
|
|
72
|
-
keys: Set<"errors" | "replay" | "rageClick" | "aiSummary" | "pageEvents" | "serverTracing">;
|
|
73
|
-
}, never, QueueServiceTag | ConfigTag | ContextServiceTag | SessionServiceTag>;
|
|
74
|
-
//#endregion
|
|
75
|
-
export { LoadedPlugins, PluginCleanup, loadAndSetupPluginsEffect };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-loader.d.mts","names":[],"sources":["../../../src/core/plugins/plugin-loader.ts"],"mappings":";;;;;;;;;KAgBY,aAAA;AAAA,UAEK,aAAA;EAAA,SACN,IAAA,EAAM,QAAA,CAAS,MAAA;EAAA,SACf,QAAA,WAAmB,aAAA;EAAA,SACnB,IAAA,EAAM,WAAA,CAAY,SAAA;AAAA;AAAA,cA+DhB,yBAAA,GAAyB,MAAA"}
|