UNPKG

1.54 kBJavaScriptView Raw
1'use strict';
2const rp = require('request-promise-native');
3
4const ABBY_EXPERIMENTS_KEY = Symbol('__abbyExperiments');
5const ABBY_TIMEOUT_KEY = Symbol('__abbyTimeout');
6const ABBY_SYNC = Symbol('__abbySync');
7const UPDATE_INTERVAL = 60000 * 1; // 1 minute
8const logger = require('./logger').instance();
9
10let load = async (/**Configs*/configs) => {
11 try {
12 let tags = configs.tags.split(',').map(tag => `tag=${tag}`).join('&');
13 let options = {
14 uri: `${configs.apiEndpoint}/experiments?${tags}`,
15 json: true
16 };
17
18 let /**Array.<Experiment>*/experiments = await rp(options);
19 global[ABBY_EXPERIMENTS_KEY] = experiments;
20 global[ABBY_SYNC] = new Date().toISOString();
21 return experiments;
22 } catch (e) {
23 logger.error(`abby-client cannot load experiments: ${configs.apiEndpoint}, tags: ${configs.tags}`);
24 return [];
25 } finally {
26 if (global[ABBY_TIMEOUT_KEY]) {
27 clearTimeout(global[ABBY_TIMEOUT_KEY]);
28 }
29 let interval = typeof configs.update_interval === 'number' ? configs.update_interval : UPDATE_INTERVAL;
30 global[ABBY_TIMEOUT_KEY] = setTimeout(() => load(configs), interval);
31 }
32};
33
34
35let sync = {
36 load
37};
38
39Object.defineProperty(sync, 'data', {
40 get: () => {
41 return Array.isArray(global[ABBY_EXPERIMENTS_KEY]) ? global[ABBY_EXPERIMENTS_KEY] : [];
42 }
43});
44
45Object.defineProperty(sync, 'lastSync', {
46 get: () => {
47 return global[ABBY_SYNC];
48 }
49});
50
51module.exports = sync;