1 | 'use strict';
|
2 | const rp = require('request-promise-native');
|
3 |
|
4 | const ABBY_EXPERIMENTS_KEY = Symbol('__abbyExperiments');
|
5 | const ABBY_TIMEOUT_KEY = Symbol('__abbyTimeout');
|
6 | const ABBY_SYNC = Symbol('__abbySync');
|
7 | const UPDATE_INTERVAL = 60000 * 1;
|
8 | const logger = require('./logger').instance();
|
9 |
|
10 | let load = async (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 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 |
|
35 | let sync = {
|
36 | load
|
37 | };
|
38 |
|
39 | Object.defineProperty(sync, 'data', {
|
40 | get: () => {
|
41 | return Array.isArray(global[ABBY_EXPERIMENTS_KEY]) ? global[ABBY_EXPERIMENTS_KEY] : [];
|
42 | }
|
43 | });
|
44 |
|
45 | Object.defineProperty(sync, 'lastSync', {
|
46 | get: () => {
|
47 | return global[ABBY_SYNC];
|
48 | }
|
49 | });
|
50 |
|
51 | module.exports = sync;
|