From 987a3715589b62ca9d9ac16401ad5ec0d24081eb Mon Sep 17 00:00:00 2001 From: Ryan Lamb <4955475+kinyoklion@users.noreply.github.com> Date: Tue, 21 Jan 2025 11:10:07 -0800 Subject: [PATCH 1/3] feat: Make browser-telemetry specific inspector type. --- .../__tests__/singleton/singletonMethods.test.ts | 7 +++---- .../browser-telemetry/src/BrowserTelemetryImpl.ts | 9 +++++---- .../browser-telemetry/src/api/BrowserTelemetry.ts | 3 ++- .../src/api/client/BrowserTelemetryInspector.ts | 7 +++++++ packages/telemetry/browser-telemetry/src/inspectors.ts | 5 +++-- .../browser-telemetry/src/singleton/singletonMethods.ts | 3 ++- 6 files changed, 22 insertions(+), 12 deletions(-) create mode 100644 packages/telemetry/browser-telemetry/src/api/client/BrowserTelemetryInspector.ts diff --git a/packages/telemetry/browser-telemetry/__tests__/singleton/singletonMethods.test.ts b/packages/telemetry/browser-telemetry/__tests__/singleton/singletonMethods.test.ts index dc4c50256..f12812985 100644 --- a/packages/telemetry/browser-telemetry/__tests__/singleton/singletonMethods.test.ts +++ b/packages/telemetry/browser-telemetry/__tests__/singleton/singletonMethods.test.ts @@ -1,5 +1,3 @@ -import { LDInspection } from '@launchdarkly/js-client-sdk'; - import { Breadcrumb, LDClientTracking } from '../../src/api'; import { BrowserTelemetry } from '../../src/api/BrowserTelemetry'; import { getTelemetryInstance } from '../../src/singleton/singletonInstance'; @@ -11,6 +9,7 @@ import { inspectors, register, } from '../../src/singleton/singletonMethods'; +import { BrowserTelemetryInspector } from '../../src/api/client/BrowserTelemetryInspector'; jest.mock('../../src/singleton/singletonInstance'); @@ -36,8 +35,8 @@ it('returns empty array when telemetry is not initialized for inspectors', () => }); it('returns inspectors when telemetry is initialized', () => { - const mockInspectors: LDInspection[] = [ - { name: 'test-inspector', type: 'flag-used', method: () => {} }, + const mockInspectors: BrowserTelemetryInspector[] = [ + { name: 'test-inspector', type: 'flag-used', synchronous: true, method: () => {} }, ]; mockGetTelemetryInstance.mockReturnValue(mockTelemetry); mockTelemetry.inspectors.mockReturnValue(mockInspectors); diff --git a/packages/telemetry/browser-telemetry/src/BrowserTelemetryImpl.ts b/packages/telemetry/browser-telemetry/src/BrowserTelemetryImpl.ts index d04bd87c8..423f81bb4 100644 --- a/packages/telemetry/browser-telemetry/src/BrowserTelemetryImpl.ts +++ b/packages/telemetry/browser-telemetry/src/BrowserTelemetryImpl.ts @@ -3,7 +3,7 @@ * This is only a type dependency and these types should be compatible between * SDKs. */ -import type { LDContext, LDEvaluationDetail, LDInspection } from '@launchdarkly/js-client-sdk'; +import type { LDContext, LDEvaluationDetail } from '@launchdarkly/js-client-sdk'; import { BreadcrumbFilter, LDClientLogging, LDClientTracking, MinLogger } from './api'; import { Breadcrumb, FeatureManagementBreadcrumb } from './api/Breadcrumb'; @@ -18,6 +18,7 @@ import FetchCollector from './collectors/http/fetch'; import XhrCollector from './collectors/http/xhr'; import defaultUrlFilter from './filters/defaultUrlFilter'; import makeInspectors from './inspectors'; +import { BrowserTelemetryInspector } from './api/client/BrowserTelemetryInspector'; import { fallbackLogger, prefixLog } from './logging'; import { ParsedOptions, ParsedStackOptions } from './options'; import randomUuidV4 from './randomUuidV4'; @@ -94,7 +95,7 @@ export default class BrowserTelemetryImpl implements BrowserTelemetry { private _breadcrumbs: Breadcrumb[] = []; - private _inspectorInstances: LDInspection[] = []; + private _inspectorInstances: BrowserTelemetryInspector[] = []; private _collectors: Collector[] = []; private _sessionId: string = randomUuidV4(); @@ -149,7 +150,7 @@ export default class BrowserTelemetryImpl implements BrowserTelemetry { ); const impl = this; - const inspectors: LDInspection[] = []; + const inspectors: BrowserTelemetryInspector[] = []; makeInspectors(_options, inspectors, impl); this._inspectorInstances.push(...inspectors); @@ -184,7 +185,7 @@ export default class BrowserTelemetryImpl implements BrowserTelemetry { } } - inspectors(): LDInspection[] { + inspectors(): BrowserTelemetryInspector[] { return this._inspectorInstances; } diff --git a/packages/telemetry/browser-telemetry/src/api/BrowserTelemetry.ts b/packages/telemetry/browser-telemetry/src/api/BrowserTelemetry.ts index 74ec31f57..13924741c 100644 --- a/packages/telemetry/browser-telemetry/src/api/BrowserTelemetry.ts +++ b/packages/telemetry/browser-telemetry/src/api/BrowserTelemetry.ts @@ -2,6 +2,7 @@ import type { LDInspection } from '@launchdarkly/js-client-sdk'; import { Breadcrumb } from './Breadcrumb'; import { LDClientTracking } from './client/LDClientTracking'; +import { BrowserTelemetryInspector } from './client/BrowserTelemetryInspector'; /** * Interface for browser-based telemetry collection in LaunchDarkly SDKs. @@ -17,7 +18,7 @@ export interface BrowserTelemetry { * * @returns An array of {@link LDInspection} objects. */ - inspectors(): LDInspection[]; + inspectors(): BrowserTelemetryInspector[]; /** * Captures an Error object for telemetry purposes. diff --git a/packages/telemetry/browser-telemetry/src/api/client/BrowserTelemetryInspector.ts b/packages/telemetry/browser-telemetry/src/api/client/BrowserTelemetryInspector.ts new file mode 100644 index 000000000..3dc6e8580 --- /dev/null +++ b/packages/telemetry/browser-telemetry/src/api/client/BrowserTelemetryInspector.ts @@ -0,0 +1,7 @@ + +export interface BrowserTelemetryInspector { + type: 'flag-used' | 'flag-detail-changed'; + name: string; + synchronous: boolean; + method: (...args: any[]) => void; +} diff --git a/packages/telemetry/browser-telemetry/src/inspectors.ts b/packages/telemetry/browser-telemetry/src/inspectors.ts index 5f8e65079..d97cf7732 100644 --- a/packages/telemetry/browser-telemetry/src/inspectors.ts +++ b/packages/telemetry/browser-telemetry/src/inspectors.ts @@ -1,7 +1,8 @@ -import type { LDContext, LDEvaluationDetail, LDInspection } from '@launchdarkly/js-client-sdk'; +import type { LDContext, LDEvaluationDetail } from '@launchdarkly/js-client-sdk'; import BrowserTelemetryImpl from './BrowserTelemetryImpl.js'; import { ParsedOptions } from './options.js'; +import { BrowserTelemetryInspector } from './api/client/BrowserTelemetryInspector.js'; /** * Create inspectors to register with an LDClient instance. @@ -12,7 +13,7 @@ import { ParsedOptions } from './options.js'; */ export default function makeInspectors( options: ParsedOptions, - inspectors: LDInspection[], + inspectors: BrowserTelemetryInspector[], telemetry: BrowserTelemetryImpl, ) { if (options.breadcrumbs.evaluations) { diff --git a/packages/telemetry/browser-telemetry/src/singleton/singletonMethods.ts b/packages/telemetry/browser-telemetry/src/singleton/singletonMethods.ts index e7d0391a9..80e2b5cdc 100644 --- a/packages/telemetry/browser-telemetry/src/singleton/singletonMethods.ts +++ b/packages/telemetry/browser-telemetry/src/singleton/singletonMethods.ts @@ -3,6 +3,7 @@ import type { LDInspection } from '@launchdarkly/js-client-sdk'; import { LDClientTracking } from '../api'; import { Breadcrumb } from '../api/Breadcrumb'; import { getTelemetryInstance } from './singletonInstance'; +import { BrowserTelemetryInspector } from '../api/client/BrowserTelemetryInspector'; /** * Returns an array of active SDK inspectors to use with SDK versions that do @@ -13,7 +14,7 @@ import { getTelemetryInstance } from './singletonInstance'; * * @returns An array of {@link LDInspection} objects. */ -export function inspectors(): LDInspection[] { +export function inspectors(): BrowserTelemetryInspector[] { return getTelemetryInstance()?.inspectors() || []; } From be278eaa42c7e91740066f89b943c958825278fb Mon Sep 17 00:00:00 2001 From: Ryan Lamb <4955475+kinyoklion@users.noreply.github.com> Date: Tue, 21 Jan 2025 11:19:24 -0800 Subject: [PATCH 2/3] Cleanup --- .../singleton/singletonMethods.test.ts | 2 +- .../src/BrowserTelemetryImpl.ts | 2 +- .../src/api/BrowserTelemetry.ts | 6 ++--- .../api/client/BrowserTelemetryInspector.ts | 24 ++++++++++++++++++- .../browser-telemetry/src/inspectors.ts | 2 +- .../src/singleton/singletonMethods.ts | 6 ++--- 6 files changed, 30 insertions(+), 12 deletions(-) diff --git a/packages/telemetry/browser-telemetry/__tests__/singleton/singletonMethods.test.ts b/packages/telemetry/browser-telemetry/__tests__/singleton/singletonMethods.test.ts index f12812985..0a41e5a5c 100644 --- a/packages/telemetry/browser-telemetry/__tests__/singleton/singletonMethods.test.ts +++ b/packages/telemetry/browser-telemetry/__tests__/singleton/singletonMethods.test.ts @@ -1,5 +1,6 @@ import { Breadcrumb, LDClientTracking } from '../../src/api'; import { BrowserTelemetry } from '../../src/api/BrowserTelemetry'; +import { BrowserTelemetryInspector } from '../../src/api/client/BrowserTelemetryInspector'; import { getTelemetryInstance } from '../../src/singleton/singletonInstance'; import { addBreadcrumb, @@ -9,7 +10,6 @@ import { inspectors, register, } from '../../src/singleton/singletonMethods'; -import { BrowserTelemetryInspector } from '../../src/api/client/BrowserTelemetryInspector'; jest.mock('../../src/singleton/singletonInstance'); diff --git a/packages/telemetry/browser-telemetry/src/BrowserTelemetryImpl.ts b/packages/telemetry/browser-telemetry/src/BrowserTelemetryImpl.ts index 423f81bb4..fb931596b 100644 --- a/packages/telemetry/browser-telemetry/src/BrowserTelemetryImpl.ts +++ b/packages/telemetry/browser-telemetry/src/BrowserTelemetryImpl.ts @@ -8,6 +8,7 @@ import type { LDContext, LDEvaluationDetail } from '@launchdarkly/js-client-sdk' import { BreadcrumbFilter, LDClientLogging, LDClientTracking, MinLogger } from './api'; import { Breadcrumb, FeatureManagementBreadcrumb } from './api/Breadcrumb'; import { BrowserTelemetry } from './api/BrowserTelemetry'; +import { BrowserTelemetryInspector } from './api/client/BrowserTelemetryInspector'; import { Collector } from './api/Collector'; import { ErrorData } from './api/ErrorData'; import { EventData } from './api/EventData'; @@ -18,7 +19,6 @@ import FetchCollector from './collectors/http/fetch'; import XhrCollector from './collectors/http/xhr'; import defaultUrlFilter from './filters/defaultUrlFilter'; import makeInspectors from './inspectors'; -import { BrowserTelemetryInspector } from './api/client/BrowserTelemetryInspector'; import { fallbackLogger, prefixLog } from './logging'; import { ParsedOptions, ParsedStackOptions } from './options'; import randomUuidV4 from './randomUuidV4'; diff --git a/packages/telemetry/browser-telemetry/src/api/BrowserTelemetry.ts b/packages/telemetry/browser-telemetry/src/api/BrowserTelemetry.ts index 13924741c..34156805c 100644 --- a/packages/telemetry/browser-telemetry/src/api/BrowserTelemetry.ts +++ b/packages/telemetry/browser-telemetry/src/api/BrowserTelemetry.ts @@ -1,8 +1,6 @@ -import type { LDInspection } from '@launchdarkly/js-client-sdk'; - import { Breadcrumb } from './Breadcrumb'; -import { LDClientTracking } from './client/LDClientTracking'; import { BrowserTelemetryInspector } from './client/BrowserTelemetryInspector'; +import { LDClientTracking } from './client/LDClientTracking'; /** * Interface for browser-based telemetry collection in LaunchDarkly SDKs. @@ -16,7 +14,7 @@ export interface BrowserTelemetry { * Returns an array of active SDK inspectors to use with SDK versions that do * not support hooks. * - * @returns An array of {@link LDInspection} objects. + * @returns An array of {@link BrowserTelemetryInspector} objects. */ inspectors(): BrowserTelemetryInspector[]; diff --git a/packages/telemetry/browser-telemetry/src/api/client/BrowserTelemetryInspector.ts b/packages/telemetry/browser-telemetry/src/api/client/BrowserTelemetryInspector.ts index 3dc6e8580..e3fc9ffe3 100644 --- a/packages/telemetry/browser-telemetry/src/api/client/BrowserTelemetryInspector.ts +++ b/packages/telemetry/browser-telemetry/src/api/client/BrowserTelemetryInspector.ts @@ -1,7 +1,29 @@ - +/** + * A less constrained version of the LDInspection interface in order to allow for greater compatibility between + * SDK versions. + * + * This interface is not intended for use by the application developer and is instead intended as a compatibility bridge + * to support multiple SDK versions. + */ export interface BrowserTelemetryInspector { + /** + * The telemetry package only requires flag-detail-changed inspectors and flag-used inspectors. + */ type: 'flag-used' | 'flag-detail-changed'; + + /** + * The name of the inspector, used for debugging purposes. + */ name: string; + /** + * Whether the inspector is synchronous. + */ synchronous: boolean; + /** + * The method to call when the inspector is triggered. + * + * The typing here is intentionally loose to allow for greater compatibility between SDK versions. + * This function should ONLY be called by an SDK instance and not by an application developer. + */ method: (...args: any[]) => void; } diff --git a/packages/telemetry/browser-telemetry/src/inspectors.ts b/packages/telemetry/browser-telemetry/src/inspectors.ts index d97cf7732..c9f026e0b 100644 --- a/packages/telemetry/browser-telemetry/src/inspectors.ts +++ b/packages/telemetry/browser-telemetry/src/inspectors.ts @@ -1,8 +1,8 @@ import type { LDContext, LDEvaluationDetail } from '@launchdarkly/js-client-sdk'; +import { BrowserTelemetryInspector } from './api/client/BrowserTelemetryInspector.js'; import BrowserTelemetryImpl from './BrowserTelemetryImpl.js'; import { ParsedOptions } from './options.js'; -import { BrowserTelemetryInspector } from './api/client/BrowserTelemetryInspector.js'; /** * Create inspectors to register with an LDClient instance. diff --git a/packages/telemetry/browser-telemetry/src/singleton/singletonMethods.ts b/packages/telemetry/browser-telemetry/src/singleton/singletonMethods.ts index 80e2b5cdc..8ca491d11 100644 --- a/packages/telemetry/browser-telemetry/src/singleton/singletonMethods.ts +++ b/packages/telemetry/browser-telemetry/src/singleton/singletonMethods.ts @@ -1,9 +1,7 @@ -import type { LDInspection } from '@launchdarkly/js-client-sdk'; - import { LDClientTracking } from '../api'; import { Breadcrumb } from '../api/Breadcrumb'; -import { getTelemetryInstance } from './singletonInstance'; import { BrowserTelemetryInspector } from '../api/client/BrowserTelemetryInspector'; +import { getTelemetryInstance } from './singletonInstance'; /** * Returns an array of active SDK inspectors to use with SDK versions that do @@ -12,7 +10,7 @@ import { BrowserTelemetryInspector } from '../api/client/BrowserTelemetryInspect * Telemetry must be initialized, using {@link initializeTelemetry} before calling this method. * If telemetry is not initialized, this method will return an empty array. * - * @returns An array of {@link LDInspection} objects. + * @returns An array of {@link BrowserTelemetryInspector} objects. */ export function inspectors(): BrowserTelemetryInspector[] { return getTelemetryInstance()?.inspectors() || []; From 65b05a05d90b68765c0a4cebad092a244d47bfd8 Mon Sep 17 00:00:00 2001 From: Ryan Lamb <4955475+kinyoklion@users.noreply.github.com> Date: Tue, 21 Jan 2025 11:21:28 -0800 Subject: [PATCH 3/3] comment clarity --- .../src/api/client/BrowserTelemetryInspector.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/telemetry/browser-telemetry/src/api/client/BrowserTelemetryInspector.ts b/packages/telemetry/browser-telemetry/src/api/client/BrowserTelemetryInspector.ts index e3fc9ffe3..2a5b8db77 100644 --- a/packages/telemetry/browser-telemetry/src/api/client/BrowserTelemetryInspector.ts +++ b/packages/telemetry/browser-telemetry/src/api/client/BrowserTelemetryInspector.ts @@ -2,8 +2,8 @@ * A less constrained version of the LDInspection interface in order to allow for greater compatibility between * SDK versions. * - * This interface is not intended for use by the application developer and is instead intended as a compatibility bridge - * to support multiple SDK versions. + * This interface is not intended for use by application developers and is instead intended as a compatibility bridge + * to support multiple SDK versions. */ export interface BrowserTelemetryInspector { /**