@rudderstack/integrations-lib
Version:
A comprehensive TypeScript library providing shared utilities, SDKs, and tools for RudderStack integrations and destinations.
111 lines • 17 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ConfigResolver = void 0;
const featureflag_sdk_node_1 = require("@rudderstack/featureflag-sdk-node");
class ConfigResolver {
static resolveConfig(config) {
return {
provider: this.getConfigValue(config.provider, 'FEATURE_FLAG_PROVIDER', 'local'),
apiKey: this.getConfigValue(config.apiKey, 'FEATURE_FLAG_API_KEY', undefined),
enableLocalEvaluation: this.getConfigValue(config.enableLocalEvaluation, 'FEATURE_FLAG_ENABLE_LOCAL_EVALUATION', false, this.parseBoolean),
enableCache: this.getConfigValue(config.enableCache, 'FEATURE_FLAG_ENABLE_CACHE', true, this.parseBoolean),
cacheTtlSeconds: this.getConfigValue(config.cacheTtlSeconds, 'FEATURE_FLAG_CACHE_TTL_SECONDS', 60, this.parseNumber),
timeoutSeconds: this.getConfigValue(config.timeoutSeconds, 'FEATURE_FLAG_TIMEOUT_SECONDS', 60, this.parseNumber),
retryAttempts: this.getConfigValue(config.retryAttempts, 'FEATURE_FLAG_RETRY_ATTEMPTS', 3, this.parseNumber),
enableAnalytics: this.getConfigValue(config.enableAnalytics, 'FEATURE_FLAG_ENABLE_ANALYTICS', true, this.parseBoolean),
};
}
static initializeFlagsmithSDK(config) {
if (config.provider !== 'flagsmith' || !config.apiKey) {
throw new Error('API key is required for Flagsmith provider. Set it via config.apiKey or FEATURE_FLAG_API_KEY environment variable.');
}
(0, featureflag_sdk_node_1.initFeatureFlagClient)({
provider: {
type: 'flagsmith',
apiKey: config.apiKey,
timeoutInSeconds: config.timeoutSeconds,
retryAttempts: config.retryAttempts,
enableLocalEvaluation: config.enableLocalEvaluation,
enableAnalytics: config.enableAnalytics,
},
cache: {
enabled: config.enableCache,
ttlInSeconds: config.cacheTtlSeconds,
},
});
}
static getConfigValue(configValue, envKey, defaultValue, parser) {
const envValue = process.env[envKey];
if (envValue !== undefined) {
if (parser) {
try {
return parser(envValue);
}
catch {
// Fall back to config/default on parse error
}
}
else {
return envValue;
}
}
return configValue !== undefined ? configValue : defaultValue;
}
static parseBoolean(value) {
const lowerValue = value.toLowerCase().trim();
if (lowerValue === 'true' || lowerValue === '1' || lowerValue === 'yes') {
return true;
}
if (lowerValue === 'false' || lowerValue === '0' || lowerValue === 'no') {
return false;
}
throw new Error(`Invalid boolean value: "${value}"`);
}
static parseNumber(value) {
const numValue = Number(value.trim());
if (Number.isNaN(numValue)) {
throw new Error(`Invalid number value: "${value}"`);
}
return numValue;
}
// Utility for parsing environment variables
// Supports both patterns:
// - FEATURE_FLAG_LOCAL_ENABLE_FEATURE (global flag with single underscore)
// - FEATURE_FLAG_LOCAL__workspace123__API__TIMEOUT__MS (workspace flag with double underscore)
static parseEnvKey(envKey) {
// Check for workspace-specific pattern first (contains double underscore)
if (envKey.includes('__')) {
const parts = envKey.split('__');
if (parts.length < 3) {
throw new Error(`Invalid workspace environment key format: "${envKey}". Expected format: PREFIX__WORKSPACE__FLAG`);
}
const prefix = parts[0];
const workspace = parts[1];
const flag = parts.slice(2).join('__');
return {
prefix,
workspace,
flag,
};
}
// Global pattern (single underscore)
const underscoreIndex = envKey.indexOf('_');
if (underscoreIndex === -1) {
throw new Error(`Invalid environment key format: "${envKey}". Expected format: PREFIX_FLAG or PREFIX__WORKSPACE__FLAG`);
}
// Find the last part after the prefix
const prefixParts = envKey.split('_');
if (prefixParts.length < 4) {
throw new Error(`Invalid global environment key format: "${envKey}". Expected format: FEATURE_FLAG_LOCAL_FLAG`);
}
// For FEATURE_FLAG_LOCAL_FLAG_NAME, prefix is "FEATURE_FLAG_LOCAL", flag is "FLAG_NAME"
const prefix = prefixParts.slice(0, 3).join('_'); // FEATURE_FLAG_LOCAL
const flag = prefixParts.slice(3).join('_'); // Everything after
return {
prefix,
flag,
};
}
}
exports.ConfigResolver = ConfigResolver;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ZlYXR1cmUtZmxhZ3MvY29yZS9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNEVBQTBFO0FBRzFFLE1BQWEsY0FBYztJQUN6QixNQUFNLENBQUMsYUFBYSxDQUFDLE1BQWtDO1FBQ3JELE9BQU87WUFDTCxRQUFRLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLHVCQUF1QixFQUFFLE9BQU8sQ0FBQztZQUNoRixNQUFNLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLHNCQUFzQixFQUFFLFNBQVMsQ0FBQztZQUM3RSxxQkFBcUIsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUN4QyxNQUFNLENBQUMscUJBQXFCLEVBQzVCLHNDQUFzQyxFQUN0QyxLQUFLLEVBQ0wsSUFBSSxDQUFDLFlBQVksQ0FDbEI7WUFDRCxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FDOUIsTUFBTSxDQUFDLFdBQVcsRUFDbEIsMkJBQTJCLEVBQzNCLElBQUksRUFDSixJQUFJLENBQUMsWUFBWSxDQUNsQjtZQUNELGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUNsQyxNQUFNLENBQUMsZUFBZSxFQUN0QixnQ0FBZ0MsRUFDaEMsRUFBRSxFQUNGLElBQUksQ0FBQyxXQUFXLENBQ2pCO1lBQ0QsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQ2pDLE1BQU0sQ0FBQyxjQUFjLEVBQ3JCLDhCQUE4QixFQUM5QixFQUFFLEVBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FDakI7WUFDRCxhQUFhLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FDaEMsTUFBTSxDQUFDLGFBQWEsRUFDcEIsNkJBQTZCLEVBQzdCLENBQUMsRUFDRCxJQUFJLENBQUMsV0FBVyxDQUNqQjtZQUNELGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUNs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SSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsbUJBQW1CO1FBRWhFLE9BQU87WUFDTCxNQUFNO1lBQ04sSUFBSTtTQUNMLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUE1SkQsd0NBNEpDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5pdEZlYXR1cmVGbGFnQ2xpZW50IH0gZnJvbSAnQHJ1ZGRlcnN0YWNrL2ZlYXR1cmVmbGFnLXNkay1ub2RlJztcbmltcG9ydCB0eXBlIHsgRmVhdHVyZUZsYWdDb25maWcsIFJlc29sdmVkRmVhdHVyZUZsYWdDb25maWcgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb25maWdSZXNvbHZlciB7XG4gIHN0YXRpYyByZXNvbHZlQ29uZmlnKGNvbmZpZzogUGFydGlhbDxGZWF0dXJlRmxhZ0NvbmZpZz4pOiBSZXNvbHZlZEZlYXR1cmVGbGFnQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvdmlkZXI6IHRoaXMuZ2V0Q29uZmlnVmFsdWUoY29uZmlnLnByb3ZpZGVyLCAnRkVBVFVSRV9GTEFHX1BST1ZJREVSJywgJ2xvY2FsJyksXG4gICAgICBhcGlLZXk6IHRoaXMuZ2V0Q29uZmlnVmFsdWUoY29uZmlnLmFwaUtleSwgJ0ZFQVRVUkVfRkxBR19BUElfS0VZJywgdW5kZWZpbmVkKSxcbiAgICAgIGVuYWJsZUxvY2FsRXZhbHVhdGlvbjogdGhpcy5nZXRDb25maWdWYWx1ZShcbiAgICAgICAgY29uZmlnLmVuYWJsZUxvY2FsRXZhbHVhdGlvbixcbiAgICAgICAgJ0ZFQVRVUkVfRkxBR19FTkFCTEVfTE9DQUxfRVZBTFVBVElPTicsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICB0aGlzLnBhcnNlQm9vbGVhbixcbiAgICAgICksXG4gICAgICBlbmFibGVDYWNoZTogdGhpcy5nZXRDb25maWdWYWx1ZShcbiAgICAgICAgY29uZmlnLmVuYWJsZUNhY2hlLFxuICAgICAgICAnRkVBVFVSRV9GTEFHX0VOQUJMRV9DQUNIRScsXG4gICAgICAgIHRydWUsXG4gICAgICAgIHRoaXMucGFyc2VCb29sZWFuLFxuICAgICAgKSxcbiAgICAgIGNhY2hlVHRsU2Vjb25kczogdGhpcy5nZXRDb25maWdWYWx1ZShcbiAgICAgICAgY29uZmlnLmNhY2hlVHRsU2Vjb25kcyxcbiAgICAgICAgJ0ZFQVRVUkVfRkxBR19DQUNIRV9UVExfU0VDT05EUycsXG4gICAgICAgIDYwLFxuICAgICAgICB0aGlzLnBhcnNlTnVtYmVyLFxuICAgICAgKSxcbiAgICAgIHRpbWVvdXRTZWNvbmRzOiB0aGlzLmdldENvbmZpZ1ZhbHVlKFxuICAgICAgICBjb25maWcudGltZW91dFNlY29uZHMsXG4gICAgICAgICdGRUFUVVJFX0ZMQUdfVElNRU9VVF9TRUNPTkRTJyxcbiAgICAgICAgNjAsXG4gICAgICAgIHRoaXMucGFyc2VOdW1iZXIsXG4gICAgICApLFxuICAgICAgcmV0cnlBdHRlbXB0czogdGhpcy5nZXRDb25maWdWYWx1ZShcbiAgICAgICAgY29uZmlnLnJldHJ5QXR0ZW1wdHMsXG4gICAgICAgICdGRUFUVVJFX0ZMQUdfUkVUUllfQVRURU1QVFMnLFxuICAgICAgICAzLFxuICAgICAgICB0aGlzLnBhcnNlTnVtYmVyLFxuICAgICAgKSxcbiAgICAgIGVuYWJsZUFuYWx5dGljczogdGhpcy5nZXRDb25maWdWYWx1ZShcbiAgICAgICAgY29uZmlnLmVuYWJsZUFuYWx5dGljcyxcbiAgICAgICAgJ0ZFQVRVUkVfRkxBR19FTkFCTEVfQU5BTFlUSUNTJyxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgdGhpcy5wYXJzZUJvb2xlYW4sXG4gICAgICApLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgaW5pdGlhbGl6ZUZsYWdzbWl0aFNESyhjb25maWc6IFJlc29sdmVkRmVhdHVyZUZsYWdDb25maWcpOiB2b2lkIHtcbiAgICBpZiAoY29uZmlnLnByb3ZpZGVyICE9PSAnZmxhZ3NtaXRoJyB8fCAhY29uZmlnLmFwaUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQVBJIGtleSBpcyByZXF1aXJlZCBmb3IgRmxhZ3NtaXRoIHByb3ZpZGVyLiBTZXQgaXQgdmlhIGNvbmZpZy5hcGlLZXkgb3IgRkVBVFVSRV9GTEFHX0FQSV9LRVkgZW52aXJvbm1lbnQgdmFyaWFibGUuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaW5pdEZlYXR1cmVGbGFnQ2xpZW50KHtcbiAgICAgIHByb3ZpZGVyOiB7XG4gICAgICAgIHR5cGU6ICdmbGFnc21pdGgnLFxuICAgICAgICBhcGlLZXk6IGNvbmZpZy5hcGlLZXksXG4gICAgICAgIHRpbWVvdXRJblNlY29uZHM6IGNvbmZpZy50aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgcmV0cnlBdHRlbXB0czogY29uZmlnLnJldHJ5QXR0ZW1wdHMsXG4gICAgICAgIGVuYWJsZUxvY2FsRXZhbHVhdGlvbjogY29uZmlnLmVuYWJsZUxvY2FsRXZhbHVhdGlvbixcbiAgICAgICAgZW5hYmxlQW5hbHl0aWNzOiBjb25maWcuZW5hYmxlQW5hbHl0aWNzLFxuICAgICAgfSxcbiAgICAgIGNhY2hlOiB7XG4gICAgICAgIGVuYWJsZWQ6IGNvbmZpZy5lbmFibGVDYWNoZSxcbiAgICAgICAgdHRsSW5TZWNvbmRzOiBjb25maWcuY2FjaGVUdGxTZWNvbmRzLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldENvbmZpZ1ZhbHVlPFQ+KFxuICAgIGNvbmZpZ1ZhbHVlOiBUIHwgdW5kZWZpbmVkLFxuICAgIGVudktleTogc3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZTogVCxcbiAgICBwYXJzZXI/OiAodmFsdWU6IHN0cmluZykgPT4gVCxcbiAgKTogVCB7XG4gICAgY29uc3QgZW52VmFsdWUgPSBwcm9jZXNzLmVudltlbnZLZXldO1xuICAgIGlmIChlbnZWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAocGFyc2VyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlcihlbnZWYWx1ZSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIEZhbGwgYmFjayB0byBjb25maWcvZGVmYXVsdCBvbiBwYXJzZSBlcnJvclxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZW52VmFsdWUgYXMgVDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnVmFsdWUgIT09IHVuZGVmaW5lZCA/IGNvbmZpZ1ZhbHVlIDogZGVmYXVsdFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VCb29sZWFuKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBsb3dlclZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgaWYgKGxvd2VyVmFsdWUgPT09ICd0cnVlJyB8fCBsb3dlclZhbHVlID09PSAnMScgfHwgbG93ZXJWYWx1ZSA9PT0gJ3llcycpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAobG93ZXJWYWx1ZSA9PT0gJ2ZhbHNlJyB8fCBsb3dlclZhbHVlID09PSAnMCcgfHwgbG93ZXJWYWx1ZSA9PT0gJ25vJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYm9vbGVhbiB2YWx1ZTogXCIke3ZhbHVlfVwiYCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZU51bWJlcih2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBudW1WYWx1ZSA9IE51bWJlcih2YWx1ZS50cmltKCkpO1xuICAgIGlmIChOdW1iZXIuaXNOYU4obnVtVmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbnVtYmVyIHZhbHVlOiBcIiR7dmFsdWV9XCJgKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bVZhbHVlO1xuICB9XG5cbiAgLy8gVXRpbGl0eSBmb3IgcGFyc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgLy8gU3VwcG9ydHMgYm90aCBwYXR0ZXJuczpcbiAgLy8gLSBGRUFUVVJFX0ZMQUdfTE9DQUxfRU5BQkxFX0ZFQVRVUkUgKGdsb2JhbCBmbGFnIHdpdGggc2luZ2xlIHVuZGVyc2NvcmUpXG4gIC8vIC0gRkVBVFVSRV9GTEFHX0xPQ0FMX193b3Jrc3BhY2UxMjNfX0FQSV9fVElNRU9VVF9fTVMgKHdvcmtzcGFjZSBmbGFnIHdpdGggZG91YmxlIHVuZGVyc2NvcmUpXG4gIHN0YXRpYyBwYXJzZUVudktleShlbnZLZXk6IHN0cmluZyk6IHsgcHJlZml4OiBzdHJpbmc7IHdvcmtzcGFjZT86IHN0cmluZzsgZmxhZz86IHN0cmluZyB9IHtcbiAgICAvLyBDaGVjayBmb3Igd29ya3NwYWNlLXNwZWNpZmljIHBhdHRlcm4gZmlyc3QgKGNvbnRhaW5zIGRvdWJsZSB1bmRlcnNjb3JlKVxuICAgIGlmIChlbnZLZXkuaW5jbHVkZXMoJ19fJykpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gZW52S2V5LnNwbGl0KCdfXycpO1xuICAgICAgaWYgKHBhcnRzLmxlbmd0aCA8IDMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIHdvcmtzcGFjZSBlbnZpcm9ubWVudCBrZXkgZm9ybWF0OiBcIiR7ZW52S2V5fVwiLiBFeHBlY3RlZCBmb3JtYXQ6IFBSRUZJWF9fV09SS1NQQUNFX19GTEFHYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByZWZpeCA9IHBhcnRzWzBdO1xuICAgICAgY29uc3Qgd29ya3NwYWNlID0gcGFydHNbMV07XG4gICAgICBjb25zdCBmbGFnID0gcGFydHMuc2xpY2UoMikuam9pbignX18nKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByZWZpeCxcbiAgICAgICAgd29ya3NwYWNlLFxuICAgICAgICBmbGFnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBHbG9iYWwgcGF0dGVybiAoc2luZ2xlIHVuZGVyc2NvcmUpXG4gICAgY29uc3QgdW5kZXJzY29yZUluZGV4ID0gZW52S2V5LmluZGV4T2YoJ18nKTtcbiAgICBpZiAodW5kZXJzY29yZUluZGV4ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBlbnZpcm9ubWVudCBrZXkgZm9ybWF0OiBcIiR7ZW52S2V5fVwiLiBFeHBlY3RlZCBmb3JtYXQ6IFBSRUZJWF9GTEFHIG9yIFBSRUZJWF9fV09SS1NQQUNFX19GTEFHYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRmluZCB0aGUgbGFzdCBwYXJ0IGFmdGVyIHRoZSBwcmVmaXhcbiAgICBjb25zdCBwcmVmaXhQYXJ0cyA9IGVudktleS5zcGxpdCgnXycpO1xuICAgIGlmIChwcmVmaXhQYXJ0cy5sZW5ndGggPCA0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGdsb2JhbCBlbnZpcm9ubWVudCBrZXkgZm9ybWF0OiBcIiR7ZW52S2V5fVwiLiBFeHBlY3RlZCBmb3JtYXQ6IEZFQVRVUkVfRkxBR19MT0NBTF9GTEFHYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRm9yIEZFQVRVUkVfRkxBR19MT0NBTF9GTEFHX05BTUUsIHByZWZpeCBpcyBcIkZFQVRVUkVfRkxBR19MT0NBTFwiLCBmbGFnIGlzIFwiRkxBR19OQU1FXCJcbiAgICBjb25zdCBwcmVmaXggPSBwcmVmaXhQYXJ0cy5zbGljZSgwLCAzKS5qb2luKCdfJyk7IC8vIEZFQVRVUkVfRkxBR19MT0NBTFxuICAgIGNvbnN0IGZsYWcgPSBwcmVmaXhQYXJ0cy5zbGljZSgzKS5qb2luKCdfJyk7IC8vIEV2ZXJ5dGhpbmcgYWZ0ZXJcblxuICAgIHJldHVybiB7XG4gICAgICBwcmVmaXgsXG4gICAgICBmbGFnLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==