unleash-server
Version:
Unleash is an enterprise ready feature toggles service. It provides different strategies for handling feature toggles.
73 lines • 2.5 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.selectVariant = exports.getDefaultVariant = void 0;
const util_1 = __importDefault(require("./strategy/util"));
const helpers_1 = require("./helpers");
var PayloadType;
(function (PayloadType) {
PayloadType["STRING"] = "string";
})(PayloadType || (PayloadType = {}));
function getDefaultVariant() {
return {
name: 'disabled',
enabled: false,
};
}
exports.getDefaultVariant = getDefaultVariant;
function randomString() {
return String(Math.round(Math.random() * 100000));
}
const stickinessSelectors = ['userId', 'sessionId', 'remoteAddress'];
function getSeed(context, stickiness = 'default') {
if (stickiness !== 'default') {
const value = (0, helpers_1.resolveContextValue)(context, stickiness);
return value ? value.toString() : randomString();
}
let result;
stickinessSelectors.some((key) => {
const value = context[key];
if (typeof value === 'string' && value !== '') {
result = value;
return true;
}
return false;
});
return result || randomString();
}
function overrideMatchesContext(context) {
return (o) => o.values.some((value) => value === (0, helpers_1.resolveContextValue)(context, o.contextName));
}
function findOverride(feature, context) {
return feature.variants
.filter((variant) => variant.overrides)
.find((variant) => variant.overrides.some(overrideMatchesContext(context)));
}
function selectVariant(feature, context) {
const totalWeight = feature.variants.reduce((acc, v) => acc + v.weight, 0);
if (totalWeight <= 0) {
return null;
}
const variantOverride = findOverride(feature, context);
if (variantOverride) {
return variantOverride;
}
const { stickiness } = feature.variants[0];
const target = (0, util_1.default)(getSeed(context, stickiness), feature.name, totalWeight);
let counter = 0;
const variant = feature.variants.find((v) => {
if (v.weight === 0) {
return undefined;
}
counter += v.weight;
if (counter < target) {
return undefined;
}
return v;
});
return variant || null;
}
exports.selectVariant = selectVariant;
//# sourceMappingURL=variant.js.map