SplitTestMiddleware.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. const SplitTestV2Handler = require('./SplitTestV2Handler')
  2. const SplitTestCache = require('./SplitTestCache')
  3. const LocalsHelper = require('./LocalsHelper')
  4. const logger = require('@overleaf/logger')
  5. function loadAssignmentsInLocals(splitTestNames) {
  6. return async function (req, res, next) {
  7. try {
  8. if (!req.session.cachedSplitTestAssignments) {
  9. req.session.cachedSplitTestAssignments = {}
  10. }
  11. for (const splitTestName of splitTestNames) {
  12. if (req.query[splitTestName]) {
  13. LocalsHelper.setSplitTestVariant(
  14. res.locals,
  15. splitTestName,
  16. req.query[splitTestName]
  17. )
  18. } else {
  19. const splitTest = await SplitTestCache.get(splitTestName)
  20. if (splitTest) {
  21. await _loadAssignmentInLocals(splitTest, req.session, res.locals)
  22. }
  23. }
  24. }
  25. } catch (error) {
  26. logger.error(
  27. { err: error, splitTestNames },
  28. 'Failed to load split test assignments in express locals in middleware'
  29. )
  30. }
  31. next()
  32. }
  33. }
  34. async function _loadAssignmentInLocals(splitTest, session, locals) {
  35. const currentVersion = splitTest.getCurrentVersion()
  36. const cacheKey = `${splitTest.name}-${currentVersion.versionNumber}`
  37. if (currentVersion.active) {
  38. const cachedVariant = session.cachedSplitTestAssignments[cacheKey]
  39. if (cachedVariant) {
  40. LocalsHelper.setSplitTestVariant(locals, splitTest.name, cachedVariant)
  41. } else {
  42. const assignment = await SplitTestV2Handler.promises.getAssignmentForSession(
  43. session,
  44. splitTest.name
  45. )
  46. session.cachedSplitTestAssignments[cacheKey] = assignment.variant
  47. LocalsHelper.setSplitTestVariant(
  48. locals,
  49. splitTest.name,
  50. assignment.variant
  51. )
  52. }
  53. } else {
  54. delete session.cachedSplitTestAssignments[cacheKey]
  55. }
  56. }
  57. module.exports = {
  58. loadAssignmentsInLocals,
  59. }