Fix #2607: align Pro worker-count env var naming#2611
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
WalkthroughNode renderer now parses worker counts via a new helper: primary Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~12 minutes Poem
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
📝 Coding Plan
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Review: Fix #2607 – align Pro worker-count env var namingOverall the change is clean and the backward-compatibility story is solid. A couple of issues worth addressing: 1.
|
Greptile SummaryThis PR standardizes the worker-count env var naming for the Pro Node Renderer. The generated template (
Confidence Score: 5/5
Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
A["workersCount resolution"] --> B{"RENDERER_WORKERS_COUNT\nset?"}
B -- "Yes" --> C["Use Number(RENDERER_WORKERS_COUNT)"]
B -- "No" --> D{"NODE_RENDERER_CONCURRENCY\nset? (legacy)"}
D -- "Yes" --> E["Use Number(NODE_RENDERER_CONCURRENCY)"]
D -- "No" --> F["Default: 3"]
G["CI environment?"] --> H{"env.CI truthy?"}
H -- "Yes" --> I["Override: workersCount = 2"]
H -- "No" --> J["Keep resolved value"]
Last reviewed commit: 960a39e |
size-limit report 📦
|
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In
`@react_on_rails/lib/generators/react_on_rails/templates/pro/base/client/node-renderer.js`:
- Around line 17-22: The workersCount calculation currently allows non-numeric
env values to produce NaN; update the logic that reads
env.RENDERER_WORKERS_COUNT and env.NODE_RENDERER_CONCURRENCY so you parse values
(e.g., parseInt) and validate they are finite non-negative integers before
accepting them, treat empty or invalid strings as null/ignored, and only fall
back to the next source or default 3 when validation fails; ensure the
normalized workersCount variable passed to master.ts (for loop) and checked in
ReactOnRailsProNodeRenderer.ts (workersCount === 0) is always a valid integer or
null to preserve single-process detection and avoid NaN propagation.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 9eaf0e0e-a167-482b-85e0-a49a8b05d408
📒 Files selected for processing (3)
docs/oss/getting-started/pro-quick-start.mdpackages/react-on-rails-pro-node-renderer/README.mdreact_on_rails/lib/generators/react_on_rails/templates/pro/base/client/node-renderer.js
Review SummaryOverall the direction is correct — using Issues1. Whitespace-only string treated as 2. Zero workers allowed without warning (inline, template line 8) 3. No deprecation signal for legacy env var (inline, template lines 22–25) 4. Doc example diverges from template pattern (inline, quick-start lines 126–139) MinorThe README table update is accurate and the wording is clear. No issues there. |
Follow-up after latest commit (3c00d20)The latest commit addressed two issues flagged earlier:
One issue remains in both files: the guard uses If 0 is intentional (e.g. as a single-process sentinel the underlying library uses), that should be explicitly documented rather than accepted silently here. |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@docs/oss/migrating/rsc-troubleshooting.md`:
- Line 378: The documentation shows an invalid parenthesized directive ("('use
client')") which will not be recognized by parsers or the ESLint rule; replace
every occurrence of the parenthesized form with a bare string literal 'use
client' (no parentheses) so the directive prologue is valid and detectable by
the rule (see the snippet "('use client')" and the
eslint-rules/no-use-client-in-server-files.cjs tests for context).
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 32c55612-e34a-4f3a-866d-1aa21f1a819b
📒 Files selected for processing (2)
docs/README.mddocs/oss/migrating/rsc-troubleshooting.md
✅ Files skipped from review due to trivial changes (1)
- docs/README.md
Review SummaryThe core logic change (introducing RENDERER_WORKERS_COUNT as the canonical env var with a NODE_RENDERER_CONCURRENCY fallback) is sound and the parseWorkersCount validation helper is a genuine improvement over the old unguarded Number() cast. Bug in docs (rsc-troubleshooting.md) — The change from bare string literals to parenthesized form ('use client') in the GOOD examples introduces incorrect syntax. Bundlers (Next.js/Turbopack/webpack) detect the directive as a bare StringLiteral AST node; wrapping it in parens creates a ParenthesizedExpression that is not reliably recognized as a directive. This change appears unrelated to the PR's stated goal and should be reverted. Inline comments posted on the specific lines. CI override silently beats the new canonical env var — The pre-existing Minor: parseWorkersCount is duplicated between the generator template and pro-quick-start.md — expected for generated-file docs, but future changes to validation logic need updating in both places. |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
docs/oss/getting-started/pro-quick-start.md (1)
122-128: Add brief explanation of parseWorkersCount helper.The
parseWorkersCountfunction is introduced without context. For a quick-start guide, a one-sentence explanation would help users understand its purpose (e.g., "validates and normalizes worker count values, returning an integer >= 0 or null for invalid inputs").📝 Suggested documentation addition
const { env } = process; +// Helper to validate and normalize worker count environment variables const parseWorkersCount = (value) => { if (value == null) return null; const normalized = typeof value === 'string' ? value.trim() : String(value); if (normalized === '') return null; const parsed = Number(normalized); return Number.isInteger(parsed) && parsed >= 0 ? parsed : null; };🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/oss/getting-started/pro-quick-start.md` around lines 122 - 128, Add a one-sentence explanation for the parseWorkersCount helper immediately before (or inline with) the function declaration that briefly describes its purpose and behavior: e.g., state that parseWorkersCount validates and normalizes worker count inputs, returning an integer >= 0 on success or null for empty/invalid values; keep the sentence concise and place it next to the parseWorkersCount function so readers of the quick-start guide understand what it does at a glance.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@docs/oss/getting-started/pro-quick-start.md`:
- Around line 136-137: Update the docs to explicitly state that
RENDERER_WORKERS_COUNT is the canonical env var and NODE_RENDERER_CONCURRENCY is
the legacy fallback used for backward compatibility (referencing the
workersCount resolution using parseWorkersCount(env.RENDERER_WORKERS_COUNT) ??
parseWorkersCount(env.NODE_RENDERER_CONCURRENCY) ?? 3), and add a note that a
CI-specific override (process.env.CI check in node-renderer.js that forces
workersCount to 2) takes precedence over that resolution chain and will affect
CI runs across platforms; ensure both behaviors and their precedence are clearly
described so users understand why configured counts may differ in CI.
---
Nitpick comments:
In `@docs/oss/getting-started/pro-quick-start.md`:
- Around line 122-128: Add a one-sentence explanation for the parseWorkersCount
helper immediately before (or inline with) the function declaration that briefly
describes its purpose and behavior: e.g., state that parseWorkersCount validates
and normalizes worker count inputs, returning an integer >= 0 on success or null
for empty/invalid values; keep the sentence concise and place it next to the
parseWorkersCount function so readers of the quick-start guide understand what
it does at a glance.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: fc1754ad-cf9e-4109-8301-3c693bf76e2c
📒 Files selected for processing (2)
docs/oss/getting-started/pro-quick-start.mdreact_on_rails/lib/generators/react_on_rails/templates/pro/base/client/node-renderer.js
🚧 Files skipped from review as they are similar to previous changes (1)
- react_on_rails/lib/generators/react_on_rails/templates/pro/base/client/node-renderer.js
Review of PR #2611: Fix env var naming for Pro worker countSummaryThe core change — making Bug: Unrelated
|
Code ReviewOverall this is a clean, well-structured change. The backward-compatibility design is correct: ObservationsDead code in Spec coverage is presence-only Pre-existing: |
ReviewThe fix is clean and correct. The A few observations: Missing CHANGELOG entry — This fixes a real user-facing issue (#2607) in the Pro generator template. Per the changelog guidelines, a Silent fallback on invalid value — Noted inline on Pre-existing Doc/template duplication — Overall: good, low-risk change. Addresses the issue cleanly with backward compatibility preserved. |
03872a7 to
6d23d45
Compare
| if (Number.isInteger(parsed) && parsed >= 0) return parsed; | ||
| console.warn(`[react-on-rails] Ignoring invalid worker count "${value}". Expected a non-negative integer.`); | ||
| return null; | ||
| }; |
There was a problem hiding this comment.
The parseWorkersCount function is now duplicated verbatim in three places: the generator template, packages/react-on-rails-pro-node-renderer/README.md, and docs/oss/getting-started/pro-quick-start.md.
For user-facing docs/examples, copying is unavoidable, but consider whether this helper could live in the react-on-rails-pro-node-renderer package itself and be exported (e.g. parseWorkersCount or a resolveWorkersCount factory). That would mean future bug fixes or validation changes propagate automatically instead of requiring every generated file to be regenerated.
| // of CPUs number allocated for current container. This results in spawning many workers while | ||
| // only 1-2 of them really needed. | ||
| if (env.CI) { | ||
| if (env.CI && configuredWorkersCount == null) { |
There was a problem hiding this comment.
This is a meaningful behaviour change: previously, setting CI=true always forced workersCount to 2, even if the user had explicitly set NODE_RENDERER_CONCURRENCY. Now an explicit env var takes precedence over the CI cap.
That's almost certainly the right semantics, but existing CI setups that relied on CI to act as a hard cap (e.g. to prevent resource exhaustion on shared runners) will silently get more workers if they happen to have RENDERER_WORKERS_COUNT or NODE_RENDERER_CONCURRENCY set. Worth a note in the CHANGELOG / migration guide so operators aren't surprised.
| @@ -41,7 +51,8 @@ reactOnRailsProNodeRenderer({ | |||
| password: process.env.RENDERER_PASSWORD, | |||
|
|
|||
There was a problem hiding this comment.
The README example only shows RENDERER_WORKERS_COUNT but does not include the NODE_RENDERER_CONCURRENCY legacy fallback that the actual generated template uses. A user copying this snippet (rather than running the generator) won't get the backward-compatible fallback. Either expand the example to match the template, or add a note that the generated template also checks NODE_RENDERER_CONCURRENCY.
| | -------------------------------------- | --------------------------------------------------- | --------------------------- | --------------------------------------------------------------------------------------------------------- | | ||
| | `port` | `RENDERER_PORT` | `3800` | Port the renderer listens on | | ||
| | `logLevel` | `RENDERER_LOG_LEVEL` | `'info'` | Log level (`fatal`, `error`, `warn`, `info`, `debug`, `trace`, `silent`) | | ||
| | `logHttpLevel` | `RENDERER_LOG_HTTP_LEVEL` | `'error'` | HTTP server log level | |
There was a problem hiding this comment.
The table still says the default is CPU count - 1, but the generated template (and the example just above) hard-codes 3 as the default when neither env var is set. These should be consistent — either update the table to say 3 (or 2 on CI) or align the generated template with the documented CPU-based default.
Review: Fix #2607 — align Pro worker-count env var namingOverall the approach is sound: Missing CHANGELOG entry Spec coverage is thin Inline comments posted on specific lines (see thread above). Overall: nice clean fix, just needs a CHANGELOG entry and the README/table inconsistencies addressed. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7c577b27f4
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| if (env.CI && configuredWorkersCount == null) { | ||
| config.workersCount = 2; |
There was a problem hiding this comment.
Stop overriding explicit template worker counts on CI
If an app customizes the generated client/node-renderer.js by hardcoding workersCount in the config object, this guard still rewrites that value to 2 whenever CI is set, because configuredWorkersCount only reflects env-derived overrides. That makes the new "default only when no override is set" behavior incomplete for the common customization path of editing the generated config file directly, even though buildConfig() treats config-object values as authoritative (packages/react-on-rails-pro-node-renderer/src/shared/configBuilder.ts:254-256).
Useful? React with 👍 / 👎.
| if (value == null) return null; | ||
| const normalized = value.trim(); | ||
| if (normalized === '') return null; | ||
| const parsed = Number(normalized); |
There was a problem hiding this comment.
Edge case: Number() accepts non-decimal integer literals.
Number('1e2') → 100, Number('0x10') → 16, Number('0b101') → 5. All pass Number.isInteger and >= 0, so they'd silently become valid worker counts. In practice nobody would set RENDERER_WORKERS_COUNT=0x10, but an env var coming from a misconfigured string could produce a surprising result with no warning.
A simple guard using a decimal-only regex before calling Number() would prevent this:
| const parsed = Number(normalized); | |
| const parsed = Number(normalized); | |
| if (!/^\d+$/.test(normalized) || !Number.isInteger(parsed) || parsed < 0) { |
This restricts accepted values to plain non-negative decimal integers (e.g. "0", "3", "12") and ensures inputs like "1e2" or "0x10" get the warning path.
| if (normalized === '') return null; | ||
| const parsed = Number(normalized); | ||
| if (Number.isInteger(parsed) && parsed >= 0) return parsed; | ||
| console.warn(`[react-on-rails] Ignoring invalid worker count "${value}". Expected a non-negative integer.`); |
There was a problem hiding this comment.
Minor: the warning should use normalized (trimmed value) rather than the raw value when the invalid input is just leading/trailing whitespace, but more importantly — the warn message embeds the raw value in a template string, which is fine.
One correctness note: for the edge case where value contains whitespace around a bad string (e.g. " -1 "), both value and normalized are available. Using normalized in the message would be marginally clearer.
| console.warn(`[react-on-rails] Ignoring invalid worker count "${value}". Expected a non-negative integer.`); | |
| console.warn(`[react-on-rails] Ignoring invalid worker count "${normalized}". Expected a non-negative integer.`); |
| import log from './shared/log.js'; | ||
| import { majorVersion } from './shared/utils.js'; | ||
|
|
||
| export function parseWorkersCount(value: string | null | undefined): number | null { |
There was a problem hiding this comment.
Behavioral inconsistency: configBuilder.ts still parses RENDERER_WORKERS_COUNT with bare parseInt.
parseWorkersCount is now the validated, user-facing API, but the library's own default config (line 168 of configBuilder.ts) still does:
workersCount: env.RENDERER_WORKERS_COUNT ? parseInt(env.RENDERER_WORKERS_COUNT, 10) : defaultWorkersCount(),When the generated template is used this doesn't matter because workersCount is always set explicitly and overrides the default. However, users who call reactOnRailsProNodeRenderer({ /* no workersCount */ }) and set RENDERER_WORKERS_COUNT=abc will get NaN workers silently rather than a warning and a safe fallback.
Consider also updating configBuilder.ts to use parseWorkersCount so the validation logic is applied uniformly, regardless of whether workersCount is set in code or via env only.
| it('warns and returns null for invalid values', () => { | ||
| const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => undefined); | ||
|
|
||
| expect(parseWorkersCount('workers')).toBeNull(); |
There was a problem hiding this comment.
Good test coverage. Two additional cases worth adding to harden the edge-case behaviour:
-
Scientific / alternate-base notation (currently accepted as valid):
expect(parseWorkersCount('1e2')).toBeNull(); // 100 via Number(), likely unintended expect(parseWorkersCount('0x10')).toBeNull(); // 16 via Number(), likely unintended
-
NaNstring (already covered by the'workers'case, but worth being explicit):expect(parseWorkersCount('NaN')).toBeNull();
Adding these (after deciding whether to fix the underlying behaviour) will lock in the intended contract.
| expect(content).to include("serverBundleCachePath") | ||
| expect(content).to include("port:") | ||
| expect(content).to include("password:") | ||
| expect(content).to include("const configuredWorkersCount =") |
There was a problem hiding this comment.
The spec verifies the implementation details of the CI guard and configuredWorkersCount variable, but doesn't assert that parseWorkersCount is imported in the generated file. If the import is renamed or removed the template would break at runtime without this test catching it.
| expect(content).to include("const configuredWorkersCount =") | |
| expect(content).to include("parseWorkersCount") | |
| expect(content).to include("const configuredWorkersCount =") |
|
Overall the direction is right: canonicalizing Issues flagged inline:
Other observations:
|
## Summary - make generated Pro use as canonical env var - keep backward-compatible fallback to - update docs/examples to match canonical naming and mention legacy fallback ## Why Issue #2607 reported naming drift between generated template and runtime/docs conventions. This change removes the mismatch while preserving compatibility for existing deployments. ## Testing - Run options: include {focus: true, locations: {"./react_on_rails/spec/react_on_rails/generators/install_generator_spec.rb" => [1173, 1405]}} .. Finished in 1 minute 5.27 seconds (files took 1.77 seconds to load) 2 examples, 0 failures Run options: --seed 59137 # Running: Finished in 0.000702s, 0.0000 runs/s, 0.0000 assertions/s. 0 runs, 0 assertions, 0 failures, 0 errors, 0 skips <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Low risk: changes are limited to worker-count env var parsing/precedence plus docs and generator template updates; runtime behavior only differs when env values are invalid/blank or when CI defaults previously overrode an explicit worker count. > > **Overview** > Aligns Pro Node Renderer worker-count configuration around **`RENDERER_WORKERS_COUNT` as the canonical env var**, while keeping **backward-compatible fallback** to legacy `NODE_RENDERER_CONCURRENCY` in generated `node-renderer.js` templates and quick-start docs. > > Adds `parseWorkersCount` (with tests) to validate/normalize worker-count inputs (supports `0` for single-process mode, ignores invalid values with a warning), and updates the CI defaulting logic to apply `workersCount=2` **only when no explicit override is provided**. Documentation and README examples are updated to reflect the new precedence and behavior. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 1a71dee. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Enhancements** * Worker count resolution now validates and accepts explicit 0 or positive integers, prefers the new renderer env, falls back to the legacy concurrency env, defaults to 3, and remains 2 in CI. * Renderer config access unified via an environment alias for clearer configuration. * **Documentation** * Clarified precedence, validation, legacy fallback and single-process (0) behavior; updated quick reference formatting and troubleshooting guidance. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Claude Opus 4.6 <[email protected]>
## Summary - make generated Pro use as canonical env var - keep backward-compatible fallback to - update docs/examples to match canonical naming and mention legacy fallback ## Why Issue #2607 reported naming drift between generated template and runtime/docs conventions. This change removes the mismatch while preserving compatibility for existing deployments. ## Testing - Run options: include {focus: true, locations: {"./react_on_rails/spec/react_on_rails/generators/install_generator_spec.rb" => [1173, 1405]}} .. Finished in 1 minute 5.27 seconds (files took 1.77 seconds to load) 2 examples, 0 failures Run options: --seed 59137 # Running: Finished in 0.000702s, 0.0000 runs/s, 0.0000 assertions/s. 0 runs, 0 assertions, 0 failures, 0 errors, 0 skips <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Low risk: changes are limited to worker-count env var parsing/precedence plus docs and generator template updates; runtime behavior only differs when env values are invalid/blank or when CI defaults previously overrode an explicit worker count. > > **Overview** > Aligns Pro Node Renderer worker-count configuration around **`RENDERER_WORKERS_COUNT` as the canonical env var**, while keeping **backward-compatible fallback** to legacy `NODE_RENDERER_CONCURRENCY` in generated `node-renderer.js` templates and quick-start docs. > > Adds `parseWorkersCount` (with tests) to validate/normalize worker-count inputs (supports `0` for single-process mode, ignores invalid values with a warning), and updates the CI defaulting logic to apply `workersCount=2` **only when no explicit override is provided**. Documentation and README examples are updated to reflect the new precedence and behavior. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 1a71dee. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Enhancements** * Worker count resolution now validates and accepts explicit 0 or positive integers, prefers the new renderer env, falls back to the legacy concurrency env, defaults to 3, and remains 2 in CI. * Renderer config access unified via an environment alias for clearer configuration. * **Documentation** * Clarified precedence, validation, legacy fallback and single-process (0) behavior; updated quick reference formatting and troubleshooting guidance. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Claude Opus 4.6 <[email protected]>
Summary
Why
Issue #2607 reported naming drift between generated template and runtime/docs conventions. This change removes the mismatch while preserving compatibility for existing deployments.
Testing
..
Finished in 1 minute 5.27 seconds (files took 1.77 seconds to load)
2 examples, 0 failures
Run options: --seed 59137
Running:
Finished in 0.000702s, 0.0000 runs/s, 0.0000 assertions/s.
0 runs, 0 assertions, 0 failures, 0 errors, 0 skips
Note
Low Risk
Low risk: changes are limited to worker-count env var parsing/precedence plus docs and generator template updates; runtime behavior only differs when env values are invalid/blank or when CI defaults previously overrode an explicit worker count.
Overview
Aligns Pro Node Renderer worker-count configuration around
RENDERER_WORKERS_COUNTas the canonical env var, while keeping backward-compatible fallback to legacyNODE_RENDERER_CONCURRENCYin generatednode-renderer.jstemplates and quick-start docs.Adds
parseWorkersCount(with tests) to validate/normalize worker-count inputs (supports0for single-process mode, ignores invalid values with a warning), and updates the CI defaulting logic to applyworkersCount=2only when no explicit override is provided. Documentation and README examples are updated to reflect the new precedence and behavior.Written by Cursor Bugbot for commit 1a71dee. This will update automatically on new commits. Configure here.
Summary by CodeRabbit
Enhancements
Documentation