diff --git a/src/MetricsProvider.ts b/src/MetricsProvider.ts index 192be32..e2b12f9 100644 --- a/src/MetricsProvider.ts +++ b/src/MetricsProvider.ts @@ -1,7 +1,8 @@ import { COUNTLY_SETUP_DEFAULTS } from './config.js' +import { EventAccumulator } from './EventAccumulator.js' -import type { metricFeatures, CountlyWebSdk } from 'countly-sdk-web' import type { CountlyNodeSdk } from 'countly-sdk-nodejs' +import type { CountlyWebSdk, metricFeatures } from 'countly-sdk-web' import type { consentTypes, consentTypesExceptAll } from './types/index.js' export interface MetricsProviderConstructorOptions { @@ -9,13 +10,14 @@ export interface MetricsProviderConstructorOptions { autoTrack?: boolean interval?: number max_events?: number + metricsService: T queue_size?: number session_update?: number url?: string - metricsService: T } export default class MetricsProvider { + public readonly accumulate: EventAccumulator private readonly groupedFeatures: Record = this.mapAllEvents({ minimal: ['sessions', 'views', 'events'], performance: ['crashes', 'apm'], @@ -40,6 +42,7 @@ export default class MetricsProvider { url, require_consent: true }) + this.accumulate = new EventAccumulator(metricsService) this.metricsService.init(serviceConfig) this.metricsService.group_features(this.groupedFeatures) diff --git a/src/types/countly.d.ts b/src/types/countly.d.ts index d50df1b..2dd5821 100644 --- a/src/types/countly.d.ts +++ b/src/types/countly.d.ts @@ -1,11 +1,12 @@ declare module 'countly-sdk-web' { - interface CountlyEventData { + export interface CountlyEventData { key: string count: number sum: number - segmentation: Record + dur: number + segmentation: Segments } - interface CountlyEvent { + export interface CountlyEvent { // name or id of the event key: string // how many times did event occur @@ -18,12 +19,18 @@ declare module 'countly-sdk-web' { segmentation?: Segments } + export interface IEventAccumulator { + addEvent: (event: CountlyEvent, flush: boolean) => void + flush: (key: string) => void + } + export type metricFeatures = 'apm' | 'attribution' | 'clicks' | 'crashes' | 'events' | 'feedback' | 'forms' | 'location' | 'scrolls' | 'sessions' | 'star-rating' | 'users' | 'views' type Segments = Record type IgnoreList = Array type CountlyEventQueueItem = [string, CountlyEventData] | [eventName: string, key: string] | [eventName: string] export interface CountlyWebSdk { + accumulate: IEventAccumulator group_features: (arg0: Record) => unknown check_consent: (consentFeature: metricFeatures | import('./index.js').consentTypes) => boolean add_consent: (consentFeature: import('./index.js').consentTypes | Array) => void