react-on-rails-pro-node-renderer 16.5.0 → 16.6.0-rc.0
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/lib/shared/configBuilder.d.ts +3 -1
- package/lib/shared/configBuilder.d.ts.map +1 -1
- package/lib/shared/configBuilder.js +83 -8
- package/lib/shared/configBuilder.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/worker/handleRenderRequest.d.ts +1 -0
- package/lib/worker/handleRenderRequest.d.ts.map +1 -1
- package/lib/worker/handleRenderRequest.js +13 -9
- package/lib/worker/handleRenderRequest.js.map +1 -1
- package/lib/worker.d.ts.map +1 -1
- package/lib/worker.js +57 -70
- package/lib/worker.js.map +1 -1
- package/package.json +3 -3
- package/src/shared/configBuilder.ts +100 -11
- package/src/worker/handleRenderRequest.ts +14 -11
- package/src/worker.ts +70 -85
- package/tests/configBuilder.test.ts +323 -8
- package/tests/uploadRaceCondition.test.ts +9 -9
- package/tests/worker.test.ts +27 -2
|
@@ -29,7 +29,9 @@ export interface Config {
|
|
|
29
29
|
export declare function getConfig(): Config;
|
|
30
30
|
export declare function logSanitizedConfig(): void;
|
|
31
31
|
/**
|
|
32
|
-
* Lazily create the config
|
|
32
|
+
* Lazily create the config.
|
|
33
|
+
* Passing password: undefined means "keep the env/default password", not "clear the password".
|
|
34
|
+
* Other undefined keys retain normal JavaScript spread semantics.
|
|
33
35
|
*/
|
|
34
36
|
export declare function buildConfig(providedUserConfig?: Partial<Config>): Config;
|
|
35
37
|
//# sourceMappingURL=configBuilder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configBuilder.d.ts","sourceRoot":"","sources":["../../src/shared/configBuilder.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"configBuilder.d.ts","sourceRoot":"","sources":["../../src/shared/configBuilder.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AAavC,MAAM,WAAW,MAAM;IAIrB,IAAI,EAAE,MAAM,CAAC;IAIb,IAAI,EAAE,MAAM,CAAC;IAEb,QAAQ,EAAE,eAAe,CAAC;IAE1B,YAAY,EAAE,eAAe,CAAC;IAG9B,oBAAoB,EAAE,oBAAoB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAG9D,qBAAqB,EAAE,MAAM,CAAC;IAE9B,UAAU,CAAC,EAAE,MAAM,CAAC;IAMpB,cAAc,EAAE,OAAO,CAAC;IAKxB,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAElD,YAAY,EAAE,MAAM,CAAC;IAGrB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAI7B,yBAAyB,EAAE,MAAM,GAAG,SAAS,CAAC;IAE9C,oCAAoC,EAAE,MAAM,GAAG,SAAS,CAAC;IAGzD,4BAA4B,EAAE,MAAM,GAAG,SAAS,CAAC;IAEjD,qBAAqB,EAAE,MAAM,CAAC;IAE9B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAElC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1B,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,sBAAsB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAEzC,UAAU,EAAE,OAAO,CAAC;IAEpB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAIhC,8BAA8B,EAAE,OAAO,CAAC;IAIxC,aAAa,EAAE,MAAM,CAAC;CACvB;AAKD,wBAAgB,SAAS,WAMxB;AAuKD,wBAAgB,kBAAkB,SAYjC;AAgCD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CA8FxE"}
|
|
@@ -22,7 +22,6 @@ const DEFAULT_PORT = 3800;
|
|
|
22
22
|
const DEFAULT_LOG_LEVEL = 'info';
|
|
23
23
|
const { env } = process;
|
|
24
24
|
const MAX_DEBUG_SNIPPET_LENGTH = 1000;
|
|
25
|
-
const NODE_ENV = env.NODE_ENV || 'production';
|
|
26
25
|
let config;
|
|
27
26
|
let userConfig = {};
|
|
28
27
|
function getConfig() {
|
|
@@ -68,6 +67,24 @@ function logLevel(level) {
|
|
|
68
67
|
return DEFAULT_LOG_LEVEL;
|
|
69
68
|
}
|
|
70
69
|
}
|
|
70
|
+
function normalizedRuntimeEnvs() {
|
|
71
|
+
return [env.RAILS_ENV, env.NODE_ENV]
|
|
72
|
+
.filter((value) => Boolean(value))
|
|
73
|
+
.map((value) => value.toLowerCase());
|
|
74
|
+
}
|
|
75
|
+
function runtimeEnvsAllowDevelopmentDefaults() {
|
|
76
|
+
const runtimeEnvs = normalizedRuntimeEnvs();
|
|
77
|
+
// Fail closed: every present runtime env must be development/test before we allow
|
|
78
|
+
// missing-password defaults. Any production-like value, or no env at all, still
|
|
79
|
+
// requires an explicit password.
|
|
80
|
+
return runtimeEnvs.length > 0 && runtimeEnvs.every((value) => value === 'development' || value === 'test');
|
|
81
|
+
}
|
|
82
|
+
function defaultReplayServerAsyncOperationLogs() {
|
|
83
|
+
if (env.REPLAY_SERVER_ASYNC_OPERATION_LOGS != null) {
|
|
84
|
+
return (0, truthy_js_1.default)(env.REPLAY_SERVER_ASYNC_OPERATION_LOGS);
|
|
85
|
+
}
|
|
86
|
+
return env.NODE_ENV?.toLowerCase() === 'development';
|
|
87
|
+
}
|
|
71
88
|
const defaultConfig = {
|
|
72
89
|
// Use env port if we run on Heroku
|
|
73
90
|
port: Number(env.RENDERER_PORT) || DEFAULT_PORT,
|
|
@@ -96,8 +113,8 @@ const defaultConfig = {
|
|
|
96
113
|
maxDebugSnippetLength: MAX_DEBUG_SNIPPET_LENGTH,
|
|
97
114
|
// default to true if empty, otherwise it is set to false
|
|
98
115
|
stubTimers: env.RENDERER_STUB_TIMERS === 'true' || !env.RENDERER_STUB_TIMERS,
|
|
99
|
-
//
|
|
100
|
-
replayServerAsyncOperationLogs: (
|
|
116
|
+
// Default to true in development, otherwise it is set to false.
|
|
117
|
+
replayServerAsyncOperationLogs: defaultReplayServerAsyncOperationLogs(),
|
|
101
118
|
// Maximum number of VM contexts to keep in memory. Defaults to 2 since typically only two contexts
|
|
102
119
|
// are needed - one for the server bundle and one for React Server Components (RSC) if enabled.
|
|
103
120
|
maxVMPoolSize: (env.MAX_VM_POOL_SIZE && parseInt(env.MAX_VM_POOL_SIZE, 10)) || 2,
|
|
@@ -111,7 +128,8 @@ function envValuesUsed() {
|
|
|
111
128
|
RENDERER_SERVER_BUNDLE_CACHE_PATH: !userConfig.serverBundleCachePath && env.RENDERER_SERVER_BUNDLE_CACHE_PATH,
|
|
112
129
|
RENDERER_BUNDLE_PATH: !userConfig.serverBundleCachePath && !userConfig.bundlePath && env.RENDERER_BUNDLE_PATH,
|
|
113
130
|
RENDERER_WORKERS_COUNT: !userConfig.workersCount && env.RENDERER_WORKERS_COUNT,
|
|
114
|
-
|
|
131
|
+
// Explicit password overrides, including empty strings, intentionally suppress the env-derived value here.
|
|
132
|
+
RENDERER_PASSWORD: userConfig.password === undefined && env.RENDERER_PASSWORD && '<MASKED>',
|
|
115
133
|
RENDERER_SUPPORT_MODULES: !('supportModules' in userConfig) && env.RENDERER_SUPPORT_MODULES,
|
|
116
134
|
RENDERER_STUB_TIMERS: !('stubTimers' in userConfig) && env.RENDERER_STUB_TIMERS,
|
|
117
135
|
RENDERER_ALL_WORKERS_RESTART_INTERVAL: !userConfig.allWorkersRestartInterval && env.RENDERER_ALL_WORKERS_RESTART_INTERVAL,
|
|
@@ -124,10 +142,19 @@ function envValuesUsed() {
|
|
|
124
142
|
};
|
|
125
143
|
}
|
|
126
144
|
function sanitizedSettings(aConfig, defaultValue) {
|
|
145
|
+
let sanitizedPassword = defaultValue;
|
|
146
|
+
if (aConfig?.password === '') {
|
|
147
|
+
sanitizedPassword = '<EMPTY STRING>';
|
|
148
|
+
}
|
|
149
|
+
else if (aConfig?.password) {
|
|
150
|
+
sanitizedPassword = '<MASKED>';
|
|
151
|
+
}
|
|
127
152
|
return aConfig && Object.keys(aConfig).length > 0
|
|
128
153
|
? {
|
|
129
154
|
...aConfig,
|
|
130
|
-
|
|
155
|
+
// Distinguish explicit empty-string overrides from truly missing passwords in diagnostics.
|
|
156
|
+
// Empty strings still flow through as explicit overrides and fail validation in production-like envs.
|
|
157
|
+
password: sanitizedPassword,
|
|
131
158
|
allWorkersRestartInterval: aConfig.allWorkersRestartInterval || defaultValue,
|
|
132
159
|
delayBetweenIndividualWorkerRestarts: aConfig.delayBetweenIndividualWorkerRestarts || defaultValue,
|
|
133
160
|
gracefulWorkerRestartTimeout: aConfig.gracefulWorkerRestartTimeout || defaultValue,
|
|
@@ -138,18 +165,61 @@ function logSanitizedConfig() {
|
|
|
138
165
|
log_js_1.default.info({
|
|
139
166
|
'Node Renderer version': packageJson_js_1.default.version,
|
|
140
167
|
'Protocol version': packageJson_js_1.default.protocolVersion,
|
|
141
|
-
'Default settings': defaultConfig,
|
|
168
|
+
'Default settings at module load (env-backed values may lag current runtime)': sanitizedSettings(defaultConfig, '<NOT PROVIDED AT MODULE LOAD>'),
|
|
142
169
|
'ENV values used for settings (use "RENDERER_" prefix)': envValuesUsed(),
|
|
143
170
|
'Customized values for settings from config object (overrides ENV)': sanitizedSettings(userConfig),
|
|
144
171
|
'Final renderer settings': sanitizedSettings(config, '<NOT PROVIDED>'),
|
|
145
172
|
});
|
|
146
173
|
}
|
|
174
|
+
function validatePasswordForProduction(aConfig) {
|
|
175
|
+
// Only a truthy password satisfies the production-like requirement. Null, undefined, and empty strings are
|
|
176
|
+
// all treated as missing passwords.
|
|
177
|
+
if (aConfig.password)
|
|
178
|
+
return null;
|
|
179
|
+
// Require all present runtime envs to be development/test; fail closed otherwise.
|
|
180
|
+
// If either env indicates a production-like value, or neither env is set, password is required.
|
|
181
|
+
// This preserves a fail-closed invariant across the renderer startup path and the Ruby-side checks.
|
|
182
|
+
const allowMissingPassword = runtimeEnvsAllowDevelopmentDefaults();
|
|
183
|
+
if (allowMissingPassword)
|
|
184
|
+
return null;
|
|
185
|
+
return ('RENDERER_PASSWORD must be set in production-like environments ' +
|
|
186
|
+
`(NODE_ENV: "${env.NODE_ENV ?? '(not set)'}", RAILS_ENV: "${env.RAILS_ENV ?? '(not set)'}").` +
|
|
187
|
+
'\n\n' +
|
|
188
|
+
'In development and test environments, the renderer password is optional and no authentication\n' +
|
|
189
|
+
'is required. In all other environments, you must explicitly configure a password to secure\n' +
|
|
190
|
+
'communication between Rails and the Node Renderer.\n\n' +
|
|
191
|
+
'To fix this, set the RENDERER_PASSWORD environment variable:\n\n' +
|
|
192
|
+
' export RENDERER_PASSWORD="your-secure-password"\n\n' +
|
|
193
|
+
'Or pass it in the config object:\n\n' +
|
|
194
|
+
' reactOnRailsProNodeRenderer({ password: process.env.RENDERER_PASSWORD });\n\n' +
|
|
195
|
+
'Environment matrix:\n' +
|
|
196
|
+
' development — password optional (no authentication)\n' +
|
|
197
|
+
' test — password optional (no authentication)\n' +
|
|
198
|
+
' (neither set) — treated as production-like; RENDERER_PASSWORD required\n' +
|
|
199
|
+
' all other environments (staging, production, qa, preview, etc.) — RENDERER_PASSWORD required');
|
|
200
|
+
}
|
|
147
201
|
/**
|
|
148
|
-
* Lazily create the config
|
|
202
|
+
* Lazily create the config.
|
|
203
|
+
* Passing password: undefined means "keep the env/default password", not "clear the password".
|
|
204
|
+
* Other undefined keys retain normal JavaScript spread semantics.
|
|
149
205
|
*/
|
|
150
206
|
function buildConfig(providedUserConfig) {
|
|
151
207
|
userConfig = providedUserConfig || {};
|
|
152
|
-
|
|
208
|
+
const explicitUndefinedPassword = Object.prototype.hasOwnProperty.call(userConfig, 'password') && userConfig.password === undefined;
|
|
209
|
+
if (explicitUndefinedPassword && !runtimeEnvsAllowDevelopmentDefaults()) {
|
|
210
|
+
log_js_1.default.warn('buildConfig({ password: undefined }) preserves the env/default password rather than clearing it. ' +
|
|
211
|
+
'In production-like environments, a password is always required and cannot be cleared.');
|
|
212
|
+
}
|
|
213
|
+
const runtimeDefaultConfig = {
|
|
214
|
+
...defaultConfig,
|
|
215
|
+
password: env.RENDERER_PASSWORD,
|
|
216
|
+
// Re-evaluate env-derived defaults at build time in case env vars are set post-import.
|
|
217
|
+
replayServerAsyncOperationLogs: defaultReplayServerAsyncOperationLogs(),
|
|
218
|
+
};
|
|
219
|
+
config = { ...runtimeDefaultConfig, ...userConfig };
|
|
220
|
+
if (explicitUndefinedPassword) {
|
|
221
|
+
config.password = runtimeDefaultConfig.password;
|
|
222
|
+
}
|
|
153
223
|
// Handle bundlePath deprecation
|
|
154
224
|
if ('bundlePath' in userConfig) {
|
|
155
225
|
log_js_1.default.warn('bundlePath is deprecated and will be removed in a future version. ' +
|
|
@@ -196,6 +266,11 @@ function buildConfig(providedUserConfig) {
|
|
|
196
266
|
log_js_1.default.error('includeTimerPolyfills is renamed to stubTimers in RoRP 4.0');
|
|
197
267
|
process.exit(1);
|
|
198
268
|
}
|
|
269
|
+
const passwordValidationError = validatePasswordForProduction(config);
|
|
270
|
+
if (passwordValidationError) {
|
|
271
|
+
log_js_1.default.error(passwordValidationError);
|
|
272
|
+
process.exit(1);
|
|
273
|
+
}
|
|
199
274
|
log_js_1.default.level = config.logLevel;
|
|
200
275
|
return config;
|
|
201
276
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configBuilder.js","sourceRoot":"","sources":["../../src/shared/configBuilder.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"configBuilder.js","sourceRoot":"","sources":["../../src/shared/configBuilder.ts"],"names":[],"mappings":"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"}
|