@autofleet/settings 1.0.5 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -29,7 +29,7 @@ const waitingToNetwork = 'waitingToNetwork';
29
29
  const findUrl = (serviceUrl) => serviceUrl
30
30
  || (process.env.SETTING_MS_SERVICE_HOST && process.env.SETTING_MS_SERVICE_HOST.length > 0 ? `http://${process.env.SETTING_MS_SERVICE_HOST}/` : undefined)
31
31
  || (process.env.NODE_ENV !== 'test' ? 'http://setting-ms.autofleet.io/' : 'http://localhost:9999/');
32
- class ConnotGetNetworkValueError extends Error {
32
+ class CannotGetNetworkValueError extends Error {
33
33
  }
34
34
  class SettingsManager {
35
35
  constructor({ serviceUrl, ttl = fiveMinutes } = {}) {
@@ -87,7 +87,7 @@ class SettingsManager {
87
87
  catch (error) {
88
88
  logger.error('Cant get setting from network');
89
89
  if (rejectOnFail) {
90
- throw new ConnotGetNetworkValueError();
90
+ throw new CannotGetNetworkValueError();
91
91
  }
92
92
  }
93
93
  this.networkEvents.emit(cacheKey, networkValue);
@@ -105,55 +105,49 @@ class SettingsManager {
105
105
  }
106
106
  getMultiple(settingsToGet, labels, { timeout = 5000, rejectOnFail = false } = {}) {
107
107
  return __awaiter(this, void 0, void 0, function* () {
108
- settingsToGet.map((obj) => {
109
- if (typeof obj.defaultValue === 'undefined') {
110
- throw new Error(`Missing default value for key ${obj.key}`);
111
- }
112
- });
108
+ const settingsToReturn = new Map();
109
+ const settingsToFetch = [];
113
110
  if (process.env.NODE_ENV === 'test') {
114
111
  return settingsToGet.map((obj) => obj.defaultValue);
115
112
  }
116
- settingsToGet.map((obj) => __awaiter(this, void 0, void 0, function* () {
113
+ settingsToGet.map((obj) => {
117
114
  const cacheKey = `${obj.key}_${JSON.stringify(labels)}`;
118
115
  const cacheValue = this.settingsCache.get(cacheKey);
119
- if (cacheValue !== undefined) {
120
- if (waitingToNetwork === cacheValue) {
121
- yield nextTick();
122
- return new Promise((resolve) => {
123
- this.networkEvents.once(cacheKey, (networkValue) => {
124
- resolve(SettingsManager.readNetworkValue(networkValue, obj.defaultValue));
125
- });
126
- });
127
- }
116
+ if (cacheValue) {
117
+ settingsToReturn.set(obj.key, cacheValue);
118
+ }
119
+ else {
120
+ settingsToFetch.push(obj.key);
128
121
  }
129
- }));
130
- settingsToGet.map((obj) => {
131
- const cacheKey = `${obj.key}_${JSON.stringify(labels)}`;
132
- this.settingsCache.set(cacheKey, waitingToNetwork, this.ttl);
133
122
  });
134
- let values;
135
- try {
136
- const { data } = yield this.network.get('/api/v1/settings', {
137
- params: {
138
- keys: settingsToGet.map((obj) => obj.key),
139
- labels,
140
- },
141
- timeout,
142
- });
143
- values = data.values;
144
- }
145
- catch (err) {
146
- logger.error('Cant get setting from network', { err });
147
- if (rejectOnFail) {
148
- throw new ConnotGetNetworkValueError();
123
+ if (settingsToFetch.length > 0) {
124
+ let values;
125
+ try {
126
+ const { data } = yield this.network.get('/api/v1/settings', {
127
+ params: {
128
+ keys: settingsToFetch,
129
+ labels,
130
+ skipEntityQueryAddition: true,
131
+ },
132
+ timeout,
133
+ });
134
+ values = data;
135
+ settingsToFetch.map((key, index) => {
136
+ settingsToReturn.set(key, values[index]);
137
+ });
138
+ }
139
+ catch (err) {
140
+ logger.error('Cant get setting from network', { err });
141
+ if (rejectOnFail) {
142
+ throw new CannotGetNetworkValueError();
143
+ }
149
144
  }
150
145
  }
151
- return settingsToGet.map((setting, index) => {
146
+ return settingsToGet.map((setting) => {
152
147
  const cacheKey = `${setting.key}_${JSON.stringify(labels)}`;
153
- this.networkEvents.emit(cacheKey, values[index]);
154
148
  let returnValue;
155
149
  try {
156
- returnValue = SettingsManager.readNetworkValue(values[index], setting.defaultValue);
150
+ returnValue = SettingsManager.readNetworkValue(settingsToReturn.get(setting.key), setting.defaultValue);
157
151
  }
158
152
  catch (err) {
159
153
  this.settingsCache.del(cacheKey);
@@ -28,8 +28,9 @@ const mockMultipleSettings = (keys, values, response = 200) => {
28
28
  .get('/api/v1/settings')
29
29
  .query({
30
30
  keys,
31
+ skipEntityQueryAddition: true,
31
32
  });
32
- return n.reply(response, { values });
33
+ return n.reply(response, values);
33
34
  };
34
35
  describe('Settings', () => {
35
36
  describe('get', () => {
@@ -182,11 +183,24 @@ describe('Settings', () => {
182
183
  process.env.NODE_ENV = 'node-common-test';
183
184
  }));
184
185
  it('can get multiple settings', () => __awaiter(void 0, void 0, void 0, function* () {
185
- const mock = mockMultipleSettings(['key0', 'key1', 'key2'], ['value0', 'value1', 'value2']);
186
+ const mock = mockMultipleSettings(['key0', 'key1', 'key2'], [
187
+ {
188
+ key: 'key0',
189
+ value: 'value0',
190
+ },
191
+ {
192
+ key: 'key1',
193
+ value: 'value1',
194
+ },
195
+ {
196
+ key: 'key2',
197
+ value: 'value2',
198
+ },
199
+ ]);
186
200
  const settings = new index_1.default({
187
201
  serviceUrl: `http://${serviceUrl}/`,
188
202
  });
189
- const values = yield settings.getMultiple([
203
+ const settingObjects = yield settings.getMultiple([
190
204
  {
191
205
  key: 'key0',
192
206
  defaultValue: 'defaultValue0',
@@ -201,8 +215,8 @@ describe('Settings', () => {
201
215
  },
202
216
  ], []);
203
217
  expect(mock.isDone()).toBeTruthy();
204
- values.forEach((v, index) => {
205
- expect(v).toEqual(`value${index}`);
218
+ settingObjects.forEach((obj, index) => {
219
+ expect(obj.value).toEqual(`value${index}`);
206
220
  });
207
221
  }));
208
222
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autofleet/settings",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
package/src/index.test.ts CHANGED
@@ -15,14 +15,15 @@ const mockSetting = (key: string, value: string | boolean | number | never, labe
15
15
  return n.reply(response, { value });
16
16
  };
17
17
 
18
- const mockMultipleSettings = (keys: string[], values: string[], response = 200) => {
18
+ const mockMultipleSettings = (keys: string[], values: any[], response = 200) => {
19
19
  const n = nock(`http://${serviceUrl}`)
20
20
  .get('/api/v1/settings')
21
21
  .query({
22
22
  keys,
23
+ skipEntityQueryAddition: true,
23
24
  });
24
25
 
25
- return n.reply(response, { values });
26
+ return n.reply(response, values);
26
27
  };
27
28
 
28
29
  describe('Settings', () => {
@@ -209,13 +210,29 @@ describe('Settings', () => {
209
210
  });
210
211
 
211
212
  it('can get multiple settings', async () => {
212
- const mock = mockMultipleSettings(['key0', 'key1', 'key2'], ['value0', 'value1', 'value2']);
213
+ const mock = mockMultipleSettings(
214
+ ['key0', 'key1', 'key2'],
215
+ [
216
+ {
217
+ key: 'key0',
218
+ value: 'value0',
219
+ },
220
+ {
221
+ key: 'key1',
222
+ value: 'value1',
223
+ },
224
+ {
225
+ key: 'key2',
226
+ value: 'value2',
227
+ },
228
+ ],
229
+ );
213
230
 
214
231
  const settings = new Settings({
215
232
  serviceUrl: `http://${serviceUrl}/`,
216
233
  });
217
234
 
218
- const values = await settings.getMultiple([
235
+ const settingObjects = await settings.getMultiple([
219
236
  {
220
237
  key: 'key0',
221
238
  defaultValue: 'defaultValue0',
@@ -231,8 +248,8 @@ describe('Settings', () => {
231
248
  ], []);
232
249
 
233
250
  expect(mock.isDone()).toBeTruthy();
234
- values.forEach((v: any, index: number) => {
235
- expect(v).toEqual(`value${index}`);
251
+ settingObjects.forEach((obj: any, index: number) => {
252
+ expect(obj.value).toEqual(`value${index}`);
236
253
  });
237
254
  });
238
255
  });
package/src/index.ts CHANGED
@@ -40,7 +40,7 @@ interface GetSettingOption {
40
40
  rejectOnFail?: boolean;
41
41
  }
42
42
 
43
- class ConnotGetNetworkValueError extends Error {}
43
+ class CannotGetNetworkValueError extends Error {}
44
44
 
45
45
  class SettingsManager {
46
46
  ttl: number;
@@ -121,7 +121,7 @@ class SettingsManager {
121
121
  } catch (error) {
122
122
  logger.error('Cant get setting from network');
123
123
  if (rejectOnFail) {
124
- throw new ConnotGetNetworkValueError();
124
+ throw new CannotGetNetworkValueError();
125
125
  }
126
126
  }
127
127
 
@@ -145,59 +145,51 @@ class SettingsManager {
145
145
  labels: LabelsArray,
146
146
  { timeout = 5000, rejectOnFail = false } : GetSettingOption = {},
147
147
  ): Promise<any> {
148
- settingsToGet.map((obj) => {
149
- if (typeof obj.defaultValue === 'undefined') {
150
- throw new Error(`Missing default value for key ${obj.key}`);
151
- }
152
- });
153
-
148
+ const settingsToReturn = new Map();
149
+ const settingsToFetch: any[] = [];
154
150
  if (process.env.NODE_ENV === 'test') {
155
151
  return settingsToGet.map((obj) => obj.defaultValue);
156
152
  }
157
153
 
158
- settingsToGet.map(async (obj) => {
154
+ settingsToGet.map((obj) => {
159
155
  const cacheKey = `${obj.key}_${JSON.stringify(labels)}`;
160
156
  const cacheValue = this.settingsCache.get(cacheKey);
161
- if (cacheValue !== undefined) {
162
- if (waitingToNetwork === cacheValue) {
163
- await nextTick();
164
- return new Promise((resolve) => {
165
- this.networkEvents.once(cacheKey, (networkValue) => {
166
- resolve(SettingsManager.readNetworkValue(networkValue, obj.defaultValue));
167
- });
168
- });
169
- }
157
+ if (cacheValue) {
158
+ settingsToReturn.set(obj.key, cacheValue);
159
+ } else {
160
+ settingsToFetch.push(obj.key);
170
161
  }
171
162
  });
172
163
 
173
- settingsToGet.map((obj) => {
174
- const cacheKey = `${obj.key}_${JSON.stringify(labels)}`;
175
- this.settingsCache.set(cacheKey, waitingToNetwork, this.ttl);
176
- });
164
+ if (settingsToFetch.length > 0) {
165
+ let values: any[];
166
+ try {
167
+ const { data } = await this.network.get('/api/v1/settings', {
168
+ params: {
169
+ keys: settingsToFetch,
170
+ labels,
171
+ skipEntityQueryAddition: true,
172
+ },
173
+ timeout,
174
+ });
175
+ values = data;
177
176
 
178
- let values: any[];
179
- try {
180
- const { data } = await this.network.get('/api/v1/settings', {
181
- params: {
182
- keys: settingsToGet.map((obj) => obj.key),
183
- labels,
184
- },
185
- timeout,
186
- });
187
- values = data.values;
188
- } catch (err) {
189
- logger.error('Cant get setting from network', { err });
190
- if (rejectOnFail) {
191
- throw new ConnotGetNetworkValueError();
177
+ settingsToFetch.map((key, index) => {
178
+ settingsToReturn.set(key, values[index]);
179
+ });
180
+ } catch (err) {
181
+ logger.error('Cant get setting from network', { err });
182
+ if (rejectOnFail) {
183
+ throw new CannotGetNetworkValueError();
184
+ }
192
185
  }
193
186
  }
194
187
 
195
- return settingsToGet.map((setting: any, index: number) => {
188
+ return settingsToGet.map((setting: any) => {
196
189
  const cacheKey = `${setting.key}_${JSON.stringify(labels)}`;
197
- this.networkEvents.emit(cacheKey, values[index]);
198
190
  let returnValue;
199
191
  try {
200
- returnValue = SettingsManager.readNetworkValue(values[index], setting.defaultValue);
192
+ returnValue = SettingsManager.readNetworkValue(settingsToReturn.get(setting.key), setting.defaultValue);
201
193
  } catch (err) {
202
194
  this.settingsCache.del(cacheKey);
203
195
  throw err;