UNPKG

@rudderstack/integrations-lib

Version:

A comprehensive TypeScript library providing shared utilities, SDKs, and tools for RudderStack integrations and destinations.

105 lines 13.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.LocalFeatureFlagProvider = void 0; const utils_1 = require("../../core/utils"); class LocalFeatureFlagProvider { constructor(registry) { this.registry = registry; this.flags = {}; } initialize() { // Load flags from registry and config this.flags = this.loadLocalFlags(); return Promise.resolve(); } isFeatureEnabled(user, flagName) { // Use getFeatureValue internally for consistency return this.getFeatureValue(user, flagName); } isFeatureEnabledLatest(user, flagName) { // For local provider, latest = cached (no difference) return this.getFeatureValueLatest(user, flagName); } getFeatureValue(user, flagName) { try { const resolvedValue = this.resolveFlagValue(user, flagName); return Promise.resolve({ name: flagName, enabled: typeof resolvedValue === 'boolean' ? resolvedValue : Boolean(resolvedValue), value: resolvedValue, }); } catch (error) { return Promise.resolve(this.createErrorFeatureValue(flagName, error)); } } getFeatureValueLatest(user, flagName) { // For local provider, latest = cached (no difference) return this.getFeatureValue(user, flagName); } // eslint-disable-next-line class-methods-use-this getProviderInfo() { return { name: 'local', version: '1.0.0', supportsCache: false, supportsRealTime: false, }; } loadLocalFlags() { const flags = {}; // Load from registry defaults this.registry.getAll().forEach((flag) => { flags[flag.key] = flag.defaultValue; }); return flags; } resolveFlagValue(user, flagName) { // Priority: workspace-specific env > global env > config > registry default // 1. Check workspace-specific environment variable const workspaceEnvKey = utils_1.FeatureFlagUtils.createWorkspaceEnvKey(flagName, user.workspaceId); const workspaceEnvValue = process.env[workspaceEnvKey]; if (workspaceEnvValue !== undefined) { return this.parseEnvValue(workspaceEnvValue); } // 2. Check global environment variable const globalEnvKey = utils_1.FeatureFlagUtils.createGlobalEnvKey(flagName); const globalEnvValue = process.env[globalEnvKey]; if (globalEnvValue !== undefined) { return this.parseEnvValue(globalEnvValue); } // 3. Check configured flags const configValue = this.flags[flagName]; if (configValue !== undefined) { return configValue; } // 4. Return registry default return this.registry.getDefaultValue(flagName); } // eslint-disable-next-line class-methods-use-this parseEnvValue(envValue) { // Try to parse as boolean const lowerValue = envValue.toLowerCase(); if (lowerValue === 'true' || lowerValue === '1') return true; if (lowerValue === 'false' || lowerValue === '0') return false; // Try to parse as number const numValue = Number(envValue); if (!Number.isNaN(numValue) && envValue.trim() !== '') return numValue; // Return as string return envValue; } createErrorFeatureValue(flagName, error) { const defaultValue = this.registry.getDefaultValue(flagName); return { name: flagName, enabled: typeof defaultValue === 'boolean' ? defaultValue : false, value: defaultValue, error, }; } } exports.LocalFeatureFlagProvider = LocalFeatureFlagProvider; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZmVhdHVyZS1mbGFncy9wcm92aWRlcnMvbG9jYWwvcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBT0EsNENBQW9EO0FBRXBELE1BQWEsd0JBQXdCO0lBR25DLFlBQW9CLFFBQThCO1FBQTlCLGFBQVEsR0FBUixRQUFRLENBQXNCO1FBRjFDLFVBQUssR0FBOEMsRUFBRSxDQUFDO0lBRVQsQ0FBQztJQUV0RCxVQUFVO1FBQ1Isc0NBQXNDO1FBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ25DLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxJQUFxQixFQUFFLFFBQWdCO1FBQ3RELGlEQUFpRDtRQUNqRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxJQUFxQixFQUFFLFFBQWdCO1FBQzVELHNEQUFzRDtRQUN0RCxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELGVBQWUsQ0FBQyxJQUFxQixFQUFFLFFBQWdCO1FBQ3JELElBQUksQ0FBQztZQUNILE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFNUQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDO2dCQUNyQixJQUFJLEVBQUUsUUFBUTtnQkFDZCxPQUFPLEVBQUUsT0FBTyxhQUFhLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7Z0JBQ3BGLEtBQUssRUFBRSxhQUFhO2FBQ3JCLENB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Tyx1QkFBdUIsQ0FBQyxRQUFnQixFQUFFLEtBQVk7UUFDNUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0QsT0FBTztZQUNMLElBQUksRUFBRSxRQUFRO1lBQ2QsT0FBTyxFQUFFLE9BQU8sWUFBWSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLO1lBQ2pFLEtBQUssRUFBRSxZQUFZO1lBQ25CLEtBQUs7U0FDTixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBaEhELDREQWdIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgRmVhdHVyZUZsYWdVc2VyLFxuICBJRmVhdHVyZUZsYWdSZWdpc3RyeSxcbiAgSUZlYXR1cmVGbGFnUHJvdmlkZXIsXG4gIFByb3ZpZGVySW5mbyxcbiAgRmVhdHVyZVZhbHVlLFxufSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBGZWF0dXJlRmxhZ1V0aWxzIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBMb2NhbEZlYXR1cmVGbGFnUHJvdmlkZXIgaW1wbGVtZW50cyBJRmVhdHVyZUZsYWdQcm92aWRlciB7XG4gIHByaXZhdGUgZmxhZ3M6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4gfCBzdHJpbmcgfCBudW1iZXI+ID0ge307XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWdpc3RyeTogSUZlYXR1cmVGbGFnUmVnaXN0cnkpIHt9XG5cbiAgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBMb2FkIGZsYWdzIGZyb20gcmVnaXN0cnkgYW5kIGNvbmZpZ1xuICAgIHRoaXMuZmxhZ3MgPSB0aGlzLmxvYWRMb2NhbEZsYWdzKCk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgaXNGZWF0dXJlRW5hYmxlZCh1c2VyOiBGZWF0dXJlRmxhZ1VzZXIsIGZsYWdOYW1lOiBzdHJpbmcpOiBQcm9taXNlPEZlYXR1cmVWYWx1ZT4ge1xuICAgIC8vIFVzZSBnZXRGZWF0dXJlVmFsdWUgaW50ZXJuYWxseSBmb3IgY29uc2lzdGVuY3lcbiAgICByZXR1cm4gdGhpcy5nZXRGZWF0dXJlVmFsdWUodXNlciwgZmxhZ05hbWUpO1xuICB9XG5cbiAgaXNGZWF0dXJlRW5hYmxlZExhdGVzdCh1c2VyOiBGZWF0dXJlRmxhZ1VzZXIsIGZsYWdOYW1lOiBzdHJpbmcpOiBQcm9taXNlPEZlYXR1cmVWYWx1ZT4ge1xuICAgIC8vIEZvciBsb2NhbCBwcm92aWRlciwgbGF0ZXN0ID0gY2FjaGVkIChubyBkaWZmZXJlbmNlKVxuICAgIHJldHVybiB0aGlzLmdldEZlYXR1cmVWYWx1ZUxhdGVzdCh1c2VyLCBmbGFnTmFtZSk7XG4gIH1cblxuICBnZXRGZWF0dXJlVmFsdWUodXNlcjogRmVhdHVyZUZsYWdVc2VyLCBmbGFnTmFtZTogc3RyaW5nKTogUHJvbWlzZTxGZWF0dXJlVmFsdWU+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzb2x2ZWRWYWx1ZSA9IHRoaXMucmVzb2x2ZUZsYWdWYWx1ZSh1c2VyLCBmbGFnTmFtZSk7XG5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICBuYW1lOiBmbGFnTmFtZSxcbiAgICAgICAgZW5hYmxlZDogdHlwZW9mIHJlc29sdmVkVmFsdWUgPT09ICdib29sZWFuJyA/IHJlc29sdmVkVmFsdWUgOiBCb29sZWFuKHJlc29sdmVkVmFsdWUpLFxuICAgICAgICB2YWx1ZTogcmVzb2x2ZWRWYWx1ZSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuY3JlYXRlRXJyb3JGZWF0dXJlVmFsdWUoZmxhZ05hbWUsIGVycm9yIGFzIEVycm9yKSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RmVhdHVyZVZhbHVlTGF0ZXN0KHVzZXI6IEZlYXR1cmVGbGFnVXNlciwgZmxhZ05hbWU6IHN0cmluZyk6IFByb21pc2U8RmVhdHVyZVZhbHVlPiB7XG4gICAgLy8gRm9yIGxvY2FsIHByb3ZpZGVyLCBsYXRlc3QgPSBjYWNoZWQgKG5vIGRpZmZlcmVuY2UpXG4gICAgcmV0dXJuIHRoaXMuZ2V0RmVhdHVyZVZhbHVlKHVzZXIsIGZsYWdOYW1lKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzXG4gIGdldFByb3ZpZGVySW5mbygpOiBQcm92aWRlckluZm8ge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiAnbG9jYWwnLFxuICAgICAgdmVyc2lvbjogJzEuMC4wJyxcbiAgICAgIHN1cHBvcnRzQ2FjaGU6IGZhbHNlLFxuICAgICAgc3VwcG9ydHNSZWFsVGltZTogZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZExvY2FsRmxhZ3MoKTogUmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IHN0cmluZyB8IG51bWJlcj4ge1xuICAgIGNvbnN0IGZsYWdzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuIHwgc3RyaW5nIHwgbnVtYmVyPiA9IHt9O1xuXG4gICAgLy8gTG9hZCBmcm9tIHJlZ2lzdHJ5IGRlZmF1bHRzXG4gICAgdGhpcy5yZWdpc3RyeS5nZXRBbGwoKS5mb3JFYWNoKChmbGFnKSA9PiB7XG4gICAgICBmbGFnc1tmbGFnLmtleV0gPSBmbGFnLmRlZmF1bHRWYWx1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmbGFncztcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUZsYWdWYWx1ZSh1c2VyOiBGZWF0dXJlRmxhZ1VzZXIsIGZsYWdOYW1lOiBzdHJpbmcpOiBib29sZWFuIHwgc3RyaW5nIHwgbnVtYmVyIHtcbiAgICAvLyBQcmlvcml0eTogd29ya3NwYWNlLXNwZWNpZmljIGVudiA+IGdsb2JhbCBlbnYgPiBjb25maWcgPiByZWdpc3RyeSBkZWZhdWx0XG5cbiAgICAvLyAxLiBDaGVjayB3b3Jrc3BhY2Utc3BlY2lmaWMgZW52aXJvbm1lbnQgdmFyaWFibGVcbiAgICBjb25zdCB3b3Jrc3BhY2VFbnZLZXkgPSBGZWF0dXJlRmxhZ1V0aWxzLmNyZWF0ZVdvcmtzcGFjZUVudktleShmbGFnTmFtZSwgdXNlci53b3Jrc3BhY2VJZCk7XG4gICAgY29uc3Qgd29ya3NwYWNlRW52VmFsdWUgPSBwcm9jZXNzLmVudlt3b3Jrc3BhY2VFbnZLZXldO1xuICAgIGlmICh3b3Jrc3BhY2VFbnZWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUVudlZhbHVlKHdvcmtzcGFjZUVudlZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyAyLiBDaGVjayBnbG9iYWwgZW52aXJvbm1lbnQgdmFyaWFibGVcbiAgICBjb25zdCBnbG9iYWxFbnZLZXkgPSBGZWF0dXJlRmxhZ1V0aWxzLmNyZWF0ZUdsb2JhbEVudktleShmbGFnTmFtZSk7XG4gICAgY29uc3QgZ2xvYmFsRW52VmFsdWUgPSBwcm9jZXNzLmVudltnbG9iYWxFbnZLZXldO1xuICAgIGlmIChnbG9iYWxFbnZWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUVudlZhbHVlKGdsb2JhbEVudlZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyAzLiBDaGVjayBjb25maWd1cmVkIGZsYWdzXG4gICAgY29uc3QgY29uZmlnVmFsdWUgPSB0aGlzLmZsYWdzW2ZsYWdOYW1lXTtcbiAgICBpZiAoY29uZmlnVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNvbmZpZ1ZhbHVlO1xuICAgIH1cblxuICAgIC8vIDQuIFJldHVybiByZWdpc3RyeSBkZWZhdWx0XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuZ2V0RGVmYXVsdFZhbHVlKGZsYWdOYW1lKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzXG4gIHByaXZhdGUgcGFyc2VFbnZWYWx1ZShlbnZWYWx1ZTogc3RyaW5nKTogYm9vbGVhbiB8IHN0cmluZyB8IG51bWJlciB7XG4gICAgLy8gVHJ5IHRvIHBhcnNlIGFzIGJvb2xlYW5cbiAgICBjb25zdCBsb3dlclZhbHVlID0gZW52VmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobG93ZXJWYWx1ZSA9PT0gJ3RydWUnIHx8IGxvd2VyVmFsdWUgPT09ICcxJykgcmV0dXJuIHRydWU7XG4gICAgaWYgKGxvd2VyVmFsdWUgPT09ICdmYWxzZScgfHwgbG93ZXJWYWx1ZSA9PT0gJzAnKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBUcnkgdG8gcGFyc2UgYXMgbnVtYmVyXG4gICAgY29uc3QgbnVtVmFsdWUgPSBOdW1iZXIoZW52VmFsdWUpO1xuICAgIGlmICghTnVtYmVyLmlzTmFOKG51bVZhbHVlKSAmJiBlbnZWYWx1ZS50cmltKCkgIT09ICcnKSByZXR1cm4gbnVtVmFsdWU7XG5cbiAgICAvLyBSZXR1cm4gYXMgc3RyaW5nXG4gICAgcmV0dXJuIGVudlZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVFcnJvckZlYXR1cmVWYWx1ZShmbGFnTmFtZTogc3RyaW5nLCBlcnJvcjogRXJyb3IpOiBGZWF0dXJlVmFsdWUge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMucmVnaXN0cnkuZ2V0RGVmYXVsdFZhbHVlKGZsYWdOYW1lKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogZmxhZ05hbWUsXG4gICAgICBlbmFibGVkOiB0eXBlb2YgZGVmYXVsdFZhbHVlID09PSAnYm9vbGVhbicgPyBkZWZhdWx0VmFsdWUgOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBkZWZhdWx0VmFsdWUsXG4gICAgICBlcnJvcixcbiAgICB9O1xuICB9XG59XG4iXX0=