UNPKG

unleash-server

Version:

Unleash is an enterprise ready feature toggles service. It provides different strategies for handling feature toggles.

73 lines 2.5 kB
"use strict"; 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