@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 +33 -39
- package/dist/index.test.js +19 -5
- package/package.json +1 -1
- package/src/index.test.ts +23 -6
- package/src/index.ts +31 -39
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
|
|
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
|
|
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
|
-
|
|
109
|
-
|
|
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) =>
|
|
113
|
+
settingsToGet.map((obj) => {
|
|
117
114
|
const cacheKey = `${obj.key}_${JSON.stringify(labels)}`;
|
|
118
115
|
const cacheValue = this.settingsCache.get(cacheKey);
|
|
119
|
-
if (cacheValue
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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
|
|
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(
|
|
150
|
+
returnValue = SettingsManager.readNetworkValue(settingsToReturn.get(setting.key), setting.defaultValue);
|
|
157
151
|
}
|
|
158
152
|
catch (err) {
|
|
159
153
|
this.settingsCache.del(cacheKey);
|
package/dist/index.test.js
CHANGED
|
@@ -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,
|
|
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'], [
|
|
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
|
|
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
|
-
|
|
205
|
-
expect(
|
|
218
|
+
settingObjects.forEach((obj, index) => {
|
|
219
|
+
expect(obj.value).toEqual(`value${index}`);
|
|
206
220
|
});
|
|
207
221
|
}));
|
|
208
222
|
});
|
package/package.json
CHANGED
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:
|
|
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,
|
|
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(
|
|
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
|
|
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
|
-
|
|
235
|
-
expect(
|
|
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
|
|
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
|
|
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
|
-
|
|
149
|
-
|
|
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(
|
|
154
|
+
settingsToGet.map((obj) => {
|
|
159
155
|
const cacheKey = `${obj.key}_${JSON.stringify(labels)}`;
|
|
160
156
|
const cacheValue = this.settingsCache.get(cacheKey);
|
|
161
|
-
if (cacheValue
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
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
|
|
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(
|
|
192
|
+
returnValue = SettingsManager.readNetworkValue(settingsToReturn.get(setting.key), setting.defaultValue);
|
|
201
193
|
} catch (err) {
|
|
202
194
|
this.settingsCache.del(cacheKey);
|
|
203
195
|
throw err;
|