@segment/analytics-react-native
Version:
The hassle-free way to add Segment analytics to your React-Native app.
171 lines (163 loc) • 7.49 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.validateRateLimitConfig = exports.validateIntegrations = exports.validateBackoffConfig = exports.mergeHttpConfig = exports.extractHttpConfig = void 0;
var _constants = require("./constants");
const validateRateLimitConfig = (config, logger) => {
const validated = {
...config
};
if (validated.maxRetryInterval < 0.1) {
logger?.warn(`maxRetryInterval ${validated.maxRetryInterval}s clamped to 0.1s`);
validated.maxRetryInterval = 0.1;
} else if (validated.maxRetryInterval > 86400) {
logger?.warn(`maxRetryInterval ${validated.maxRetryInterval}s clamped to 86400s`);
validated.maxRetryInterval = 86400;
}
if (validated.maxRateLimitDuration < 60) {
logger?.warn(`maxRateLimitDuration ${validated.maxRateLimitDuration}s clamped to 60s`);
validated.maxRateLimitDuration = 60;
} else if (validated.maxRateLimitDuration > 604800) {
logger?.warn(`maxRateLimitDuration ${validated.maxRateLimitDuration}s clamped to 604800s`);
validated.maxRateLimitDuration = 604800;
}
if (validated.maxRetryCount < 1) {
logger?.warn(`maxRetryCount ${validated.maxRetryCount} clamped to 1`);
validated.maxRetryCount = 1;
} else if (validated.maxRetryCount > 100) {
logger?.warn(`maxRetryCount ${validated.maxRetryCount} clamped to 100`);
validated.maxRetryCount = 100;
}
// Relational: maxRateLimitDuration >= 2x maxRetryInterval
const minRateLimitDuration = validated.maxRetryInterval * 2;
if (validated.maxRateLimitDuration < minRateLimitDuration) {
logger?.warn(`maxRateLimitDuration ${validated.maxRateLimitDuration}s clamped to ${minRateLimitDuration}s (2x maxRetryInterval)`);
validated.maxRateLimitDuration = minRateLimitDuration;
}
return validated;
};
exports.validateRateLimitConfig = validateRateLimitConfig;
const validateBackoffConfig = (config, logger, rateLimitConfig) => {
const validated = {
...config
};
if (validated.maxBackoffInterval < 0.1) {
logger?.warn(`maxBackoffInterval ${validated.maxBackoffInterval}s clamped to 0.1s`);
validated.maxBackoffInterval = 0.1;
} else if (validated.maxBackoffInterval > 86400) {
logger?.warn(`maxBackoffInterval ${validated.maxBackoffInterval}s clamped to 86400s`);
validated.maxBackoffInterval = 86400;
}
if (validated.baseBackoffInterval < 0.1) {
logger?.warn(`baseBackoffInterval ${validated.baseBackoffInterval}s clamped to 0.1s`);
validated.baseBackoffInterval = 0.1;
} else if (validated.baseBackoffInterval > 300) {
logger?.warn(`baseBackoffInterval ${validated.baseBackoffInterval}s clamped to 300s`);
validated.baseBackoffInterval = 300;
}
if (validated.maxTotalBackoffDuration < 60) {
logger?.warn(`maxTotalBackoffDuration ${validated.maxTotalBackoffDuration}s clamped to 60s`);
validated.maxTotalBackoffDuration = 60;
} else if (validated.maxTotalBackoffDuration > 604800) {
logger?.warn(`maxTotalBackoffDuration ${validated.maxTotalBackoffDuration}s clamped to 604800s`);
validated.maxTotalBackoffDuration = 604800;
}
if (validated.jitterPercent < 0) {
logger?.warn(`jitterPercent ${validated.jitterPercent} clamped to 0`);
validated.jitterPercent = 0;
} else if (validated.jitterPercent > 100) {
logger?.warn(`jitterPercent ${validated.jitterPercent} clamped to 100`);
validated.jitterPercent = 100;
}
if (validated.maxRetryCount < 1) {
logger?.warn(`maxRetryCount ${validated.maxRetryCount} clamped to 1`);
validated.maxRetryCount = 1;
} else if (validated.maxRetryCount > 100) {
logger?.warn(`maxRetryCount ${validated.maxRetryCount} clamped to 100`);
validated.maxRetryCount = 100;
}
// Relational: baseBackoffInterval <= maxBackoffInterval
if (validated.baseBackoffInterval > validated.maxBackoffInterval) {
logger?.warn(`baseBackoffInterval ${validated.baseBackoffInterval}s clamped to maxBackoffInterval ${validated.maxBackoffInterval}s`);
validated.baseBackoffInterval = validated.maxBackoffInterval;
}
// Relational: maxTotalBackoffDuration >= 2x max(maxBackoffInterval, rateLimitConfig.maxRetryInterval)
const maxInterval = Math.max(validated.maxBackoffInterval, rateLimitConfig?.maxRetryInterval ?? 0);
const minTotalDuration = maxInterval * 2;
if (validated.maxTotalBackoffDuration < minTotalDuration) {
logger?.warn(`maxTotalBackoffDuration ${validated.maxTotalBackoffDuration}s clamped to ${minTotalDuration}s (2x max interval)`);
validated.maxTotalBackoffDuration = minTotalDuration;
}
return validated;
};
/**
* Validates and normalizes integrations from CDN response.
* Returns null if integrations are malformed (triggers fallback to defaults).
*/
exports.validateBackoffConfig = validateBackoffConfig;
const validateIntegrations = (settings, logger) => {
// A valid 200 with missing integrations means "no integrations configured"
if (settings.integrations == null) {
return {};
}
// Only fall back to defaults for truly malformed types (non-object or array)
if (typeof settings.integrations !== 'object' || Array.isArray(settings.integrations)) {
logger?.warn('CDN response has invalid integrations, falling back to defaults');
return null;
}
return settings.integrations;
};
/**
* Extracts, merges, and validates httpConfig from CDN response.
* Deep-merges with defaults and validates all values.
*/
exports.validateIntegrations = validateIntegrations;
const extractHttpConfig = (serverConfig, logger) => {
const mergedRateLimit = serverConfig.rateLimitConfig ? {
..._constants.defaultHttpConfig.rateLimitConfig,
...serverConfig.rateLimitConfig
} : _constants.defaultHttpConfig.rateLimitConfig;
const mergedBackoff = serverConfig.backoffConfig ? {
..._constants.defaultHttpConfig.backoffConfig,
...serverConfig.backoffConfig,
statusCodeOverrides: {
..._constants.defaultHttpConfig.backoffConfig.statusCodeOverrides,
...serverConfig.backoffConfig.statusCodeOverrides
}
} : _constants.defaultHttpConfig.backoffConfig;
const validatedRateLimit = validateRateLimitConfig(mergedRateLimit, logger);
return {
rateLimitConfig: validatedRateLimit,
backoffConfig: validateBackoffConfig(mergedBackoff, logger, validatedRateLimit)
};
};
/**
* Merge httpConfig from 3 sources with priority: default < CDN < client overrides
* Used during settings initialization to combine default, CDN, and user configs.
*/
exports.extractHttpConfig = extractHttpConfig;
const mergeHttpConfig = (cdnConfig, clientConfig, logger) => {
const mergedRateLimit = {
..._constants.defaultHttpConfig.rateLimitConfig,
...(cdnConfig?.rateLimitConfig ?? {}),
...(clientConfig?.rateLimitConfig ?? {})
};
const mergedBackoff = {
..._constants.defaultHttpConfig.backoffConfig,
...(cdnConfig?.backoffConfig ?? {}),
...(clientConfig?.backoffConfig ?? {}),
statusCodeOverrides: {
..._constants.defaultHttpConfig.backoffConfig.statusCodeOverrides,
...(cdnConfig?.backoffConfig?.statusCodeOverrides ?? {}),
...(clientConfig?.backoffConfig?.statusCodeOverrides ?? {})
}
};
const validatedRateLimit = validateRateLimitConfig(mergedRateLimit, logger);
return {
rateLimitConfig: validatedRateLimit,
backoffConfig: validateBackoffConfig(mergedBackoff, logger, validatedRateLimit)
};
};
exports.mergeHttpConfig = mergeHttpConfig;
//# sourceMappingURL=config-validation.js.map