Skip to content

Commit 6e0d0be

Browse files
committed
lib: validate metrics batch/buffer config inputs
Add normalizePositiveFinite() helper that parses a raw value (env string, pkg value, or JS API input) to a positive finite number, returning a fallback when invalid. Refactor both initializeConfig() and updateConfig() to use the shared helper for metricsBatchSize and metricsBufferSize. This fixes initializeConfig() which previously used the +env || pkg || default pattern and would accept Infinity or negative numbers from environment variables or package.json. Expand test-nsolid-start-metrics-buffer.js to cover Infinity, -Infinity, and string variants of invalid values. Add test-nsolid-config-metrics-env.js to verify that invalid env values (Infinity, negative, zero, non-numeric) correctly fall back to defaults during initialization.
1 parent 03d3dbb commit 6e0d0be

4 files changed

Lines changed: 192 additions & 6 deletions

File tree

lib/nsolid.js

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ const {
66
DateNow,
77
JSONParse,
88
JSONStringify,
9+
Number,
10+
NumberIsFinite,
911
NumberParseInt,
1012
ObjectAssign,
1113
ObjectDefineProperty,
@@ -769,6 +771,11 @@ function updateConfig(config = {}) {
769771
if (normalized !== undefined) {
770772
nsolidConfig.assetsEnabled = normalized;
771773
}
774+
} else if (key === 'metricsBatchSize' || key === 'metricsBufferSize') {
775+
const value = normalizePositiveFinite(config[key], undefined);
776+
if (value !== undefined) {
777+
nsolidConfig[key] = value;
778+
}
772779
} else {
773780
nsolidConfig[key] = config[key];
774781
}
@@ -912,15 +919,19 @@ function initializeConfig(nsolidConfig) {
912919

913920
// Metrics batch size
914921
nsolidConfig.metricsBatchSize =
915-
+process.env.NSOLID_METRICS_BATCH_SIZE ||
916-
pkgConfig.nsolid.metricsBatchSize ||
917-
DEFAULT_METRICS_BATCH_SIZE;
922+
normalizePositiveFinite(
923+
process.env.NSOLID_METRICS_BATCH_SIZE,
924+
normalizePositiveFinite(
925+
pkgConfig.nsolid.metricsBatchSize,
926+
DEFAULT_METRICS_BATCH_SIZE));
918927

919928
// Metrics buffer size
920929
nsolidConfig.metricsBufferSize =
921-
+process.env.NSOLID_METRICS_BUFFER_SIZE ||
922-
pkgConfig.nsolid.metricsBufferSize ||
923-
DEFAULT_METRICS_BUFFER_SIZE;
930+
normalizePositiveFinite(
931+
process.env.NSOLID_METRICS_BUFFER_SIZE,
932+
normalizePositiveFinite(
933+
pkgConfig.nsolid.metricsBufferSize,
934+
DEFAULT_METRICS_BUFFER_SIZE));
924935

925936
nsolidConfig.tags = getTags(process.env.NSOLID_TAGS || pkgConfig.nsolid.tags);
926937

@@ -1134,6 +1145,21 @@ function optionToBool(value) {
11341145
}
11351146

11361147

1148+
// Parse a raw value (env string, pkg value, or JS API input) to a positive
1149+
// finite number. Returns the numeric value when valid, otherwise `fallback`.
1150+
function normalizePositiveFinite(raw, fallback) {
1151+
if (raw == null)
1152+
return fallback;
1153+
if (typeof raw === 'number' ||
1154+
(typeof raw === 'string' && raw.trim() !== '')) {
1155+
const value = Number(raw);
1156+
if (NumberIsFinite(value) && value > 0)
1157+
return value;
1158+
}
1159+
return fallback;
1160+
}
1161+
1162+
11371163
function genPackageList() {
11381164
let main_path;
11391165
let last_path;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
'use strict';
2+
3+
// This script is used by test-nsolid-config-metrics-env.js
4+
// to test environment variable configuration for metrics batch/buffer size
5+
6+
require('../common');
7+
const nsolid = require('nsolid');
8+
9+
// Start N|Solid with default configuration so initializeConfig() runs
10+
nsolid.start();
11+
12+
// Output the configuration as JSON
13+
console.log(JSON.stringify({
14+
metricsBatchSize: nsolid.config.metricsBatchSize,
15+
metricsBufferSize: nsolid.config.metricsBufferSize,
16+
}));
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
'use strict';
2+
3+
// This test verifies that metricsBatchSize and metricsBufferSize are correctly
4+
// validated when set via environment variables (initializeConfig path).
5+
// Invalid values (Infinity, negative, zero, non-numeric) must fall back to
6+
// the default.
7+
8+
require('../common');
9+
const assert = require('assert');
10+
const { spawnSync } = require('child_process');
11+
const path = require('path');
12+
13+
const DEFAULT_METRICS_BATCH_SIZE = 1;
14+
const DEFAULT_METRICS_BUFFER_SIZE = 100;
15+
16+
// Helper to run a small script with specific environment variables
17+
function runWithEnv(envVars) {
18+
const script = path.join(
19+
__dirname,
20+
'../fixtures/test-nsolid-config-metrics-env-script.js'
21+
);
22+
23+
const result = spawnSync(process.execPath, [script], {
24+
env: {
25+
...process.env,
26+
...envVars,
27+
},
28+
encoding: 'utf8',
29+
});
30+
31+
if (result.status !== 0) {
32+
console.error(result.stderr);
33+
throw new Error(`Script execution failed with status ${result.status}`);
34+
}
35+
36+
return JSON.parse(result.stdout.trim());
37+
}
38+
39+
// Test default values (no env vars set)
40+
{
41+
const config = runWithEnv({});
42+
assert.strictEqual(config.metricsBatchSize, DEFAULT_METRICS_BATCH_SIZE);
43+
assert.strictEqual(config.metricsBufferSize, DEFAULT_METRICS_BUFFER_SIZE);
44+
}
45+
46+
// Test valid numeric string values
47+
{
48+
const config = runWithEnv({
49+
NSOLID_METRICS_BATCH_SIZE: '5',
50+
NSOLID_METRICS_BUFFER_SIZE: '200',
51+
});
52+
assert.strictEqual(config.metricsBatchSize, 5);
53+
assert.strictEqual(config.metricsBufferSize, 200);
54+
}
55+
56+
// Test valid float string values (should be accepted as positive finite)
57+
{
58+
const config = runWithEnv({
59+
NSOLID_METRICS_BATCH_SIZE: '2.5',
60+
NSOLID_METRICS_BUFFER_SIZE: '50.5',
61+
});
62+
assert.strictEqual(config.metricsBatchSize, 2.5);
63+
assert.strictEqual(config.metricsBufferSize, 50.5);
64+
}
65+
66+
// Test invalid env values all fall back to default
67+
const invalidEnvValues = [
68+
'0',
69+
'-1',
70+
'-100',
71+
'Infinity',
72+
'-Infinity',
73+
'NaN',
74+
'',
75+
' ',
76+
'abc',
77+
'true',
78+
'false',
79+
];
80+
81+
for (const value of invalidEnvValues) {
82+
const config = runWithEnv({
83+
NSOLID_METRICS_BATCH_SIZE: value,
84+
NSOLID_METRICS_BUFFER_SIZE: value,
85+
});
86+
assert.strictEqual(
87+
config.metricsBatchSize,
88+
DEFAULT_METRICS_BATCH_SIZE,
89+
`metricsBatchSize should be default for env value: "${value}"`
90+
);
91+
assert.strictEqual(
92+
config.metricsBufferSize,
93+
DEFAULT_METRICS_BUFFER_SIZE,
94+
`metricsBufferSize should be default for env value: "${value}"`
95+
);
96+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
'use strict';
2+
3+
require('../common');
4+
const assert = require('assert');
5+
const nsolid = require('nsolid');
6+
7+
const defaultBatchSize = nsolid.config.metricsBatchSize;
8+
const defaultBufferSize = nsolid.config.metricsBufferSize;
9+
10+
nsolid.start({
11+
metricsBatchSize: defaultBatchSize + 1,
12+
metricsBufferSize: defaultBufferSize + 50
13+
});
14+
assert.strictEqual(nsolid.config.metricsBatchSize, defaultBatchSize + 1);
15+
assert.strictEqual(nsolid.config.metricsBufferSize, defaultBufferSize + 50);
16+
17+
nsolid.start({
18+
metricsBatchSize: `${defaultBatchSize + 2}`,
19+
metricsBufferSize: `${defaultBufferSize + 100}`
20+
});
21+
assert.strictEqual(nsolid.config.metricsBatchSize, defaultBatchSize + 2);
22+
assert.strictEqual(nsolid.config.metricsBufferSize, defaultBufferSize + 100);
23+
24+
// Invalid inputs should be ignored
25+
const invalidValues = [
26+
0, -1, NaN, Infinity, -Infinity,
27+
undefined, null, true, false, {}, [], () => {},
28+
'0', '-1', 'NaN', 'Infinity', '-Infinity', '', ' ',
29+
];
30+
for (const value of invalidValues) {
31+
nsolid.start({
32+
metricsBatchSize: value,
33+
metricsBufferSize: value
34+
});
35+
assert.strictEqual(nsolid.config.metricsBatchSize,
36+
defaultBatchSize + 2,
37+
`metricsBatchSize changed unexpectedly for value: ${String(value)}`);
38+
assert.strictEqual(nsolid.config.metricsBufferSize,
39+
defaultBufferSize + 100,
40+
`metricsBufferSize changed unexpectedly for value: ${String(value)}`);
41+
}
42+
43+
nsolid.start({
44+
metricsBatchSize: defaultBatchSize,
45+
metricsBufferSize: defaultBufferSize
46+
});
47+
assert.strictEqual(nsolid.config.metricsBatchSize, defaultBatchSize);
48+
assert.strictEqual(nsolid.config.metricsBufferSize, defaultBufferSize);

0 commit comments

Comments
 (0)