vwo-fme-node-sdk
Version:
VWO Node/JavaScript SDK for Feature Management and Experimentation
122 lines (103 loc) • 3.9 kB
text/typescript
/**
* Copyright 2024-2025 Wingify Software Pvt. Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { LogLevelNumberEnum } from '../packages/logger/core/TransportManager';
/**
* Manages usage statistics for the SDK.
* Tracks various features and configurations being used by the client.
* Implements Singleton pattern to ensure a single instance.
*/
export class UsageStatsUtil {
/** Singleton instance */
private static instance: UsageStatsUtil;
/** Internal storage for usage statistics data */
private usageStatsData: Record<string, string | number> = {};
/** Private constructor to prevent direct instantiation */
private constructor() {}
/**
* Provides access to the singleton instance of UsageStatsUtil.
*
* @returns The single instance of UsageStatsUtil
*/
public static getInstance(): UsageStatsUtil {
if (!UsageStatsUtil.instance) {
UsageStatsUtil.instance = new UsageStatsUtil();
}
return UsageStatsUtil.instance;
}
/**
* Sets usage statistics based on provided options.
* Maps various SDK features and configurations to boolean flags.
*
* @param options - Configuration options for the SDK
* @param options.storage - Storage service configuration
* @param options.logger - Logger configuration
* @param options.eventBatching - Event batching configuration
* @param options.integrations - Integrations configuration
* @param options.pollingInterval - Polling interval configuration
* @param options.sdkName - SDK name configuration
*/
setUsageStats(options: any): void {
const {
storage,
logger,
batchEvents,
gatewayService,
integrations,
pollingInterval,
_vwo_meta,
shouldWaitForTrackingCalls,
} = options;
const data: Record<string, string | number> = {};
// Map configuration options to usage stats flags
if (integrations) data.ig = 1; // Integration enabled
if (batchEvents) data.eb = 1; // Event batching enabled
// if logger has transport or transports, then it is custom logger
if (logger && (logger.transport || logger.transports)) data.cl = 1;
if (storage) data.ss = 1; // Storage service configured
if (logger?.level) {
data.ll = LogLevelNumberEnum[logger.level.toUpperCase()] ?? -1; // Default to -1 if level is not recognized
}
if (gatewayService) data.gs = 1; // Gateway service configured
if (pollingInterval) data.pi = 1; // Polling interval configured
if (shouldWaitForTrackingCalls) data.swtc = 1;
// if _vwo_meta has ea, then addd data._ea to be 1
if (_vwo_meta && _vwo_meta.ea) data._ea = 1;
// Check if sdk running in browser and not in edge/serverless environment
if (typeof process.env === 'undefined' && typeof XMLHttpRequest !== 'undefined') {
return;
} else {
if (typeof process !== 'undefined' && process.version) {
// For Node.js environment
data.lv = process.version;
}
}
this.usageStatsData = data;
}
/**
* Retrieves the current usage statistics.
*
* @returns Record containing boolean flags for various SDK features in use
*/
getUsageStats(): Record<string, boolean | string | number> {
return this.usageStatsData;
}
/**
* Clears the usage statistics data.
*/
clearUsageStats(): void {
this.usageStatsData = {};
}
}