Support multiple license plan types (#2332)#2334
Conversation
WalkthroughAdds multi-plan support to license validation: introduces VALID_PLANS and plan extraction/validation helpers in Ruby, adds with_decoded_license and determine_license_plan, and mirrors plan caching and getLicensePlan API in the Node renderer with corresponding tests and changelog updates. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
🧪 Generate unit tests (beta)
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 |
Code Review - PR #2334✅ Overall AssessmentThis is a well-implemented PR that extends license validation to support multiple plan types. The code follows best practices and is thoroughly tested. I have a few suggestions for improvement. 🎯 Strengths
🔍 Code Quality Observations✅ Good Practices
💡 Minor Suggestions
🔒 Security Considerations✅ No security concerns identified:
🧪 Test CoverageExcellent test coverage includes:
Additional test suggestion (optional):
📊 Performance Considerations✅ No performance concerns:
✨ Best Practices AlignmentThis PR follows the project's
📝 RecommendationApprove with optional refinements. The code is production-ready as-is. The suggestions above are minor optimizations that can be addressed in follow-up PRs if desired. Before merging:
Great work! 🚀 Review generated by Claude Code - claude.com/claude-code |
Greptile OverviewGreptile SummaryExtended the license validator to support multiple plan types beyond just Key Changes:
Code Quality:
Documentation:
Confidence Score: 5/5
Important Files Changed
Sequence DiagramsequenceDiagram
participant App as Rails/Node App
participant Engine as Engine.log_license_status
participant Validator as LicenseValidator
participant JWT as JWT Library
participant Cache as Cache Layer
App->>Engine: Initialize (on startup)
Engine->>Validator: license_status()
Validator->>Cache: Check cached status
alt Cache Hit
Cache-->>Validator: Return cached status
else Cache Miss
Validator->>Validator: load_license_string()
Validator->>JWT: decode and verify
JWT-->>Validator: decoded data
Validator->>Validator: check_plan(decoded_data)
Note over Validator: Validates plan is in VALID_PLANS<br/>(paid, startup, nonprofit, education, oss, partner)
Validator->>Validator: check_organization(decoded_data)
Validator->>Validator: check_expiration(decoded_data)
Validator->>Cache: Store status
Cache-->>Validator: Status cached
end
Validator-->>Engine: :valid/:expired/:invalid/:missing
alt Status is :valid
Engine->>Validator: license_plan()
Validator->>Cache: Check cached plan
alt Cache Hit
Cache-->>Validator: Return cached plan
else Cache Miss
Validator->>Validator: determine_license_plan()
Validator->>Validator: with_decoded_license()
Validator->>Cache: Store plan
Cache-->>Validator: Plan cached
end
Validator-->>Engine: "paid"/"startup"/etc or nil
Engine->>Engine: plan_display_name(plan)
Note over Engine: Returns nil for "paid"<br/>Returns "startup license" for "startup"<br/>etc.
Engine->>App: Log "License validated successfully (Org - plan)"
else Status is not :valid
Engine->>App: Log license issue
end
|
e335491 to
38ac309
Compare
Code Review - PR #2334: Support multiple license plan typesSummaryThis PR extends the license validator to support multiple plan types beyond just "paid". The implementation is well-structured and comprehensive. Here's my detailed feedback: ✅ Strengths
🔍 Observations & Considerations
🎯 Security Considerations
📊 Performance
🧪 Test Coverage AssessmentExcellent coverage:
No gaps identified. 📝 Code Quality
|
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Fix all issues with AI agents
In `@react_on_rails_pro/lib/react_on_rails_pro/license_validator.rb`:
- Around line 10-18: Add a user-visible changelog entry for the new Pro plan
support: update CHANGELOG_PRO.md with a single entry describing the new plan
support (e.g., "Add support for plan types: paid, startup, nonprofit, education,
oss, partner") using the required PR link format `[PR
1818](https://github.com/shakacode/react_on_rails/pull/1818) by
[username](https://github.com/username)` (no hash in PR number); also add a
corresponding open-source note in CHANGELOG.md if the change affects OSS users,
and ensure you reference the VALID_PLANS constant in the same phrasing so the
user-visible feature matches the code.
| # Valid license plan types. | ||
| # - paid: Standard commercial license | ||
| # - startup: Complimentary for qualifying startups | ||
| # - nonprofit: Complimentary for non-profits | ||
| # - education: For educational institutions | ||
| # - oss: For open source projects | ||
| # - partner: Strategic partners | ||
| VALID_PLANS = %w[paid startup nonprofit education oss partner].freeze | ||
|
|
There was a problem hiding this comment.
Add CHANGELOG_PRO entry for plan support.
This is a user-visible Pro feature, so please record it in CHANGELOG_PRO.md using the required PR link format.
Based on learnings: Applies to {CHANGELOG.md,CHANGELOG_PRO.md} : Update CHANGELOG.md for open-source changes and CHANGELOG_PRO.md for Pro-only changes; use format [PR 1818](https://github.com/shakacode/react_on_rails/pull/1818) by [username](https://github.com/username) (no hash in PR number); only include user-visible changes (features, bug fixes, breaking changes, deprecations, performance improvements), NOT linting, formatting, refactoring, tests, or documentation fixes
🤖 Prompt for AI Agents
In `@react_on_rails_pro/lib/react_on_rails_pro/license_validator.rb` around lines
10 - 18, Add a user-visible changelog entry for the new Pro plan support: update
CHANGELOG_PRO.md with a single entry describing the new plan support (e.g., "Add
support for plan types: paid, startup, nonprofit, education, oss, partner")
using the required PR link format `[PR
1818](https://github.com/shakacode/react_on_rails/pull/1818) by
[username](https://github.com/username)` (no hash in PR number); also add a
corresponding open-source note in CHANGELOG.md if the change affects OSS users,
and ensure you reference the VALID_PLANS constant in the same phrasing so the
user-visible feature matches the code.
3aee8cc to
adad07c
Compare
Code Review - PR #2334Overall this is well-implemented with excellent test coverage. Strengths
Issues Found
Recommendations
Code Quality: 8.5/10 |
Add changelog entry for the multiple license plan types feature that supports: paid, startup, nonprofit, education, oss, and partner. Co-Authored-By: Claude Opus 4.5 <[email protected]>
Code ReviewThis PR successfully extends the license validation system to support multiple license plan types. The implementation is well-structured with comprehensive test coverage. Strengths
Issues FoundTypeScript Implementation Missing getLicensePlan Function The TypeScript version does not have an equivalent to the Ruby license_plan method. Current State:
Impact: If the Node renderer needs to access the license plan type for logging or conditional behavior, there is no public API. Recommendation: Add a getLicensePlan() function to TypeScript implementation for API consistency. SecurityNo security issues found. The implementation properly validates plan types against a whitelist. PerformanceGood caching implementation with thread-safe caching and efficient helper methods. Test CoverageExcellent coverage with one minor gap: missing explicit test for non-string plan values. The code handles this correctly, but a test would improve confidence. ChangelogWell-written entry that clearly explains the feature, behavior, and technical details. RecommendationsPriority 1: Add getLicensePlan() function to TypeScript implementation for parity Priority 2 (Optional): Consider adding test for non-string plan values SummaryThis is a high-quality PR with excellent test coverage and clean implementation. The only significant issue is the missing TypeScript getLicensePlan() function for API consistency. Recommendation: Approve with minor change |
Code Review - PR #2334: Support multiple license plan typesSummaryThis PR extends the license validator to support multiple plan types beyond just paid licenses. The implementation is well-structured and properly tested. ✅ Strengths1. Excellent Code Quality
2. Comprehensive Test Coverage
3. Backwards Compatibility
4. Documentation
|
Code Review - PR #2334: Support multiple license plan types✅ Overall AssessmentThis is an excellent, production-ready PR. The implementation is clean, well-tested, and follows all project conventions. The code quality is high across both Ruby and TypeScript implementations. Strengths1. Excellent Code Consistency
2. Comprehensive Test Coverage
3. Backwards Compatibility
4. Security Best Practices
5. Clean Logging Implementation# Paid license (backwards compatible)
"License validated successfully (Acme Corp)."
# Non-paid license (new)
"License validated successfully (Startup Inc - startup license)."This approach is user-friendly and informative without breaking existing expectations. Minor Observations (Not Blocking)1. Type Safety in TypeScriptThe const VALID_PLANS = ['paid', 'startup', 'nonprofit', 'education', 'oss', 'partner'] as const;
export type ValidPlan = (typeof VALID_PLANS)[number];This ensures compile-time type safety. ✅ 2. Thread Safety in RubyThe use of return @license_plan if defined?(@license_plan)
LICENSE_MUTEX.synchronize do
return @license_plan if defined?(@license_plan)
@license_plan = determine_license_plan
endThis prevents race conditions during initialization. ✅ 3. Consistent Validation OrderBoth implementations follow the same validation sequence:
This consistency makes the codebase easier to maintain. ✅ Best Practices Followed✅ CLAUDE.md Compliance:
✅ Testing Requirements:
✅ Code Quality:
Security Considerations✅ No Security Issues Found
Performance Considerations✅ Excellent Caching StrategyRuby: # Thread-safe lazy initialization with double-check locking
def license_plan
return @license_plan if defined?(@license_plan)
LICENSE_MUTEX.synchronize do
return @license_plan if defined?(@license_plan)
@license_plan = determine_license_plan
end
endTypeScript: // Simple module-level caching (Node.js is single-threaded)
let cachedLicensePlan: ValidPlan | undefined;
export function getLicensePlan(): ValidPlan | undefined {
if (cachedLicensePlan \!== undefined) {
return cachedLicensePlan;
}
cachedLicensePlan = determineLicensePlan();
return cachedLicensePlan;
}Both implementations are appropriate for their runtime environments. License validation happens once per Rails initialization / Node worker startup, so performance impact is negligible. Suggested Improvements (Optional)These are very minor and don't block this PR:
Final Recommendation✅ APPROVED - Ready to MergeThis PR:
Excellent work! This is a textbook example of how to extend a validation system while maintaining compatibility and code quality. Pre-Merge ChecklistBefore merging, verify:
Per CLAUDE.md: "BEFORE EVERY COMMIT/PUSH: ALWAYS run |
|
| Branch | jg/issue-2332 |
| Testbed | github-actions |
Click to view all benchmark results
| Benchmark | failed_pct | Benchmark Result % (Result Δ%) | Upper Boundary % (Limit %) | p50_latency | Benchmark Result ms (Result Δ%) | Upper Boundary ms (Limit %) | p90_latency | Benchmark Result ms (Result Δ%) | Upper Boundary ms (Limit %) | p99_latency | Benchmark Result ms (Result Δ%) | Upper Boundary ms (Limit %) | rps | Benchmark Result req/s (Result Δ%) | Lower Boundary req/s (Limit %) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| /: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 3,143.68(0.00%)Baseline: 3,143.68 | 4,086.78 (76.92%) | 📈 view plot 🚷 view threshold | 3,754.89(0.00%)Baseline: 3,754.89 | 4,881.36 (76.92%) | 📈 view plot 🚷 view threshold | 32,367.26(0.00%)Baseline: 32,367.26 | 42,077.44 (76.92%) | 📈 view plot 🚷 view threshold | 2.63(0.00%)Baseline: 2.63 | 1.84 (70.00%) |
| /: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 28.41(0.00%)Baseline: 28.41 | 36.93 (76.92%) | 📈 view plot 🚷 view threshold | 50.17(0.00%)Baseline: 50.17 | 65.22 (76.92%) | 📈 view plot 🚷 view threshold | 480.92(0.00%)Baseline: 480.92 | 625.20 (76.92%) | 📈 view plot 🚷 view threshold | 218.08(0.00%)Baseline: 218.08 | 152.66 (70.00%) |
| /apollo_graphql: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 47.74(0.00%)Baseline: 47.74 | 62.06 (76.92%) | 📈 view plot 🚷 view threshold | 76.98(0.00%)Baseline: 76.98 | 100.07 (76.92%) | 📈 view plot 🚷 view threshold | 618.52(0.00%)Baseline: 618.52 | 804.08 (76.92%) | 📈 view plot 🚷 view threshold | 137.48(0.00%)Baseline: 137.48 | 96.24 (70.00%) |
| /async_components_demo: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 34.86(0.00%)Baseline: 34.86 | 45.32 (76.92%) | 📈 view plot 🚷 view threshold | 47.32(0.00%)Baseline: 47.32 | 61.52 (76.92%) | 📈 view plot 🚷 view threshold | 214.97(0.00%)Baseline: 214.97 | 279.46 (76.92%) | 📈 view plot 🚷 view threshold | 255.56(0.00%)Baseline: 255.56 | 178.89 (70.00%) |
| /async_on_server_sync_on_client: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 20.04(0.00%)Baseline: 20.04 | 26.05 (76.92%) | 📈 view plot 🚷 view threshold | 33.46(0.00%)Baseline: 33.46 | 43.50 (76.92%) | 📈 view plot 🚷 view threshold | 164.90(0.00%)Baseline: 164.90 | 214.37 (76.92%) | 📈 view plot 🚷 view threshold | 391.79(0.00%)Baseline: 391.79 | 274.25 (70.00%) |
| /async_on_server_sync_on_client_client_render: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 16.73(0.00%)Baseline: 16.73 | 21.75 (76.92%) | 📈 view plot 🚷 view threshold | 27.68(0.00%)Baseline: 27.68 | 35.98 (76.92%) | 📈 view plot 🚷 view threshold | 130.98(0.00%)Baseline: 130.98 | 170.27 (76.92%) | 📈 view plot 🚷 view threshold | 464.27(0.00%)Baseline: 464.27 | 324.99 (70.00%) |
| /async_render_function_returns_component: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 17.49(0.00%)Baseline: 17.49 | 22.74 (76.92%) | 📈 view plot 🚷 view threshold | 26.71(0.00%)Baseline: 26.71 | 34.72 (76.92%) | 📈 view plot 🚷 view threshold | 196.04(0.00%)Baseline: 196.04 | 254.85 (76.92%) | 📈 view plot 🚷 view threshold | 438.26(0.00%)Baseline: 438.26 | 306.78 (70.00%) |
| /async_render_function_returns_string: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 17.37(0.00%)Baseline: 17.37 | 22.58 (76.92%) | 📈 view plot 🚷 view threshold | 26.93(0.00%)Baseline: 26.93 | 35.01 (76.92%) | 📈 view plot 🚷 view threshold | 182.02(0.00%)Baseline: 182.02 | 236.63 (76.92%) | 📈 view plot 🚷 view threshold | 439.13(0.00%)Baseline: 439.13 | 307.39 (70.00%) |
| /broken_app: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 341.20(0.00%)Baseline: 341.20 | 443.56 (76.92%) | 📈 view plot 🚷 view threshold | 474.22(0.00%)Baseline: 474.22 | 616.49 (76.92%) | 📈 view plot 🚷 view threshold | 3,840.59(0.00%)Baseline: 3,840.59 | 4,992.77 (76.92%) | 📈 view plot 🚷 view threshold | 17.48(0.00%)Baseline: 17.48 | 12.24 (70.00%) |
| /broken_app: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 14.65(0.00%)Baseline: 14.65 | 19.05 (76.92%) | 📈 view plot 🚷 view threshold | 24.23(0.00%)Baseline: 24.23 | 31.50 (76.92%) | 📈 view plot 🚷 view threshold | 235.59(0.00%)Baseline: 235.59 | 306.27 (76.92%) | 📈 view plot 🚷 view threshold | 437.62(0.00%)Baseline: 437.62 | 306.33 (70.00%) |
| /cached_react_helmet: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 17.49(0.00%)Baseline: 17.49 | 22.74 (76.92%) | 📈 view plot 🚷 view threshold | 30.14(0.00%)Baseline: 30.14 | 39.18 (76.92%) | 📈 view plot 🚷 view threshold | 137.96(0.00%)Baseline: 137.96 | 179.35 (76.92%) | 📈 view plot 🚷 view threshold | 427.12(0.00%)Baseline: 427.12 | 298.98 (70.00%) |
| /cached_redux_component: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 16.84(0.00%)Baseline: 16.84 | 21.89 (76.92%) | 📈 view plot 🚷 view threshold | 26.99(0.00%)Baseline: 26.99 | 35.09 (76.92%) | 📈 view plot 🚷 view threshold | 187.41(0.00%)Baseline: 187.41 | 243.63 (76.92%) | 📈 view plot 🚷 view threshold | 434.20(0.00%)Baseline: 434.20 | 303.94 (70.00%) |
| /client_side_hello_world: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 11.07(0.00%)Baseline: 11.07 | 14.39 (76.92%) | 📈 view plot 🚷 view threshold | 14.38(0.00%)Baseline: 14.38 | 18.69 (76.92%) | 📈 view plot 🚷 view threshold | 125.85(0.00%)Baseline: 125.85 | 163.60 (76.92%) | 📈 view plot 🚷 view threshold | 525.96(0.00%)Baseline: 525.96 | 368.17 (70.00%) |
| /client_side_hello_world: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 16.98(0.00%)Baseline: 16.98 | 22.07 (76.92%) | 📈 view plot 🚷 view threshold | 26.37(0.00%)Baseline: 26.37 | 34.28 (76.92%) | 📈 view plot 🚷 view threshold | 188.17(0.00%)Baseline: 188.17 | 244.62 (76.92%) | 📈 view plot 🚷 view threshold | 469.81(0.00%)Baseline: 469.81 | 328.87 (70.00%) |
| /client_side_hello_world_shared_store: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 9.43(0.00%)Baseline: 9.43 | 12.26 (76.92%) | 📈 view plot 🚷 view threshold | 17.40(0.00%)Baseline: 17.40 | 22.62 (76.92%) | 📈 view plot 🚷 view threshold | 143.56(0.00%)Baseline: 143.56 | 186.63 (76.92%) | 📈 view plot 🚷 view threshold | 709.73(0.00%)Baseline: 709.73 | 496.81 (70.00%) |
| /client_side_hello_world_shared_store: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 17.54(0.00%)Baseline: 17.54 | 22.80 (76.92%) | 📈 view plot 🚷 view threshold | 27.32(0.00%)Baseline: 27.32 | 35.52 (76.92%) | 📈 view plot 🚷 view threshold | 186.85(0.00%)Baseline: 186.85 | 242.91 (76.92%) | 📈 view plot 🚷 view threshold | 452.55(0.00%)Baseline: 452.55 | 316.79 (70.00%) |
| /client_side_hello_world_shared_store_controller: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 9.45(0.00%)Baseline: 9.45 | 12.28 (76.92%) | 📈 view plot 🚷 view threshold | 17.65(0.00%)Baseline: 17.65 | 22.94 (76.92%) | 📈 view plot 🚷 view threshold | 145.66(0.00%)Baseline: 145.66 | 189.36 (76.92%) | 📈 view plot 🚷 view threshold | 703.53(0.00%)Baseline: 703.53 | 492.47 (70.00%) |
| /client_side_hello_world_shared_store_controller: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 17.58(0.00%)Baseline: 17.58 | 22.85 (76.92%) | 📈 view plot 🚷 view threshold | 28.40(0.00%)Baseline: 28.40 | 36.92 (76.92%) | 📈 view plot 🚷 view threshold | 148.76(0.00%)Baseline: 148.76 | 193.39 (76.92%) | 📈 view plot 🚷 view threshold | 443.34(0.00%)Baseline: 443.34 | 310.34 (70.00%) |
| /client_side_hello_world_shared_store_defer: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 8.28(0.00%)Baseline: 8.28 | 10.76 (76.92%) | 📈 view plot 🚷 view threshold | 13.85(0.00%)Baseline: 13.85 | 18.00 (76.92%) | 📈 view plot 🚷 view threshold | 135.52(0.00%)Baseline: 135.52 | 176.18 (76.92%) | 📈 view plot 🚷 view threshold | 739.16(0.00%)Baseline: 739.16 | 517.41 (70.00%) |
| /client_side_hello_world_shared_store_defer: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 19.59(0.00%)Baseline: 19.59 | 25.47 (76.92%) | 📈 view plot 🚷 view threshold | 27.19(0.00%)Baseline: 27.19 | 35.35 (76.92%) | 📈 view plot 🚷 view threshold | 104.14(0.00%)Baseline: 104.14 | 135.38 (76.92%) | 📈 view plot 🚷 view threshold | 456.47(0.00%)Baseline: 456.47 | 319.53 (70.00%) |
| /client_side_log_throw: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 9.16(0.00%)Baseline: 9.16 | 11.91 (76.92%) | 📈 view plot 🚷 view threshold | 18.01(0.00%)Baseline: 18.01 | 23.41 (76.92%) | 📈 view plot 🚷 view threshold | 110.66(0.00%)Baseline: 110.66 | 143.86 (76.92%) | 📈 view plot 🚷 view threshold | 749.20(0.00%)Baseline: 749.20 | 524.44 (70.00%) |
| /client_side_log_throw: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 16.46(0.00%)Baseline: 16.46 | 21.40 (76.92%) | 📈 view plot 🚷 view threshold | 24.37(0.00%)Baseline: 24.37 | 31.68 (76.92%) | 📈 view plot 🚷 view threshold | 217.27(0.00%)Baseline: 217.27 | 282.45 (76.92%) | 📈 view plot 🚷 view threshold | 476.21(0.00%)Baseline: 476.21 | 333.35 (70.00%) |
| /client_side_manual_render: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 8.75(0.00%)Baseline: 8.75 | 11.38 (76.92%) | 📈 view plot 🚷 view threshold | 16.99(0.00%)Baseline: 16.99 | 22.09 (76.92%) | 📈 view plot 🚷 view threshold | 99.40(0.00%)Baseline: 99.40 | 129.22 (76.92%) | 📈 view plot 🚷 view threshold | 772.83(0.00%)Baseline: 772.83 | 540.98 (70.00%) |
| /client_side_manual_render: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 15.96(0.00%)Baseline: 15.96 | 20.75 (76.92%) | 📈 view plot 🚷 view threshold | 23.99(0.00%)Baseline: 23.99 | 31.19 (76.92%) | 📈 view plot 🚷 view threshold | 171.57(0.00%)Baseline: 171.57 | 223.04 (76.92%) | 📈 view plot 🚷 view threshold | 482.40(0.00%)Baseline: 482.40 | 337.68 (70.00%) |
| /client_side_rescript_hello_world: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 8.95(0.00%)Baseline: 8.95 | 11.63 (76.92%) | 📈 view plot 🚷 view threshold | 16.43(0.00%)Baseline: 16.43 | 21.36 (76.92%) | 📈 view plot 🚷 view threshold | 136.34(0.00%)Baseline: 136.34 | 177.24 (76.92%) | 📈 view plot 🚷 view threshold | 747.62(0.00%)Baseline: 747.62 | 523.33 (70.00%) |
| /console_logs_in_async_server: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 2,119.69(0.00%)Baseline: 2,119.69 | 2,755.60 (76.92%) | 📈 view plot 🚷 view threshold | 2,146.17(0.00%)Baseline: 2,146.17 | 2,790.02 (76.92%) | 📈 view plot 🚷 view threshold | 9,131.75(0.00%)Baseline: 9,131.75 | 11,871.27 (76.92%) | 📈 view plot 🚷 view threshold | 3.98(0.00%)Baseline: 3.98 | 2.79 (70.00%) |
| /context_function_return_jsx: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 8.91(0.00%)Baseline: 8.91 | 11.58 (76.92%) | 📈 view plot 🚷 view threshold | 16.69(0.00%)Baseline: 16.69 | 21.70 (76.92%) | 📈 view plot 🚷 view threshold | 100.61(0.00%)Baseline: 100.61 | 130.79 (76.92%) | 📈 view plot 🚷 view threshold | 767.77(0.00%)Baseline: 767.77 | 537.44 (70.00%) |
| /context_function_return_jsx: Pro | 📈 view plot 🚷 view threshold | 100.00(0.00%)Baseline: 100.00 | 130.00 (76.92%) | 📈 view plot 🚷 view threshold | 15.73(0.00%)Baseline: 15.73 | 20.45 (76.92%) | 📈 view plot 🚷 view threshold | 24.18(0.00%)Baseline: 24.18 | 31.43 (76.92%) | 📈 view plot 🚷 view threshold | 166.35(0.00%)Baseline: 166.35 | 216.25 (76.92%) | 📈 view plot 🚷 view threshold | 490.40(0.00%)Baseline: 490.40 | 343.28 (70.00%) |
| /css_modules_images_fonts_example: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 337.78(0.00%)Baseline: 337.78 | 439.11 (76.92%) | 📈 view plot 🚷 view threshold | 500.30(0.00%)Baseline: 500.30 | 650.39 (76.92%) | 📈 view plot 🚷 view threshold | 3,612.70(0.00%)Baseline: 3,612.70 | 4,696.51 (76.92%) | 📈 view plot 🚷 view threshold | 17.84(0.00%)Baseline: 17.84 | 12.49 (70.00%) |
| /css_modules_images_fonts_example: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 17.67(0.00%)Baseline: 17.67 | 22.97 (76.92%) | 📈 view plot 🚷 view threshold | 27.45(0.00%)Baseline: 27.45 | 35.69 (76.92%) | 📈 view plot 🚷 view threshold | 195.63(0.00%)Baseline: 195.63 | 254.32 (76.92%) | 📈 view plot 🚷 view threshold | 430.39(0.00%)Baseline: 430.39 | 301.27 (70.00%) |
| /empty: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 6.06(0.00%)Baseline: 6.06 | 7.88 (76.92%) | 📈 view plot 🚷 view threshold | 8.06(0.00%)Baseline: 8.06 | 10.48 (76.92%) | 📈 view plot 🚷 view threshold | 33.14(0.00%)Baseline: 33.14 | 43.08 (76.92%) | 📈 view plot 🚷 view threshold | 1,452.73(0.00%)Baseline: 1,452.73 | 1,016.91 (70.00%) |
| /image_example: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 346.88(0.00%)Baseline: 346.88 | 450.94 (76.92%) | 📈 view plot 🚷 view threshold | 438.09(0.00%)Baseline: 438.09 | 569.52 (76.92%) | 📈 view plot 🚷 view threshold | 3,955.24(0.00%)Baseline: 3,955.24 | 5,141.81 (76.92%) | 📈 view plot 🚷 view threshold | 23.16(0.00%)Baseline: 23.16 | 16.21 (70.00%) |
| /image_example: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 20.88(0.00%)Baseline: 20.88 | 27.14 (76.92%) | 📈 view plot 🚷 view threshold | 29.03(0.00%)Baseline: 29.03 | 37.74 (76.92%) | 📈 view plot 🚷 view threshold | 116.85(0.00%)Baseline: 116.85 | 151.91 (76.92%) | 📈 view plot 🚷 view threshold | 422.70(0.00%)Baseline: 422.70 | 295.89 (70.00%) |
| /lazy_apollo_graphql: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 47.50(0.00%)Baseline: 47.50 | 61.75 (76.92%) | 📈 view plot 🚷 view threshold | 74.99(0.00%)Baseline: 74.99 | 97.49 (76.92%) | 📈 view plot 🚷 view threshold | 469.90(0.00%)Baseline: 469.90 | 610.87 (76.92%) | 📈 view plot 🚷 view threshold | 160.23(0.00%)Baseline: 160.23 | 112.16 (70.00%) |
| /loadable: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 16.64(0.00%)Baseline: 16.64 | 21.63 (76.92%) | 📈 view plot 🚷 view threshold | 23.28(0.00%)Baseline: 23.28 | 30.26 (76.92%) | 📈 view plot 🚷 view threshold | 481.09(0.00%)Baseline: 481.09 | 625.42 (76.92%) | 📈 view plot 🚷 view threshold | 276.91(0.00%)Baseline: 276.91 | 193.84 (70.00%) |
| /manual_render_test: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 8.87(0.00%)Baseline: 8.87 | 11.53 (76.92%) | 📈 view plot 🚷 view threshold | 16.40(0.00%)Baseline: 16.40 | 21.32 (76.92%) | 📈 view plot 🚷 view threshold | 95.98(0.00%)Baseline: 95.98 | 124.77 (76.92%) | 📈 view plot 🚷 view threshold | 784.33(0.00%)Baseline: 784.33 | 549.03 (70.00%) |
| /posts_page: Pro | 📈 view plot 🚷 view threshold | 100.00(0.00%)Baseline: 100.00 | 130.00 (76.92%) | 📈 view plot 🚷 view threshold | 8.11(0.00%)Baseline: 8.11 | 10.54 (76.92%) | 📈 view plot 🚷 view threshold | 12.49(0.00%)Baseline: 12.49 | 16.24 (76.92%) | 📈 view plot 🚷 view threshold | 84.42(0.00%)Baseline: 84.42 | 109.75 (76.92%) | 📈 view plot 🚷 view threshold | 976.75(0.00%)Baseline: 976.75 | 683.73 (70.00%) |
| /pure_component: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 293.66(0.00%)Baseline: 293.66 | 381.76 (76.92%) | 📈 view plot 🚷 view threshold | 381.83(0.00%)Baseline: 381.83 | 496.38 (76.92%) | 📈 view plot 🚷 view threshold | 7,278.46(0.00%)Baseline: 7,278.46 | 9,462.00 (76.92%) | 📈 view plot 🚷 view threshold | 17.16(0.00%)Baseline: 17.16 | 12.01 (70.00%) |
| /pure_component: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 17.30(0.00%)Baseline: 17.30 | 22.49 (76.92%) | 📈 view plot 🚷 view threshold | 26.81(0.00%)Baseline: 26.81 | 34.85 (76.92%) | 📈 view plot 🚷 view threshold | 184.17(0.00%)Baseline: 184.17 | 239.42 (76.92%) | 📈 view plot 🚷 view threshold | 440.28(0.00%)Baseline: 440.28 | 308.20 (70.00%) |
| /pure_component_wrapped_in_function: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 10.66(0.00%)Baseline: 10.66 | 13.86 (76.92%) | 📈 view plot 🚷 view threshold | 18.12(0.00%)Baseline: 18.12 | 23.56 (76.92%) | 📈 view plot 🚷 view threshold | 65.15(0.00%)Baseline: 65.15 | 84.70 (76.92%) | 📈 view plot 🚷 view threshold | 762.16(0.00%)Baseline: 762.16 | 533.51 (70.00%) |
| /pure_component_wrapped_in_function: Pro | 📈 view plot 🚷 view threshold | 100.00(0.00%)Baseline: 100.00 | 130.00 (76.92%) | 📈 view plot 🚷 view threshold | 18.13(0.00%)Baseline: 18.13 | 23.57 (76.92%) | 📈 view plot 🚷 view threshold | 25.35(0.00%)Baseline: 25.35 | 32.95 (76.92%) | 📈 view plot 🚷 view threshold | 105.06(0.00%)Baseline: 105.06 | 136.58 (76.92%) | 📈 view plot 🚷 view threshold | 486.55(0.00%)Baseline: 486.55 | 340.59 (70.00%) |
| /react_helmet: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 357.53(0.00%)Baseline: 357.53 | 464.79 (76.92%) | 📈 view plot 🚷 view threshold | 443.86(0.00%)Baseline: 443.86 | 577.02 (76.92%) | 📈 view plot 🚷 view threshold | 4,184.73(0.00%)Baseline: 4,184.73 | 5,440.15 (76.92%) | 📈 view plot 🚷 view threshold | 22.99(0.00%)Baseline: 22.99 | 16.09 (70.00%) |
| /react_helmet: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 21.32(0.00%)Baseline: 21.32 | 27.72 (76.92%) | 📈 view plot 🚷 view threshold | 29.96(0.00%)Baseline: 29.96 | 38.95 (76.92%) | 📈 view plot 🚷 view threshold | 121.29(0.00%)Baseline: 121.29 | 157.68 (76.92%) | 📈 view plot 🚷 view threshold | 413.44(0.00%)Baseline: 413.44 | 289.41 (70.00%) |
| /react_helmet_broken: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 357.53(0.00%)Baseline: 357.53 | 464.79 (76.92%) | 📈 view plot 🚷 view threshold | 448.70(0.00%)Baseline: 448.70 | 583.31 (76.92%) | 📈 view plot 🚷 view threshold | 4,080.08(0.00%)Baseline: 4,080.08 | 5,304.10 (76.92%) | 📈 view plot 🚷 view threshold | 22.66(0.00%)Baseline: 22.66 | 15.86 (70.00%) |
| /react_helmet_broken: Pro | 📈 view plot 🚷 view threshold | 100.00(0.00%)Baseline: 100.00 | 130.00 (76.92%) | 📈 view plot 🚷 view threshold | 14.37(0.00%)Baseline: 14.37 | 18.68 (76.92%) | 📈 view plot 🚷 view threshold | 23.51(0.00%)Baseline: 23.51 | 30.56 (76.92%) | 📈 view plot 🚷 view threshold | 227.94(0.00%)Baseline: 227.94 | 296.32 (76.92%) | 📈 view plot 🚷 view threshold | 446.08(0.00%)Baseline: 446.08 | 312.26 (70.00%) |
| /react_router: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 371.24(0.00%)Baseline: 371.24 | 482.61 (76.92%) | 📈 view plot 🚷 view threshold | 462.09(0.00%)Baseline: 462.09 | 600.72 (76.92%) | 📈 view plot 🚷 view threshold | 4,152.26(0.00%)Baseline: 4,152.26 | 5,397.94 (76.92%) | 📈 view plot 🚷 view threshold | 22.32(0.00%)Baseline: 22.32 | 15.62 (70.00%) |
| /react_router: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 15.05(0.00%)Baseline: 15.05 | 19.57 (76.92%) | 📈 view plot 🚷 view threshold | 26.56(0.00%)Baseline: 26.56 | 34.53 (76.92%) | 📈 view plot 🚷 view threshold | 155.52(0.00%)Baseline: 155.52 | 202.18 (76.92%) | 📈 view plot 🚷 view threshold | 478.70(0.00%)Baseline: 478.70 | 335.09 (70.00%) |
| /redis_receiver: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 78.30(0.00%)Baseline: 78.30 | 101.79 (76.92%) | 📈 view plot 🚷 view threshold | 124.27(0.00%)Baseline: 124.27 | 161.55 (76.92%) | 📈 view plot 🚷 view threshold | 575.93(0.00%)Baseline: 575.93 | 748.71 (76.92%) | 📈 view plot 🚷 view threshold | 106.36(0.00%)Baseline: 106.36 | 74.45 (70.00%) |
| /render_js: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 327.81(0.00%)Baseline: 327.81 | 426.15 (76.92%) | 📈 view plot 🚷 view threshold | 413.48(0.00%)Baseline: 413.48 | 537.52 (76.92%) | 📈 view plot 🚷 view threshold | 3,535.62(0.00%)Baseline: 3,535.62 | 4,596.31 (76.92%) | 📈 view plot 🚷 view threshold | 24.85(0.00%)Baseline: 24.85 | 17.40 (70.00%) |
| /render_js: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 19.65(0.00%)Baseline: 19.65 | 25.55 (76.92%) | 📈 view plot 🚷 view threshold | 27.90(0.00%)Baseline: 27.90 | 36.27 (76.92%) | 📈 view plot 🚷 view threshold | 110.81(0.00%)Baseline: 110.81 | 144.05 (76.92%) | 📈 view plot 🚷 view threshold | 447.96(0.00%)Baseline: 447.96 | 313.57 (70.00%) |
| /rendered_html: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 339.57(0.00%)Baseline: 339.57 | 441.44 (76.92%) | 📈 view plot 🚷 view threshold | 435.80(0.00%)Baseline: 435.80 | 566.54 (76.92%) | 📈 view plot 🚷 view threshold | 3,924.02(0.00%)Baseline: 3,924.02 | 5,101.23 (76.92%) | 📈 view plot 🚷 view threshold | 23.58(0.00%)Baseline: 23.58 | 16.51 (70.00%) |
| /rendered_html: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 14.44(0.00%)Baseline: 14.44 | 18.77 (76.92%) | 📈 view plot 🚷 view threshold | 23.63(0.00%)Baseline: 23.63 | 30.72 (76.92%) | 📈 view plot 🚷 view threshold | 228.15(0.00%)Baseline: 228.15 | 296.60 (76.92%) | 📈 view plot 🚷 view threshold | 442.46(0.00%)Baseline: 442.46 | 309.72 (70.00%) |
|
| Branch | jg/issue-2332 |
| Testbed | github-actions |
Click to view all benchmark results
| Benchmark | failed_pct | Benchmark Result % (Result Δ%) | Upper Boundary % (Limit %) | p50_latency | Benchmark Result ms (Result Δ%) | Upper Boundary ms (Limit %) | p90_latency | Benchmark Result ms (Result Δ%) | Upper Boundary ms (Limit %) | p99_latency | Benchmark Result ms (Result Δ%) | Upper Boundary ms (Limit %) | rps | Benchmark Result req/s (Result Δ%) | Lower Boundary req/s (Limit %) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| /rsc_posts_page_over_http: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 18.68(0.00%)Baseline: 18.68 | 24.28 (76.92%) | 📈 view plot 🚷 view threshold | 28.83(0.00%)Baseline: 28.83 | 37.48 (76.92%) | 📈 view plot 🚷 view threshold | 206.95(0.00%)Baseline: 206.95 | 269.03 (76.92%) | 📈 view plot 🚷 view threshold | 417.94(0.00%)Baseline: 417.94 | 292.56 (70.00%) |
| /rsc_posts_page_over_redis: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 65.90(0.00%)Baseline: 65.90 | 85.67 (76.92%) | 📈 view plot 🚷 view threshold | 96.89(0.00%)Baseline: 96.89 | 125.96 (76.92%) | 📈 view plot 🚷 view threshold | 668.67(0.00%)Baseline: 668.67 | 869.27 (76.92%) | 📈 view plot 🚷 view threshold | 115.50(0.00%)Baseline: 115.50 | 80.85 (70.00%) |
| /server_render_with_timeout: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 20.49(0.00%)Baseline: 20.49 | 26.64 (76.92%) | 📈 view plot 🚷 view threshold | 28.67(0.00%)Baseline: 28.67 | 37.27 (76.92%) | 📈 view plot 🚷 view threshold | 116.45(0.00%)Baseline: 116.45 | 151.38 (76.92%) | 📈 view plot 🚷 view threshold | 433.19(0.00%)Baseline: 433.19 | 303.23 (70.00%) |
| /server_router: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 18.87(0.00%)Baseline: 18.87 | 24.53 (76.92%) | 📈 view plot 🚷 view threshold | 29.58(0.00%)Baseline: 29.58 | 38.45 (76.92%) | 📈 view plot 🚷 view threshold | 200.95(0.00%)Baseline: 200.95 | 261.24 (76.92%) | 📈 view plot 🚷 view threshold | 408.26(0.00%)Baseline: 408.26 | 285.78 (70.00%) |
| /server_router_client_render: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 17.23(0.00%)Baseline: 17.23 | 22.40 (76.92%) | 📈 view plot 🚷 view threshold | 25.24(0.00%)Baseline: 25.24 | 32.81 (76.92%) | 📈 view plot 🚷 view threshold | 230.16(0.00%)Baseline: 230.16 | 299.21 (76.92%) | 📈 view plot 🚷 view threshold | 456.96(0.00%)Baseline: 456.96 | 319.87 (70.00%) |
| /server_side_hello_world: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 345.72(0.00%)Baseline: 345.72 | 449.44 (76.92%) | 📈 view plot 🚷 view threshold | 433.02(0.00%)Baseline: 433.02 | 562.93 (76.92%) | 📈 view plot 🚷 view threshold | 3,893.34(0.00%)Baseline: 3,893.34 | 5,061.34 (76.92%) | 📈 view plot 🚷 view threshold | 23.56(0.00%)Baseline: 23.56 | 16.49 (70.00%) |
| /server_side_hello_world: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 18.02(0.00%)Baseline: 18.02 | 23.43 (76.92%) | 📈 view plot 🚷 view threshold | 27.78(0.00%)Baseline: 27.78 | 36.11 (76.92%) | 📈 view plot 🚷 view threshold | 189.13(0.00%)Baseline: 189.13 | 245.87 (76.92%) | 📈 view plot 🚷 view threshold | 423.61(0.00%)Baseline: 423.61 | 296.53 (70.00%) |
| /server_side_hello_world_es5: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 348.54(0.00%)Baseline: 348.54 | 453.10 (76.92%) | 📈 view plot 🚷 view threshold | 432.62(0.00%)Baseline: 432.62 | 562.41 (76.92%) | 📈 view plot 🚷 view threshold | 3,939.16(0.00%)Baseline: 3,939.16 | 5,120.91 (76.92%) | 📈 view plot 🚷 view threshold | 23.46(0.00%)Baseline: 23.46 | 16.42 (70.00%) |
| /server_side_hello_world_es5: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 20.74(0.00%)Baseline: 20.74 | 26.96 (76.92%) | 📈 view plot 🚷 view threshold | 28.90(0.00%)Baseline: 28.90 | 37.57 (76.92%) | 📈 view plot 🚷 view threshold | 120.10(0.00%)Baseline: 120.10 | 156.13 (76.92%) | 📈 view plot 🚷 view threshold | 427.50(0.00%)Baseline: 427.50 | 299.25 (70.00%) |
| /server_side_hello_world_hooks: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 385.60(0.00%)Baseline: 385.60 | 501.28 (76.92%) | 📈 view plot 🚷 view threshold | 434.01(0.00%)Baseline: 434.01 | 564.21 (76.92%) | 📈 view plot 🚷 view threshold | 2,553.86(0.00%)Baseline: 2,553.86 | 3,320.02 (76.92%) | 📈 view plot 🚷 view threshold | 23.48(0.00%)Baseline: 23.48 | 16.44 (70.00%) |
| /server_side_hello_world_hooks: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 20.21(0.00%)Baseline: 20.21 | 26.27 (76.92%) | 📈 view plot 🚷 view threshold | 28.11(0.00%)Baseline: 28.11 | 36.54 (76.92%) | 📈 view plot 🚷 view threshold | 114.89(0.00%)Baseline: 114.89 | 149.36 (76.92%) | 📈 view plot 🚷 view threshold | 440.32(0.00%)Baseline: 440.32 | 308.22 (70.00%) |
| /server_side_hello_world_props: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 350.51(0.00%)Baseline: 350.51 | 455.66 (76.92%) | 📈 view plot 🚷 view threshold | 434.23(0.00%)Baseline: 434.23 | 564.50 (76.92%) | 📈 view plot 🚷 view threshold | 4,005.74(0.00%)Baseline: 4,005.74 | 5,207.46 (76.92%) | 📈 view plot 🚷 view threshold | 23.37(0.00%)Baseline: 23.37 | 16.36 (70.00%) |
| /server_side_hello_world_shared_store: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 702.96(0.00%)Baseline: 702.96 | 913.85 (76.92%) | 📈 view plot 🚷 view threshold | 951.32(0.00%)Baseline: 951.32 | 1,236.72 (76.92%) | 📈 view plot 🚷 view threshold | 8,871.77(0.00%)Baseline: 8,871.77 | 11,533.30 (76.92%) | 📈 view plot 🚷 view threshold | 11.32(0.00%)Baseline: 11.32 | 7.92 (70.00%) |
| /server_side_hello_world_shared_store: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 21.28(0.00%)Baseline: 21.28 | 27.66 (76.92%) | 📈 view plot 🚷 view threshold | 31.00(0.00%)Baseline: 31.00 | 40.30 (76.92%) | 📈 view plot 🚷 view threshold | 225.03(0.00%)Baseline: 225.03 | 292.54 (76.92%) | 📈 view plot 🚷 view threshold | 372.05(0.00%)Baseline: 372.05 | 260.44 (70.00%) |
| /server_side_hello_world_shared_store_controller: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 719.31(0.00%)Baseline: 719.31 | 935.10 (76.92%) | 📈 view plot 🚷 view threshold | 961.29(0.00%)Baseline: 961.29 | 1,249.68 (76.92%) | 📈 view plot 🚷 view threshold | 7,269.30(0.00%)Baseline: 7,269.30 | 9,450.09 (76.92%) | 📈 view plot 🚷 view threshold | 11.49(0.00%)Baseline: 11.49 | 8.04 (70.00%) |
| /server_side_hello_world_shared_store_controller: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 24.22(0.00%)Baseline: 24.22 | 31.49 (76.92%) | 📈 view plot 🚷 view threshold | 32.75(0.00%)Baseline: 32.75 | 42.58 (76.92%) | 📈 view plot 🚷 view threshold | 134.46(0.00%)Baseline: 134.46 | 174.80 (76.92%) | 📈 view plot 🚷 view threshold | 368.31(0.00%)Baseline: 368.31 | 257.82 (70.00%) |
| /server_side_hello_world_shared_store_defer: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 717.04(0.00%)Baseline: 717.04 | 932.15 (76.92%) | 📈 view plot 🚷 view threshold | 966.09(0.00%)Baseline: 966.09 | 1,255.92 (76.92%) | 📈 view plot 🚷 view threshold | 7,465.99(0.00%)Baseline: 7,465.99 | 9,705.79 (76.92%) | 📈 view plot 🚷 view threshold | 11.46(0.00%)Baseline: 11.46 | 8.02 (70.00%) |
| /server_side_hello_world_shared_store_defer: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 21.64(0.00%)Baseline: 21.64 | 28.13 (76.92%) | 📈 view plot 🚷 view threshold | 34.06(0.00%)Baseline: 34.06 | 44.28 (76.92%) | 📈 view plot 🚷 view threshold | 250.93(0.00%)Baseline: 250.93 | 326.21 (76.92%) | 📈 view plot 🚷 view threshold | 366.52(0.00%)Baseline: 366.52 | 256.56 (70.00%) |
| /server_side_hello_world_with_options: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 388.61(0.00%)Baseline: 388.61 | 505.19 (76.92%) | 📈 view plot 🚷 view threshold | 436.18(0.00%)Baseline: 436.18 | 567.03 (76.92%) | 📈 view plot 🚷 view threshold | 3,097.23(0.00%)Baseline: 3,097.23 | 4,026.40 (76.92%) | 📈 view plot 🚷 view threshold | 23.50(0.00%)Baseline: 23.50 | 16.45 (70.00%) |
| /server_side_hello_world_with_options: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 13.44(0.00%)Baseline: 13.44 | 17.47 (76.92%) | 📈 view plot 🚷 view threshold | 25.33(0.00%)Baseline: 25.33 | 32.93 (76.92%) | 📈 view plot 🚷 view threshold | 347.40(0.00%)Baseline: 347.40 | 451.62 (76.92%) | 📈 view plot 🚷 view threshold | 421.05(0.00%)Baseline: 421.05 | 294.74 (70.00%) |
| /server_side_log_throw: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 363.98(0.00%)Baseline: 363.98 | 473.17 (76.92%) | 📈 view plot 🚷 view threshold | 448.22(0.00%)Baseline: 448.22 | 582.69 (76.92%) | 📈 view plot 🚷 view threshold | 4,061.22(0.00%)Baseline: 4,061.22 | 5,279.59 (76.92%) | 📈 view plot 🚷 view threshold | 22.81(0.00%)Baseline: 22.81 | 15.97 (70.00%) |
| /server_side_log_throw: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 20.70(0.00%)Baseline: 20.70 | 26.91 (76.92%) | 📈 view plot 🚷 view threshold | 28.61(0.00%)Baseline: 28.61 | 37.19 (76.92%) | 📈 view plot 🚷 view threshold | 121.32(0.00%)Baseline: 121.32 | 157.72 (76.92%) | 📈 view plot 🚷 view threshold | 430.22(0.00%)Baseline: 430.22 | 301.15 (70.00%) |
| /server_side_log_throw_plain_js: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 396.01(0.00%)Baseline: 396.01 | 514.81 (76.92%) | 📈 view plot 🚷 view threshold | 447.65(0.00%)Baseline: 447.65 | 581.94 (76.92%) | 📈 view plot 🚷 view threshold | 2,679.95(0.00%)Baseline: 2,679.95 | 3,483.93 (76.92%) | 📈 view plot 🚷 view threshold | 23.10(0.00%)Baseline: 23.10 | 16.17 (70.00%) |
| /server_side_log_throw_plain_js: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 17.26(0.00%)Baseline: 17.26 | 22.44 (76.92%) | 📈 view plot 🚷 view threshold | 27.02(0.00%)Baseline: 27.02 | 35.13 (76.92%) | 📈 view plot 🚷 view threshold | 196.51(0.00%)Baseline: 196.51 | 255.46 (76.92%) | 📈 view plot 🚷 view threshold | 458.72(0.00%)Baseline: 458.72 | 321.10 (70.00%) |
| /server_side_log_throw_raise: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 357.15(0.00%)Baseline: 357.15 | 464.30 (76.92%) | 📈 view plot 🚷 view threshold | 444.83(0.00%)Baseline: 444.83 | 578.28 (76.92%) | 📈 view plot 🚷 view threshold | 4,156.39(0.00%)Baseline: 4,156.39 | 5,403.31 (76.92%) | 📈 view plot 🚷 view threshold | 23.08(0.00%)Baseline: 23.08 | 16.16 (70.00%) |
| /server_side_log_throw_raise: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 9.70(0.00%)Baseline: 9.70 | 12.61 (76.92%) | 📈 view plot 🚷 view threshold | 14.34(0.00%)Baseline: 14.34 | 18.64 (76.92%) | 📈 view plot 🚷 view threshold | 102.78(0.00%)Baseline: 102.78 | 133.61 (76.92%) | 📈 view plot 🚷 view threshold | 804.87(0.00%)Baseline: 804.87 | 563.41 (70.00%) |
| /server_side_log_throw_raise_invoker: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 10.11(0.00%)Baseline: 10.11 | 13.14 (76.92%) | 📈 view plot 🚷 view threshold | 16.49(0.00%)Baseline: 16.49 | 21.44 (76.92%) | 📈 view plot 🚷 view threshold | 110.57(0.00%)Baseline: 110.57 | 143.74 (76.92%) | 📈 view plot 🚷 view threshold | 575.52(0.00%)Baseline: 575.52 | 402.86 (70.00%) |
| /server_side_log_throw_raise_invoker: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 15.37(0.00%)Baseline: 15.37 | 19.98 (76.92%) | 📈 view plot 🚷 view threshold | 23.97(0.00%)Baseline: 23.97 | 31.16 (76.92%) | 📈 view plot 🚷 view threshold | 170.73(0.00%)Baseline: 170.73 | 221.95 (76.92%) | 📈 view plot 🚷 view threshold | 517.14(0.00%)Baseline: 517.14 | 362.00 (70.00%) |
| /server_side_redux_app: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 349.88(0.00%)Baseline: 349.88 | 454.84 (76.92%) | 📈 view plot 🚷 view threshold | 526.67(0.00%)Baseline: 526.67 | 684.67 (76.92%) | 📈 view plot 🚷 view threshold | 3,806.23(0.00%)Baseline: 3,806.23 | 4,948.10 (76.92%) | 📈 view plot 🚷 view threshold | 17.14(0.00%)Baseline: 17.14 | 12.00 (70.00%) |
| /server_side_redux_app: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 18.78(0.00%)Baseline: 18.78 | 24.41 (76.92%) | 📈 view plot 🚷 view threshold | 29.66(0.00%)Baseline: 29.66 | 38.56 (76.92%) | 📈 view plot 🚷 view threshold | 212.33(0.00%)Baseline: 212.33 | 276.03 (76.92%) | 📈 view plot 🚷 view threshold | 419.73(0.00%)Baseline: 419.73 | 293.81 (70.00%) |
| /server_side_redux_app_cached: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 9.63(0.00%)Baseline: 9.63 | 12.52 (76.92%) | 📈 view plot 🚷 view threshold | 17.22(0.00%)Baseline: 17.22 | 22.39 (76.92%) | 📈 view plot 🚷 view threshold | 142.65(0.00%)Baseline: 142.65 | 185.44 (76.92%) | 📈 view plot 🚷 view threshold | 715.64(0.00%)Baseline: 715.64 | 500.95 (70.00%) |
| /server_side_redux_app_cached: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 19.76(0.00%)Baseline: 19.76 | 25.69 (76.92%) | 📈 view plot 🚷 view threshold | 27.44(0.00%)Baseline: 27.44 | 35.67 (76.92%) | 📈 view plot 🚷 view threshold | 112.62(0.00%)Baseline: 112.62 | 146.41 (76.92%) | 📈 view plot 🚷 view threshold | 448.53(0.00%)Baseline: 448.53 | 313.97 (70.00%) |
| /stream_async_components: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 13.43(0.00%)Baseline: 13.43 | 17.46 (76.92%) | 📈 view plot 🚷 view threshold | 25.58(0.00%)Baseline: 25.58 | 33.25 (76.92%) | 📈 view plot 🚷 view threshold | 338.46(0.00%)Baseline: 338.46 | 440.00 (76.92%) | 📈 view plot 🚷 view threshold | 416.01(0.00%)Baseline: 416.01 | 291.21 (70.00%) |
| /turbo_frame_tag_hello_world: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 10.36(0.00%)Baseline: 10.36 | 13.47 (76.92%) | 📈 view plot 🚷 view threshold | 17.14(0.00%)Baseline: 17.14 | 22.28 (76.92%) | 📈 view plot 🚷 view threshold | 63.74(0.00%)Baseline: 63.74 | 82.86 (76.92%) | 📈 view plot 🚷 view threshold | 796.20(0.00%)Baseline: 796.20 | 557.34 (70.00%) |
| /turbolinks_cache_disabled: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 8.97(0.00%)Baseline: 8.97 | 11.66 (76.92%) | 📈 view plot 🚷 view threshold | 17.00(0.00%)Baseline: 17.00 | 22.10 (76.92%) | 📈 view plot 🚷 view threshold | 96.91(0.00%)Baseline: 96.91 | 125.98 (76.92%) | 📈 view plot 🚷 view threshold | 767.63(0.00%)Baseline: 767.63 | 537.34 (70.00%) |
| /turbolinks_cache_disabled: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 11.98(0.00%)Baseline: 11.98 | 15.57 (76.92%) | 📈 view plot 🚷 view threshold | 21.99(0.00%)Baseline: 21.99 | 28.59 (76.92%) | 📈 view plot 🚷 view threshold | 311.93(0.00%)Baseline: 311.93 | 405.51 (76.92%) | 📈 view plot 🚷 view threshold | 472.82(0.00%)Baseline: 472.82 | 330.97 (70.00%) |
| /xhr_refresh: Core | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 671.65(0.00%)Baseline: 671.65 | 873.14 (76.92%) | 📈 view plot 🚷 view threshold | 978.47(0.00%)Baseline: 978.47 | 1,272.01 (76.92%) | 📈 view plot 🚷 view threshold | 6,798.09(0.00%)Baseline: 6,798.09 | 8,837.52 (76.92%) | 📈 view plot 🚷 view threshold | 11.93(0.00%)Baseline: 11.93 | 8.35 (70.00%) |
| /xhr_refresh: Pro | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 20.74(0.00%)Baseline: 20.74 | 26.96 (76.92%) | 📈 view plot 🚷 view threshold | 31.00(0.00%)Baseline: 31.00 | 40.30 (76.92%) | 📈 view plot 🚷 view threshold | 219.60(0.00%)Baseline: 219.60 | 285.48 (76.92%) | 📈 view plot 🚷 view threshold | 374.80(0.00%)Baseline: 374.80 | 262.36 (70.00%) |
| Pro Node Renderer: react_ssr (non-RSC) | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 4.70(0.00%)Baseline: 4.70 | 6.11 (76.92%) | 📈 view plot 🚷 view threshold | 5.69(0.00%)Baseline: 5.69 | 7.40 (76.92%) | 📈 view plot 🚷 view threshold | 9.14(0.00%)Baseline: 9.14 | 11.88 (76.92%) | 📈 view plot 🚷 view threshold | 1,956.47(0.00%)Baseline: 1,956.47 | 1,369.53 (70.00%) |
| Pro Node Renderer: simple_eval (non-RSC) | 📈 view plot 🚷 view threshold | 0.00(0.00%)Baseline: 0.00 | 0.00 (0.00%) | 📈 view plot 🚷 view threshold | 4.20(0.00%)Baseline: 4.20 | 5.46 (76.92%) | 📈 view plot 🚷 view threshold | 5.23(0.00%)Baseline: 5.23 | 6.80 (76.92%) | 📈 view plot 🚷 view threshold | 8.05(0.00%)Baseline: 8.05 | 10.46 (76.92%) | 📈 view plot 🚷 view threshold | 2,163.24(0.00%)Baseline: 2,163.24 | 1,514.27 (70.00%) |
size-limit report 📦
|
Add support for various license plan types beyond just "paid": - startup: Complimentary for qualifying startups - nonprofit: Complimentary for non-profits - education: For educational institutions - oss: For open source projects - partner: Strategic partners Changes: - Add VALID_PLANS constant with all supported plan types - Add license_plan method to retrieve cached plan type - Update check_plan to validate against VALID_PLANS - Update logging to show plan type for non-paid licenses - Add comprehensive tests for all plan types Co-Authored-By: Claude Opus 4.5 <[email protected]>
- Extract shared JWT decoding logic into with_decoded_license helper - Add clarifying comment for plan type logging logic Co-Authored-By: Claude Opus 4.5 <[email protected]>
- Document that determine_license_plan returns nil for invalid plans - Add comment explaining dynamic test generation from VALID_PLANS - Document behavior when unknown plan types are used Co-Authored-By: Claude Opus 4.5 <[email protected]>
Add changelog entry for the multiple license plan types feature that supports: paid, startup, nonprofit, education, oss, and partner. Co-Authored-By: Claude Opus 4.5 <[email protected]>
Update tests to include org field in license payloads and match the new message format that includes organization name. Changes: - Add org field to startup, nonprofit, and oss license payloads - Update expected messages to include organization name in format "License validated successfully (OrgName - plan license)." - Update paid license test to expect "(Acme Corp)" in message Co-Authored-By: Claude Opus 4.5 <[email protected]>
Add the missing getLicensePlan() function to the TypeScript license validator to match the Ruby implementation. This provides: - getLicensePlan() returning ValidPlan type or undefined - Caching for performance (like getLicenseStatus/getLicenseOrganization) - Export of ValidPlan type for consumers - Updated reset() to clear plan cache - Comprehensive test coverage for all plan types Co-Authored-By: Claude Opus 4.5 <[email protected]>
bbb66be to
62b0012
Compare
|
@greptile review this pr |
|
@claude review this PR |
PR Review: Support multiple license plan types (#2334)OverviewThis PR extends the license validator to support multiple plan types beyond "paid" (startup, nonprofit, education, oss, partner). The implementation looks solid overall with good test coverage and consistent changes across both Ruby and TypeScript implementations. ✅ Strengths1. Excellent Test Coverage
2. Good Code Consistency
3. Backwards Compatibility
4. Clear Documentation
🔍 Potential Issues & Suggestions1. Code Duplication in Tests (Minor)Ruby tests ( 2. Missing Edge Case TestsConsider adding tests for:
These are low priority edge cases but would make coverage more complete. 3. Thread Safety Documentation (TypeScript)The Ruby implementation has excellent documentation about thread safety and the LICENSE_MUTEX. The TypeScript implementation uses module-level caching but doesn't document whether it's safe in Node.js cluster/worker scenarios. Suggestion: Add a comment about whether the caching is safe with the Node renderer's worker model. 4. Excellent Refactoring:
|
|
Claude encountered an error —— View job I'll analyze this and get back to you. |
Code Review for PR #2334: Support multiple license plan typesThis PR successfully implements support for multiple license plan types. Here's my detailed review: ✅ Strengths1. Excellent Implementation Consistency
2. Comprehensive Test Coverage
3. Backwards Compatibility
4. Security Best Practices
5. Documentation Quality
🔍 Minor Observations1. Type Safety in TypeScript (line 125, 280, 462)if (VALID_PLANS.includes(plan as ValidPlan)) {The 2. Empty String Plan Handling (TS line 234-248)The test explicitly checks that empty string plans are treated as valid (backwards compat). Consider if this should be documented in the interface definition at line 20-21: // Optional: license plan. See VALID_PLANS for accepted values.
// Empty/absent plan defaults to valid (backwards compatibility with old licenses)
plan?: string;3. Caching StrategyThe caching is well-implemented with proper reset in tests. The 🎯 Code Quality Metrics
🚀 Performance ConsiderationsPositive impacts:
No concerns: The implementation is efficient and follows best practices. 📋 Suggestions (Optional Enhancements)1. Consider Adding Plan Validation HelperFor future use in other parts of the codebase: # In LicenseValidator
def self.valid_plan?(plan)
VALID_PLANS.include?(plan)
end2. Future: Plan-Specific BehaviorThe architecture now supports plan-specific features (attribution requirements, feature flags, etc.). The ✅ Final VerdictApproved with high confidence. This PR is production-ready:
The implementation quality is excellent, with careful attention to thread safety, caching, backwards compatibility, and test coverage. The synchronization between Ruby and TypeScript implementations is particularly impressive. 🎉 Great work, @justin808!The dynamic test generation, comprehensive edge case coverage, and detailed thread safety documentation demonstrate thoughtful engineering. This establishes a solid foundation for supporting complimentary licenses. |
Summary
Extend the license validator to support multiple plan types beyond just "paid". This allows offering complimentary or discounted licenses to qualifying organizations.
Closes #2332
Changes
1. Extended valid plans in LicenseValidator
Added
VALID_PLANSconstant with all supported plan types:paid: Standard commercial licensestartup: Complimentary for qualifying startupsnonprofit: Complimentary for non-profitseducation: For educational institutionsoss: For open source projectspartner: Strategic partners2. Added
license_planmethodNew public method to retrieve and cache the license plan type from the decoded JWT.
3. Updated logging to show plan type
For non-paid licenses, the log message now includes the plan type:
Paid licenses continue to show the simpler message without plan type.
Test plan
license_planmethod🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Documentation
Tests