From fe31bbfb652270469e3c33febd2fd4fa5cdda822 Mon Sep 17 00:00:00 2001 From: gnezim Date: Wed, 15 Apr 2026 00:13:49 +0300 Subject: [PATCH] Add four stub analytics adapters (metrica, ctm, variocube, dynatrace) --- src/observability/analytics/adapters/ctm.ts | 18 ++++++++++++++++++ .../analytics/adapters/dynatrace.ts | 18 ++++++++++++++++++ .../analytics/adapters/metrica.ts | 18 ++++++++++++++++++ .../analytics/adapters/variocube.ts | 18 ++++++++++++++++++ 4 files changed, 72 insertions(+) create mode 100644 src/observability/analytics/adapters/ctm.ts create mode 100644 src/observability/analytics/adapters/dynatrace.ts create mode 100644 src/observability/analytics/adapters/metrica.ts create mode 100644 src/observability/analytics/adapters/variocube.ts diff --git a/src/observability/analytics/adapters/ctm.ts b/src/observability/analytics/adapters/ctm.ts new file mode 100644 index 00000000..34562ec2 --- /dev/null +++ b/src/observability/analytics/adapters/ctm.ts @@ -0,0 +1,18 @@ +import type { AnalyticsAdapter, AnalyticsProps } from "../types.js"; +import { emitEvent } from "../sink.js"; + +export class CtmAdapter implements AnalyticsAdapter { + readonly name = "ctm" as const; + + async load(): Promise { + // Stub: real CTM script loads in Phase 2A + } + + track(event: string, props: AnalyticsProps = {}): void { + emitEvent({ kind: "track", name: event, props, provider: this.name, ts: new Date().toISOString() }); + } + + page(url: string, props: AnalyticsProps = {}): void { + emitEvent({ kind: "page", name: url, props, provider: this.name, ts: new Date().toISOString() }); + } +} diff --git a/src/observability/analytics/adapters/dynatrace.ts b/src/observability/analytics/adapters/dynatrace.ts new file mode 100644 index 00000000..259953fe --- /dev/null +++ b/src/observability/analytics/adapters/dynatrace.ts @@ -0,0 +1,18 @@ +import type { AnalyticsAdapter, AnalyticsProps } from "../types.js"; +import { emitEvent } from "../sink.js"; + +export class DynatraceAdapter implements AnalyticsAdapter { + readonly name = "dynatrace" as const; + + async load(): Promise { + // Stub: real Dynatrace (Key-Astrom) script loads in Phase 2A + } + + track(event: string, props: AnalyticsProps = {}): void { + emitEvent({ kind: "track", name: event, props, provider: this.name, ts: new Date().toISOString() }); + } + + page(url: string, props: AnalyticsProps = {}): void { + emitEvent({ kind: "page", name: url, props, provider: this.name, ts: new Date().toISOString() }); + } +} diff --git a/src/observability/analytics/adapters/metrica.ts b/src/observability/analytics/adapters/metrica.ts new file mode 100644 index 00000000..8ddb2f9c --- /dev/null +++ b/src/observability/analytics/adapters/metrica.ts @@ -0,0 +1,18 @@ +import type { AnalyticsAdapter, AnalyticsProps } from "../types.js"; +import { emitEvent } from "../sink.js"; + +export class MetricaAdapter implements AnalyticsAdapter { + readonly name = "metrica" as const; + + async load(): Promise { + // Stub: real Yandex.Metrica script loads in Phase 2A (after A7 resolves) + } + + track(event: string, props: AnalyticsProps = {}): void { + emitEvent({ kind: "track", name: event, props, provider: this.name, ts: new Date().toISOString() }); + } + + page(url: string, props: AnalyticsProps = {}): void { + emitEvent({ kind: "page", name: url, props, provider: this.name, ts: new Date().toISOString() }); + } +} diff --git a/src/observability/analytics/adapters/variocube.ts b/src/observability/analytics/adapters/variocube.ts new file mode 100644 index 00000000..0eed7192 --- /dev/null +++ b/src/observability/analytics/adapters/variocube.ts @@ -0,0 +1,18 @@ +import type { AnalyticsAdapter, AnalyticsProps } from "../types.js"; +import { emitEvent } from "../sink.js"; + +export class VariocubeAdapter implements AnalyticsAdapter { + readonly name = "variocube" as const; + + async load(): Promise { + // Stub: real Variocube script loads in Phase 2A + } + + track(event: string, props: AnalyticsProps = {}): void { + emitEvent({ kind: "track", name: event, props, provider: this.name, ts: new Date().toISOString() }); + } + + page(url: string, props: AnalyticsProps = {}): void { + emitEvent({ kind: "page", name: url, props, provider: this.name, ts: new Date().toISOString() }); + } +}