ab-test-middleware
Version:
An express middleware that manages multiple distributions for A/B/N testing purposes.
42 lines (37 loc) • 1.6 kB
JavaScript
const express = require('express');
const {
createCookieMiddleware,
createDefaultDistributionMiddleware,
createDistributionMiddleware,
createDistributionPathsMiddleware,
createDistributionToggleMiddleware,
createMiddlewareErrorHandler,
createTestGroupAssignationMiddleware,
} = require('./modules');
const validateOpts = (options) => {
const isFunc = (fn) => fn && {}.toString.call(fn) === '[object Function]';
if (!options.distributionToggleInterpreter) {
throw new Error('A toggle interpreter is required to run this middleware');
}
if (!options.testGroupToggleInterpreter) {
throw new Error('A test group toggle interpreter is required to run this middleware');
}
// eslint-disable-next-line max-len
if (!isFunc(options.distributionToggleInterpreter) || !isFunc(options.testGroupToggleInterpreter)) {
throw new Error('Toggle interpreters must be functions that take a distribution name as a parameter and return a boolean value.');
}
};
const createAbTestMiddleware = (options) => {
validateOpts(options);
const router = express.Router();
router.use(createDistributionPathsMiddleware(options));
router.use(createDistributionToggleMiddleware(options));
router.use(createCookieMiddleware(options));
router.use(createTestGroupAssignationMiddleware(options));
router.use(createMiddlewareErrorHandler('pre-dist'));
router.use(createDistributionMiddleware(options));
router.use(createDefaultDistributionMiddleware());
router.use(createMiddlewareErrorHandler('catch-all'));
return router;
};
module.exports = { createAbTestMiddleware };