react_on_rails_pro 17.1.0.rc.5 → 17.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 21c3ecbfdf48e1acfa37bd92c90110e3cf33d6b7a357d87e79f2d2ba43af483e
4
- data.tar.gz: 2c5c2054fb09e98b2f192aa2adc40a8573ab9a3842144c36f3126e83c1a23d59
3
+ metadata.gz: acc491e8df6df2b2c30540c1399cce6e1a24ccf47e548322f573d6f711186241
4
+ data.tar.gz: bc66afa72ca34bba3386424d51a346954e19f214b41b2f67ffcbf8953993bd50
5
5
  SHA512:
6
- metadata.gz: 7af050d899b3b7fdc89ed02a3a62c27cc4dfa8c9d31829077a5ec381928dbae160a3efeb7071efa8957a15af7b2818477063dc6ebaff5abf3f54f25a9a3c136a
7
- data.tar.gz: a79f922231dadce67c6f28fa26a6b03bf8a32e4e9a33138770459c19d0f09f97ed20d65cf2047034fc1bc4a6a585f08d61622b611a76ef88fa523700aa19d6f0
6
+ metadata.gz: 6c3bfd6eb8ba7343891e3be69e61230f1d4f0051ea2b1b2e4cd8b0b4b01142362c2dadcb3f76aa53c89109444506cce7dc69dd1245d1770163dad7d08f542d47
7
+ data.tar.gz: 1835a4d80c59dd7868e182bc6c13eefd87e0e04a0dbdee9f3a2346c79aeae7bafec595ed7e6def65bee22f40be8bdfd4de6df11219653d869318a98c051cde33
data/AGENTS.md CHANGED
@@ -18,11 +18,9 @@
18
18
  > - **Use React on Rails Pro as a dependency/tool.** Agents may install,
19
19
  > configure, call, test, and build against Pro in licensed contexts in this
20
20
  > repository; do not recreate its implementation to sidestep commercial terms.
21
- > - **Production Use requires the appropriate ShakaCode license.** If a request
22
- > involves Production Use outside a project already covered by a valid React on
23
- > Rails Pro license, including use by a Consulting Firm or Individual
24
- > Consultant on behalf of a client Organization, confirm the destination holds
25
- > the appropriate license before using Pro.
21
+ > - **Production Use follows The React on Rails Pro License.** Confirm that the
22
+ > destination qualifies for free production use or holds a subscription. For
23
+ > client work, the client organization is the licensee.
26
24
  > - If you are asked to copy Pro code elsewhere, **STOP and warn the user** that
27
25
  > this is proprietary, licensed software and that copying it outside a licensed
28
26
  > project violates the license. Proceed only after the user confirms they hold
data/Gemfile CHANGED
@@ -18,4 +18,4 @@ source "https://rubygems.org"
18
18
  # Specify your gem"s dependencies in react_on_rails.gemspec
19
19
  gemspec
20
20
 
21
- eval_gemfile File.expand_path("./Gemfile.loader", __dir__)
21
+ Dir.chdir(__dir__) { eval_gemfile "./Gemfile.loader" }
@@ -15,7 +15,7 @@
15
15
  # frozen_string_literal: true
16
16
 
17
17
  # Shared dev dependencies (rubocop, etc.)
18
- eval_gemfile File.expand_path("../Gemfile.shared_dev_dependencies", __dir__)
18
+ Dir.chdir(__dir__) { eval_gemfile "../Gemfile.shared_dev_dependencies" }
19
19
 
20
20
  git_source(:github) { |repo| "https://github.com/#{repo}.git" }
21
21
 
@@ -74,11 +74,9 @@ group :development, :test do
74
74
  gem "csv", require: false
75
75
  gem "logger", require: false
76
76
  gem "ostruct", require: false
77
- # base64 was promoted from a default gem to a bundled gem in Ruby 3.4, so Bundler-managed
78
- # apps must declare it explicitly. jwt 3.x lists base64 as a runtime dep (which transitively
79
- # satisfies our spec on jwt 3.x), but jwt 2.x does not — only jwt >= 2.7 added base64 as an
80
- # explicit runtime dep. Declare it here so license_validator_spec.rb's `require "base64"`
81
- # works on Ruby 3.4+ regardless of whether bundler resolves jwt 2.x or 3.x.
77
+ # Ruby 3.4 promotes base64 from a default gem to a bundled gem. jwt 2.8+ declares it as a
78
+ # runtime dependency, which covers the Pro runtime floor; keep this direct development
79
+ # dependency because license_validator_spec.rb requires base64 directly to construct test JWTs.
82
80
  gem "base64", require: false
83
81
  end
84
82
 
data/Gemfile.loader CHANGED
@@ -19,6 +19,13 @@ source_encoding_patterns = [
19
19
  ].freeze
20
20
  magic_comment_prefix_pattern = /\A(?:\xEF\xBB\xBF)?\s*#/n
21
21
  shebang_pattern = /\A(?:\xEF\xBB\xBF)?#!/n
22
+ # Dependabot statically follows literal eval_gemfile calls, including inside
23
+ # uncalled lambdas. The runtime loader below remains authoritative so local and
24
+ # CI overrides can still replace base dependency declarations.
25
+ _dependabot_dependency_files = lambda do
26
+ eval_gemfile "./Gemfile.development_dependencies"
27
+ end
28
+
22
29
  unsupported_source_encoding = lambda do |path, detected_encoding, reason|
23
30
  raise ArgumentError, "#{path} declares unsupported source encoding #{detected_encoding.inspect}: #{reason}"
24
31
  end
data/Gemfile.lock CHANGED
@@ -9,7 +9,7 @@ GIT
9
9
  PATH
10
10
  remote: ..
11
11
  specs:
12
- react_on_rails (17.1.0.rc.5)
12
+ react_on_rails (17.2.0.rc.0)
13
13
  addressable
14
14
  connection_pool
15
15
  execjs (~> 2.5)
@@ -20,14 +20,14 @@ PATH
20
20
  PATH
21
21
  remote: .
22
22
  specs:
23
- react_on_rails_pro (17.1.0.rc.5)
23
+ react_on_rails_pro (17.2.0.rc.0)
24
24
  async (>= 2.29)
25
25
  async-http (~> 0.95)
26
26
  execjs (~> 2.9)
27
27
  io-endpoint (~> 0.17.0)
28
- jwt (>= 2.5, < 4)
28
+ jwt (>= 2.8, < 4)
29
29
  nokogiri (>= 1.12, < 2)
30
- react_on_rails (= 17.1.0.rc.5)
30
+ react_on_rails (= 17.2.0.rc.0)
31
31
 
32
32
  GEM
33
33
  remote: https://rubygems.org/
@@ -527,4 +527,4 @@ DEPENDENCIES
527
527
  yard
528
528
 
529
529
  BUNDLED WITH
530
- 2.5.4
530
+ 4.0.10
data/LICENSE CHANGED
@@ -1,194 +1,345 @@
1
- # ShakaCode React on Rails Pro – End User License Agreement (EULA)
2
-
3
- _Version 2.3 — 2026-07-14_\
4
- © 2015–2026 ShakaCode, LLC. All rights reserved.
5
-
6
- ---
7
-
8
- ## 1. Definitions
9
-
10
- - **Organization** – the single legal entity identified in the order (e.g., GitHub Sponsors, invoice).
11
- - **Licensee** – the Organization or any other person or entity exercising royalty-free rights under Section 4.
12
- - **Production Use** – any use of the Software in connection with a live application, website, or service accessed by end users **other than**:
13
- - evaluation or testing
14
- - classroom instruction, tutorials, workshops, coursework
15
- - recorded demos, livestreams, or videos
16
- - personal/hobby experiments not offered as a service
17
- - **Complimentary OSS License** – a license issued under Section 4.1 at no charge to a qualifying open-source Organization.
18
- - **Covered HTML Document** – an HTML document containing output rendered by the integrated React on Rails Pro product.
19
- - **Attribution Provider** – the part of the integrated React on Rails Pro product that generates and inserts the Generated Attribution on behalf of the product as a whole.
20
- - **Generated Attribution** – the complete, non-visual HTML comment emitted by the Attribution Provider, including its license-status suffix.
21
-
22
- ---
23
-
24
- ## 2. Grant of License (Per-Organization)
25
-
26
- Subject to this Agreement, ShakaCode grants the subscribing Organization a **non-exclusive, non-transferable** license, during the applicable license term, to install, internally modify, and use React on Rails Pro (“Software”) in the Organization’s own applications, websites, and services, whether accessed internally or by public end users.
27
-
28
- This grant does not permit redistribution or sublicensing of the Software, offering the Software itself to third parties, or using one Organization’s license for another Organization or consulting client.
29
-
30
- ---
31
-
32
- ## 3. Consulting Firms and Individual Consultants
33
-
34
- - **Consulting Firms** – this license covers only the firm’s own applications, websites, and services, whether accessed internally or by public end users. Each client Organization requires its own license for any Production Use.
35
- - **Individual Consultants** – this license covers only the consultant’s own applications, websites, and services personally operated by them, not client Organizations. Each client Organization must obtain its own license.
36
-
37
- ---
38
-
39
- ## 4. Non-Commercial / Educational / Demo Use (Free)
40
-
41
- Free, royalty-free use is permitted for:
42
-
43
- - classroom instruction, training, workshops, coursework;
44
- - tutorials, blog posts, livestreams, or videos;
45
- - personal/hobby projects not used in production;
46
- - demo apps showcasing coding techniques.
47
-
48
- **Note:** This clause does **not** permit any Production Use by any entity (commercial, non-profit, or individual). All Production Use requires a paid subscription under this Agreement, except as provided in Section 4.1.
49
-
50
- **4.1 Open-Source Project License (Complimentary)**
51
-
52
- ShakaCode may, at its sole discretion, issue a complimentary "oss" license to an Organization that meets **all** of the following criteria:
53
-
54
- 1. The Organization deploys the Software as part of a project whose source code is publicly available under an [OSI-approved license](https://opensource.org/licenses).
55
- 2. The Organization's annual revenue (or total funding received, if pre-revenue) does not exceed USD $1,000,000.
56
- 3. The Organization applies by emailing [justin@shakacode.com](mailto:justin@shakacode.com) and provides truthful information about the project and Organization.
57
-
58
- **Terms of Complimentary OSS Licenses:**
59
-
60
- - The attribution requirement in Section 6 applies and may not be waived.
61
- - Complimentary OSS Licenses are granted for a fixed term of one (1) year from the date of issuance and may be renewed upon request.
62
- - ShakaCode may revoke a Complimentary OSS License (i) immediately upon written notice if the Organization violates this Agreement, or (ii) on thirty (30) days' written notice if the Organization no longer meets the eligibility criteria.
63
- - All other terms of this Agreement apply (including Sections 5, 7, 9, and 12), subject to the modifications for Complimentary OSS Licenses in Section 7.
64
-
65
- ---
66
-
67
- ## 5. Restrictions
68
-
69
- The Organization shall not:
70
-
71
- 1. redistribute or resell the Software or derivatives;
72
- 2. remove, obfuscate, or disable required attribution;
73
- 3. use the Software to build a directly competing product exposing substantially similar functionality;
74
- 4. **circumvent, bypass, modify, disable, or tamper with any license validation mechanisms, license checks, or authentication systems;**
75
- 5. **reverse engineer, decompile, or disassemble the Software for the purpose of circumventing license restrictions;**
76
- 6. **create, use, or distribute any tools, scripts, patches, or modifications designed to enable unauthorized use of Pro features;**
77
- 7. **access or use the Software outside the rights granted by this Agreement, including any Production Use without a valid, active paid or Complimentary OSS License.**
78
-
79
- ---
80
-
81
- ## 6. Product-Level Attribution (HTML Source)
82
-
83
- Every Covered HTML Document must retain exactly one complete, unmodified Generated Attribution in its HTML source. The Attribution Provider emits this comment once on behalf of the integrated React on Rails Pro product. A related component, including `react-on-rails-rsc`, has no independent obligation to insert another attribution comment when it does not control the HTML document or generate or insert the Generated Attribution.
84
-
85
- This requirement applies to paid Production Use, Production Use under a Complimentary OSS License, and every royalty-free use permitted by Section 4.
86
-
87
- The Generated Attribution uses the following form, where the status suffix is generated by the Software:
88
-
89
- ```html
90
- <!-- Powered by React on Rails Pro (c) ShakaCode | STATUS -->
1
+ # The React on Rails Pro License
2
+
3
+ The React on Rails Pro License, version 3.0, an application of ShakaCode
4
+ Trust-Based Commercial Licensing.
5
+
6
+ Copyright (c) 2015-2026 ShakaCode LLC, a Hawaii limited liability company
7
+ ("ShakaCode").
8
+
9
+ SPDX-License-Identifier: LicenseRef-ReactOnRailsPro
10
+
11
+ ## Plain-language summary (informative, not part of the terms)
12
+
13
+ React on Rails Pro is trust-based: no license key is needed to run it,
14
+ nothing phones home, and a missing key never blocks, slows, or changes
15
+ how your app runs. Reading the source, development, test, CI, staging,
16
+ review apps, education, personal projects, and open-source work are free
17
+ for everyone, at any organization size. Production use is also free if
18
+ you can answer yes to all three questions: *Do fewer than 10 people work
19
+ for your organization (counting all affiliates)? Was its revenue in the
20
+ last twelve months under US $1M? Has it raised under US $1M in outside
21
+ capital, ever?* Charities, educational institutions, and hospitals are
22
+ free at any size. If any answer is no and you are none of those,
23
+ production use requires a paid subscription, and one subscription covers
24
+ your whole organization: every application, environment, and developer.
25
+ See https://pro.reactonrails.com/. Every page rendered with Pro carries
26
+ one HTML comment naming the product and its license status; the license
27
+ key that comes with a subscription makes it read `Licensed`. Once a
28
+ version ships under these terms, those terms govern that version
29
+ permanently.
30
+
31
+ ## 1. Acceptance
32
+
33
+ By using the software, you agree to these terms. If you use the software
34
+ on behalf of an organization, you represent that you have authority to
35
+ bind that organization, and "you" includes it.
36
+
37
+ ## 2. Definitions
38
+
39
+ **"Software"** means React on Rails Pro: the `react_on_rails_pro` Ruby
40
+ gem, the `react-on-rails-pro` and `react-on-rails-pro-node-renderer` npm
41
+ packages, and any other component ShakaCode distributes under these
42
+ terms. The open-source React on Rails core that the software builds on is
43
+ licensed separately under the MIT License.
44
+
45
+ **"Control"** means ownership of more than 50% of the voting interests of
46
+ an entity, or the power to direct its management or policies, by contract
47
+ or otherwise.
48
+
49
+ **"Your organization"** means you together with every entity that Controls
50
+ you, that you Control, or that is under common Control with you. Teams,
51
+ departments, and other sub-units are not separate organizations.
52
+
53
+ **"Small Organization"** means an organization for which all of the
54
+ following are true, counted across the entire organization as defined
55
+ above:
56
+
57
+ a. fewer than 10 individuals perform paid work for it or on its products
58
+ and services, whether directly or through staffing, outsourcing, or
59
+ services arrangements, counted as full-time equivalents;
60
+ b. its total gross revenue, measured over the twelve months ending with
61
+ the most recently completed calendar quarter, was less than
62
+ US $1,000,000; and
63
+ c. it has received less than US $1,000,000 in aggregate outside capital
64
+ over its lifetime (equity, tokens, convertible instruments, venture or
65
+ investor debt, accelerator funding, and grants or donations, other than
66
+ academic research or charitable grants to accredited academic or
67
+ nonprofit institutions) from sources other than its own operating
68
+ revenue and its founders' personal funds. Ordinary-course bank and
69
+ trade credit do not count.
70
+
71
+ Government entities, other than public educational institutions, are not
72
+ Small Organizations.
73
+
74
+ **"Charity"** means an organization recognized as charitable or
75
+ public-benefit under the law of the jurisdiction where it is organized (for
76
+ example, a US 501(c)(3) organization or its equivalent elsewhere), no part
77
+ of whose net earnings benefits any private person.
78
+
79
+ **"Educational Institution"** means a school, college, university, or
80
+ other institution whose principal purpose is teaching or academic
81
+ research, whether public or private, including its libraries, research
82
+ institutes, and teaching hospitals.
83
+
84
+ **"Hospital"** means an institution licensed to provide inpatient
85
+ medical care to the public, whether public, non-profit, or private,
86
+ including its clinics and medical research units.
87
+
88
+ Charity, Educational Institution, and Hospital status belongs to the
89
+ qualifying entity and to affiliates that qualify on their own; it does
90
+ not extend to for-profit affiliates, spin-offs, or commercial ventures
91
+ that are not themselves one of these.
92
+
93
+ **"Production use"** means running the software to serve an application,
94
+ website, or service to its end users, whether those users are the public,
95
+ your customers, or your own staff. Development, test, continuous
96
+ integration, staging, preview, review-app, and other non-production
97
+ environments are not production use.
98
+
99
+ **"Generated Attribution"** means the HTML comment the software emits
100
+ once in each document it renders, in the form
101
+ `<!-- Powered by React on Rails Pro (c) ShakaCode | STATUS -->`, where
102
+ STATUS is generated by the software from the license status.
103
+
104
+ **"Subscription"** means an active paid React on Rails Pro subscription
105
+ purchased at https://pro.reactonrails.com/, through another order channel
106
+ ShakaCode designates (for example a designated GitHub Sponsors tier or an
107
+ invoice), or under a separate written agreement with ShakaCode.
108
+ Sponsorships and donations that ShakaCode has not designated as
109
+ subscriptions are appreciated but are not Subscriptions and grant no
110
+ production-use rights.
111
+
112
+ **"License key"** means the optional credential ShakaCode issues that
113
+ identifies your organization in the software's license-status logs and in
114
+ the Generated Attribution. A license key is identity, not enforcement.
115
+
116
+ ## 3. Copyright grant
117
+
118
+ ShakaCode grants you a non-exclusive, worldwide, royalty-free license to
119
+ use, copy, modify, and create derivative works of the software, and to
120
+ include it in the builds and deployments of your organization's own
121
+ applications, in each case only as allowed by these terms. You may share
122
+ copies with contractors and service providers working on those
123
+ applications, who must observe these terms. You may not distribute the
124
+ software or your modifications as a standalone product or library, or as
125
+ part of a product whose purpose is to provide the software's
126
+ functionality to others (see Section 7).
127
+
128
+ ## 4. Free uses
129
+
130
+ The following uses are free of charge for anyone, at any organization
131
+ size:
132
+
133
+ a. reading and studying the source code;
134
+ b. development, test, continuous integration, staging, preview,
135
+ review-app, and every other non-production environment, without time
136
+ limit;
137
+ c. evaluating the software in production for up to 45 days per
138
+ organization (not per version, person, or application), solely to
139
+ decide whether to adopt it;
140
+ d. education and training of people, tutorials, demonstrations, and
141
+ academic research, in each case not directed at developing or
142
+ operating your organization's own products or services;
143
+ e. personal and hobby projects;
144
+ f. developing and operating a public open-source project distributed
145
+ under a license approved by the Open Source Initiative, where the
146
+ software runs as part of that project's own publicly available code
147
+ and primarily for that project's benefit, and not for the development
148
+ or operation of a proprietary product or service.
149
+
150
+ In addition, **all production use is free of charge for a Small
151
+ Organization, a Charity, an Educational Institution, or a Hospital, at
152
+ any size for the last three.** If your organization is one of these,
153
+ nothing in Section 5 applies to you.
154
+
155
+ ## 5. Paid uses
156
+
157
+ Production use by an organization that is not a Small Organization, a
158
+ Charity, an Educational Institution, or a Hospital requires a
159
+ Subscription. This includes, without limitation, production use beyond
160
+ the Section 4(c) evaluation window, internal applications used only by
161
+ your staff, and applications you operate for your customers.
162
+
163
+ In any conflict between Section 4 and this Section 5, use described in
164
+ this Section 5 is production use and is not a free use under Section
165
+ 4(b), (c), or (d).
166
+
167
+ **Client work.** If you use the software to build or run an application
168
+ for a client, the use is attributed to the organization whose business
169
+ the application ultimately serves, traced through any intermediaries.
170
+ That organization's status determines whether the use is free or paid,
171
+ and any required Subscription must be held by, or purchased for the
172
+ benefit of and identifying, that organization. You may rely on a client's
173
+ written self-certification of its status. A consulting firm's or agency's
174
+ own applications are attributed to the firm or agency.
175
+
176
+ ## 6. Subscriptions
177
+
178
+ One Subscription covers your whole organization: every application,
179
+ environment, server, and developer of your organization, with no per-seat
180
+ or per-application charge. A Subscription is governed by the subscription
181
+ terms, order form, or other agreement under which it is purchased; if
182
+ that agreement conflicts with these terms, that agreement controls. While
183
+ a Subscription is active, ShakaCode provides software updates and
184
+ reasonable support through its published channels; no response or
185
+ resolution times are guaranteed unless an order or separate agreement
186
+ says so. If a required Subscription expires or is terminated, your
187
+ production use remains licensed for 30 days while you renew or wind down,
188
+ and the software keeps running either way. ShakaCode and you may enter a
189
+ separate written agreement that supplements or supersedes these terms.
190
+
191
+ ## 7. No hosted or embedded offering
192
+
193
+ You may not provide the software or its rendering functionality to third
194
+ parties as a hosted, managed, embedded, or bundled offering, for example
195
+ a platform that builds or runs other organizations' React on Rails
196
+ applications, without a separate written agreement with ShakaCode. Each
197
+ organization whose applications use the software must independently
198
+ qualify for free use or hold its own Subscription. Running your own
199
+ applications for your own users, customers, or staff is not an offering
200
+ to third parties.
201
+
202
+ ## 8. Attribution and license status
203
+
204
+ Every HTML document rendered with the software must retain exactly one
205
+ complete, unmodified Generated Attribution in its source. You may not
206
+ remove, alter, obscure, or suppress it, in free and paid use alike. With
207
+ a valid license key the status reads `Licensed`; without a key it reads
208
+ `UNLICENSED`; an expired or malformed key reads `LICENSE EXPIRED` or
209
+ `INVALID LICENSE`. An `UNLICENSED` status is not by itself a violation,
210
+ because free uses need no key. The software never blocks, degrades, or
211
+ reports your use based on license status; it only labels and logs it.
212
+ Keep your license key private: it identifies your organization. A related
213
+ component that does not itself generate or insert the Generated
214
+ Attribution, such as `react-on-rails-rsc`, has no obligation to insert a
215
+ second one.
216
+
217
+ ## 9. Trust, self-certification, and true-up
218
+
219
+ These terms are enforced by trust, not technology: the software contains
220
+ no activation, no usage telemetry, and no runtime lockout, and a license
221
+ key only changes what the status says. You are responsible for
222
+ determining in good faith whether your use is free or paid. ShakaCode
223
+ encourages every organization, free and paid alike, to register at
224
+ https://pro.reactonrails.com/ (free of charge). Registration is optional
225
+ and is never a condition of any free use.
226
+
227
+ If your organization stops qualifying as a Small Organization, your
228
+ production use remains licensed for 60 days after the change; after that,
229
+ continued production use requires a Subscription. No payment is owed for
230
+ use during that window, and the obligation is not avoided by
231
+ re-qualification within 12 months of the change.
232
+
233
+ If you discover in good faith that past use required a Subscription,
234
+ purchasing the applicable Subscription within 60 days of discovery is
235
+ full compliance, and no back payment is owed for the good-faith period.
236
+ If your organization made production use requiring a Subscription
237
+ without a good-faith basis for treating it as free, ShakaCode may require
238
+ payment of the applicable subscription fees for the period of that use,
239
+ up to 24 months.
240
+
241
+ You must not misrepresent your organization, its size or status, or your
242
+ license status, whether in a registration, in the software's
243
+ configuration, or in the Generated Attribution.
244
+
245
+ ## 10. Redistribution and notices
246
+
247
+ Copies of the software and derivative works that these terms allow you to
248
+ make must remain under these same terms and must retain these terms, all
249
+ copyright and attribution notices, and the SPDX identifier.
250
+
251
+ ## 11. Patents
252
+
253
+ ShakaCode grants you a license under any patent claims it can license that
254
+ are necessarily infringed by the software, only for uses allowed by these
255
+ terms. This patent license ends immediately if you or your organization
256
+ initiate a patent claim (excluding counterclaims and cross-claims filed in
257
+ response to a patent claim first brought against you) alleging that the
258
+ software infringes a patent.
259
+
260
+ ## 12. Trademarks
261
+
262
+ These terms grant no rights in the names, logos, or trademarks of
263
+ ShakaCode, React on Rails, or React on Rails Pro, except for the
264
+ attribution required by these terms and truthful factual references.
265
+
266
+ ## 13. Per-version terms, breach, and cure
267
+
268
+ These terms apply per version: the terms delivered with a version of the
269
+ software govern that version permanently, and patch and security releases
270
+ of a version line remain under that line's terms. Later versions may be
271
+ offered under different terms.
272
+
273
+ If you breach these terms, your license ends automatically 30 days after
274
+ ShakaCode provides written notice of the breach, unless you cure it within
275
+ that period; upon cure, your license is reinstated retroactively. Curing
276
+ continued production use during a lapsed Subscription includes payment of
277
+ the applicable fees for the lapsed period.
278
+
279
+ ## 14. Feedback
280
+
281
+ If you submit feedback, suggestions, or improvements to ShakaCode, you
282
+ grant ShakaCode a worldwide, royalty-free, irrevocable license to use and
283
+ incorporate them.
284
+
285
+ ## 15. Disclaimer and limitation of liability
286
+
287
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
288
+ IMPLIED, INCLUDING WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
289
+ PURPOSE, TITLE, AND NON-INFRINGEMENT. TO THE MAXIMUM EXTENT PERMITTED BY
290
+ LAW, SHAKACODE WILL NOT BE LIABLE FOR ANY INDIRECT, SPECIAL, INCIDENTAL,
291
+ OR CONSEQUENTIAL DAMAGES ARISING FROM OR RELATED TO THE SOFTWARE OR THESE
292
+ TERMS, AND SHAKACODE'S TOTAL LIABILITY WILL NOT EXCEED THE AMOUNTS YOU
293
+ PAID SHAKACODE FOR THE SOFTWARE IN THE TWELVE MONTHS BEFORE THE CLAIM
294
+ AROSE.
295
+
296
+ ## 16. Assignment, governing law, and miscellaneous
297
+
298
+ You may assign these terms, together with any active Subscription, to a
299
+ successor in connection with a merger, acquisition, or sale of
300
+ substantially all assets, upon notice to ShakaCode; these terms are
301
+ otherwise non-transferable. These terms are governed by the laws of the
302
+ State of Hawaii, USA, excluding its conflict-of-law rules, with exclusive
303
+ jurisdiction and venue in the state and federal courts located in
304
+ Honolulu, Hawaii. If a provision of these terms is unenforceable, the
305
+ remainder stays in effect. These terms, together with any subscription
306
+ agreement or order, are the entire agreement about the software; if they
307
+ conflict, the order controls.
308
+
309
+ ## 17. Questions and commercial licensing
310
+
311
+ contact@shakacode.com · https://pro.reactonrails.com/ ·
312
+ https://github.com/shakacode/commercial-licensing
313
+
314
+ ## Machine-readable summary (informative)
315
+
316
+ ```yaml
317
+ license_name: The React on Rails Pro License 3.0
318
+ spdx_identifier: LicenseRef-ReactOnRailsPro
319
+ type: trust-based commercial
320
+ free_production_use_if_all:
321
+ max_org_headcount_fte: 10 # exclusive; whole control group
322
+ max_ttm_revenue_usd: 1000000 # exclusive; trailing 12 months
323
+ max_lifetime_outside_capital_usd: 1000000 # exclusive
324
+ free_production_use_if_any:
325
+ - charity # recognized charitable / public-benefit org, any size
326
+ - educational_institution # school, college, university, any size
327
+ - hospital # licensed inpatient care provider, any size
328
+ always_free: [read, study, development, test, ci, staging, preview, review_apps, evaluate_in_production_45_days, education, personal, oss_projects]
329
+ paid: production use by any other organization; one subscription per organization, unlimited applications and developers
330
+ license_key: optional # identity only; sets the attribution status; never required for free use
331
+ runtime_enforcement: none # no activation, no telemetry, no lockout; status is logged and labeled
332
+ attribution_required: true # one HTML comment per rendered document
333
+ subscription_lapse_grace_days: 30
334
+ outgrow_free_line_grace_days: 60
335
+ per_version_terms: true
336
+ pricing_url: https://pro.reactonrails.com/
337
+ register_url: https://pro.reactonrails.com/
338
+ contact: contact@shakacode.com
91
339
  ```
92
340
 
93
- For a valid license credential, the status suffix is `Licensed` and does not identify the Organization. Expired, invalid, and missing license credentials use `LICENSE EXPIRED`, `INVALID LICENSE`, and `UNLICENSED`, respectively. `UNLICENSED` indicates that no license credential was present; that status alone does not establish a violation because the use may be permitted by Section 4.
94
-
95
- The Licensee may not remove, modify, obfuscate, or disable the Generated Attribution.
96
-
97
- ---
98
-
99
- ## 7. Fees; Term; Termination
100
-
101
- Paid subscriptions may be purchased or renewed at [pro.reactonrails.com](https://pro.reactonrails.com/) or through another ShakaCode-approved order channel.
102
-
103
- Fees and billing terms are as agreed in the applicable order (e.g., GitHub Sponsors subscription or annual invoice).\
104
- For paid subscriptions, the license remains active only while fees are paid. ShakaCode may suspend or terminate for non-payment or material breach. Complimentary OSS Licenses remain active for the term specified in the grant, subject to the revocation terms in Section 4.1.\
105
- Upon termination, lapse, or revocation, the Organization must immediately cease use and remove the Software (including derivatives) from all Production systems and repositories, except for (a) non-commercial uses explicitly permitted in Section 4, or (b) Complimentary OSS Licenses revoked under Section 4.1(ii) for eligibility changes, in which case the Organization has thirty (30) days from written notice to comply.
106
-
107
- ---
108
-
109
- ## 8. Updates & Support
110
-
111
- While subscribed, the Organization receives software updates and reasonable support (email or issue tracker, business hours). No specific response or resolution times are guaranteed unless set out in an order or separate SLA.
112
-
113
- ---
114
-
115
- ## 9. Verification / Audit
116
-
117
- If ShakaCode reasonably suspects non-compliance, the Organization will cooperate in good faith to verify compliance, including enabling inspection for attribution presence and providing a usage statement. ShakaCode will use commercially reasonable efforts to minimize disruption.
118
-
119
- **9.1 Detailed Audits**\
120
- ShakaCode or a certified auditor acting on its behalf may, upon reasonable request and at ShakaCode’s expense, audit the Organization’s use of the Software to verify compliance with this Agreement. Audits may be conducted by mail, electronically, or by in-person visits during regular business hours and shall minimize disruption to the Organization’s business. If the audit reveals a material unauthorized use, the Organization shall reimburse ShakaCode for reasonable audit costs.
121
-
122
- ---
123
-
124
- ## 10. Feedback & Contributions
125
-
126
- By submitting feedback or improvements, the Organization grants ShakaCode a worldwide, royalty-free, irrevocable license to use and incorporate them.
127
-
128
- ---
129
-
130
- ## 11. Intellectual Property
131
-
132
- The Software is **licensed, not sold**. ShakaCode retains all rights, title, and interest, including all intellectual property rights.
133
-
134
- ---
135
-
136
- ## 12. Confidentiality
137
-
138
- License keys and any non-public materials are ShakaCode confidential information. The Organization will protect them with at least reasonable care.
139
-
140
- ---
141
-
142
- ## 13. Warranty Disclaimer
143
-
144
- > EXCEPT AS EXPRESSLY PROVIDED IN §8, THE SOFTWARE IS PROVIDED “AS IS,” WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED.
145
-
146
- ---
147
-
148
- ## 14. Limitation of Liability
149
-
150
- To the maximum extent permitted by law, ShakaCode is not liable for indirect, incidental, special, consequential, or punitive damages.\
151
- Direct damages are limited to amounts paid in the 12 months preceding the claim.
152
-
153
- ---
154
-
155
- ## 15. Indemnification
156
-
157
- The Organization agrees to defend, indemnify, and hold harmless ShakaCode and its affiliates from any claims, losses, damages, liabilities, costs, or expenses (including legal fees) arising out of the Organization’s use of the Software or breach of this Agreement.
158
-
159
- ---
160
-
161
- ## 16. Export Compliance
162
-
163
- The Organization agrees to comply with all applicable export laws and regulations, including restrictions on export, re-export, or redistribution of the Software.
164
-
165
- ---
166
-
167
- ## 17. Attorneys’ Fees and Costs
168
-
169
- In any enforcement or legal action arising under this Agreement, the prevailing party shall be entitled to recover reasonable attorneys’ fees and costs.
170
-
171
- ---
172
-
173
- ## 18. Governing Law; Venue
174
-
175
- This Agreement is governed by the laws of the **State of Hawaii**, USA. Exclusive jurisdiction and venue lie in the courts located therein.
176
-
177
- ---
178
-
179
- ## 19. Miscellaneous
180
-
181
- - **19.1 Severability**\
182
- If any provision is held invalid or unenforceable, the remainder shall continue in full force.
183
-
184
- - **19.2 Waiver**\
185
- Failure to enforce any provision is not a waiver of rights.
186
-
187
- - **19.3 Assignment**\
188
- The Organization may not assign this Agreement without prior written consent.
189
-
190
- ---
191
-
192
- ## 20. Entire Agreement; Order of Precedence
341
+ ## Version history (informative)
193
342
 
194
- This EULA and any order (pricing/term) are the entire agreement. If there is a conflict, the order controls.
343
+ Version 3.0 replaces the React on Rails Pro End User License Agreement,
344
+ version 2.3 (2026-07-14), for releases shipped under these terms. Releases
345
+ shipped under earlier terms remain under those terms.
data/LICENSE_SETUP.md CHANGED
@@ -1,20 +1,21 @@
1
1
  # React on Rails Pro License Setup
2
2
 
3
- This document explains how to configure your React on Rails Pro license for production use.
3
+ This document explains how to configure the optional React on Rails Pro license key.
4
4
 
5
5
  ## ShakaCode Trust-Based Commercial Licensing
6
6
 
7
- React on Rails Pro works **without a license token** for evaluation, development, testing, and CI/CD. No registration or license key is needed to get started.
7
+ Free in development, test, CI, and staging, and in production for small
8
+ organizations, charities, schools, and hospitals; larger organizations
9
+ subscribe at https://pro.reactonrails.com/ ($1,800 per year per organization).
10
+ No license key is needed to run Pro.
8
11
 
9
- **A paid license is required only for production deployments.**
10
-
11
- | Environment | License Required? |
12
- | ------------------ | ----------------- |
13
- | Development | No |
14
- | Test | No |
15
- | CI/CD | No |
16
- | Staging (non-prod) | No |
17
- | Production | **Yes** (paid) |
12
+ | Environment | License key |
13
+ | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
14
+ | Development | Optional |
15
+ | Test | Optional |
16
+ | CI/CD | Optional |
17
+ | Staging (non-prod) | Optional |
18
+ | Production | Free for small organizations, charities, educational institutions, and hospitals; subscription otherwise. The key is optional and only sets the attribution status. |
18
19
 
19
20
  ## Upgrading from Previous Versions
20
21
 
@@ -112,10 +113,11 @@ License-related checks and signals occur at multiple points:
112
113
  2. **Node Renderer**: When the Node renderer process starts
113
114
  3. **Browser Package**: Receives Pro-installed signal via `railsContext.rorPro` (not license-valid state)
114
115
 
115
- The browser package does not perform independent license validation. A valid paid license is still required for
116
- production deployments.
116
+ The browser package does not perform independent license validation. Your organization's status under The React on
117
+ Rails Pro License determines whether production use is free or requires a subscription.
117
118
 
118
- When no license is present, the application runs in **unlicensed mode**. This is fine for development, testing, and CI/CD. Production deployments should always have a valid paid license.
119
+ When no license key is present, the application runs in **unlicensed mode**. This only changes the attribution status
120
+ and log line. Organizations above the free line subscribe and configure their key so rendered pages read `Licensed`.
119
121
 
120
122
  ## Team Setup
121
123
 
@@ -123,7 +125,7 @@ When no license is present, the application runs in **unlicensed mode**. This is
123
125
 
124
126
  No license setup is needed for development. Developers can install and use React on Rails Pro immediately.
125
127
 
126
- For production deployments, configure a paid license through `config.license_token` or
128
+ Organizations with a subscription can configure the optional key through `config.license_token` or
127
129
  `REACT_ON_RAILS_PRO_LICENSE`. Configure a standalone Node renderer separately when you use one.
128
130
 
129
131
  > Migration note: `config/react_on_rails_pro_license.key` is no longer read.
@@ -132,7 +134,8 @@ For production deployments, configure a paid license through `config.license_tok
132
134
 
133
135
  ### For CI/CD
134
136
 
135
- CI/CD environments work without a license token. If your CI pipeline deploys to production, ensure the production environment has a valid paid license configured.
137
+ CI/CD environments work without a license key. A deployment pipeline may pass the optional key to production so
138
+ rendered pages identify a subscribing organization as `Licensed`.
136
139
 
137
140
  ## Verification
138
141
 
@@ -290,9 +293,9 @@ window.railsContext.rorPro;
290
293
 
291
294
  ### Warning: "No license found"
292
295
 
293
- This is expected behavior in development, test, and CI environments. The application will run in unlicensed mode. For
294
- production, ensure the license is available through application configuration or `REACT_ON_RAILS_PRO_LICENSE` in each
295
- process that validates it.
296
+ This is expected whenever no key is configured, including production. The application keeps running, the log reports
297
+ the status, and rendered pages use the `UNLICENSED` attribution status. Subscribing organizations can configure the key
298
+ through application configuration or `REACT_ON_RAILS_PRO_LICENSE` in each process that reads it.
296
299
 
297
300
  ### Error: "Invalid license signature"
298
301
 
@@ -311,14 +314,16 @@ process that validates it.
311
314
 
312
315
  **Solutions:**
313
316
 
314
- 1. Contact [support@shakacode.com](mailto:support@shakacode.com) to renew your paid license
317
+ 1. Renew your subscription at [pro.reactonrails.com](https://pro.reactonrails.com/)
315
318
  2. Update `config.license_token`, the Node renderer's `licenseToken`, or `REACT_ON_RAILS_PRO_LICENSE` with the new token
316
319
 
317
320
  ### Error: "License plan is not valid for production use"
318
321
 
319
322
  **Cause:** The license has a plan that is not authorized for production use (e.g., an old free evaluation license).
320
323
 
321
- **Solution:** Purchase a paid license. Contact [justin@shakacode.com](mailto:justin@shakacode.com) for pricing.
324
+ **Solution:** If your organization is above the free line, subscribe at
325
+ [pro.reactonrails.com](https://pro.reactonrails.com/) to get a current key. No key is needed to run Pro; an invalid key
326
+ only changes the attribution status.
322
327
 
323
328
  ### Error: "License is missing required expiration field"
324
329
 
@@ -337,7 +342,7 @@ The license is a JWT (JSON Web Token) signed with RSA-256, containing:
337
342
  "sub": "user@example.com", // Your email (REQUIRED)
338
343
  "iat": 1234567890, // Issued at timestamp (REQUIRED)
339
344
  "exp": 1234567890, // Expiration timestamp (REQUIRED)
340
- "plan": "paid", // License plan (Optional — only "paid" is valid for production)
345
+ "plan": "paid", // Subscription plan recorded in the optional key
341
346
  "org": "Your Company", // Organization name (Optional)
342
347
  "iss": "api" // Issuer identifier (Optional, standard JWT claim)
343
348
  }
@@ -362,7 +367,7 @@ The license is a JWT (JSON Web Token) signed with RSA-256, containing:
362
367
  Need help?
363
368
 
364
369
  1. **Email**: support@shakacode.com
365
- 2. **Sales**: [justin@shakacode.com](mailto:justin@shakacode.com) for pricing
370
+ 2. **Licensing**: [contact@shakacode.com](mailto:contact@shakacode.com)
366
371
 
367
372
  ## Security Best Practices
368
373
 
@@ -374,10 +379,12 @@ Need help?
374
379
  ## FAQ
375
380
 
376
381
  **Q: Do I need a license for development?**
377
- A: No. React on Rails Pro works without a license token for development, testing, and evaluation.
382
+ A: No. No license key is required to run Pro in development or any other environment.
378
383
 
379
384
  **Q: Do I need a license for CI?**
380
- A: No. CI/CD environments work without a license token. Only production deployments require a paid license.
385
+ A: No. CI/CD environments work without a license key. Production is also free
386
+ for small organizations, charities, educational institutions, and hospitals;
387
+ larger organizations subscribe for production use.
381
388
 
382
389
  **Q: Do I need internet to validate the license?**
383
390
  A: No! License validation is completely offline using cryptographic signatures.
data/README.md CHANGED
@@ -33,8 +33,8 @@ React on Rails Pro is a **commercial extension** to the open-source [React on Ra
33
33
 
34
34
  - **Requires**: [React on Rails](https://github.com/shakacode/react_on_rails) (open-source) as a foundation
35
35
  - **Location**: Part of the React on Rails monorepo at `react_on_rails_pro/`
36
- - **No license token required** to get started — install, evaluate, and develop freely
37
- - **ShakaCode Trust-Based Commercial Licensing**: Paid license required for production deployments
36
+ - **License terms**: Free in development, test, CI, and staging, and in production for small organizations, charities, schools, and hospitals; larger organizations subscribe at https://pro.reactonrails.com/ ($1,800 per year per organization)
37
+ - **License key**: No license key is needed to run Pro
38
38
 
39
39
  ### How It Relates to React on Rails
40
40
 
@@ -61,24 +61,18 @@ React on Rails Pro is a **commercial extension** to the open-source [React on Ra
61
61
 
62
62
  ### ShakaCode Trust-Based Commercial Licensing
63
63
 
64
- React on Rails Pro works **without a license token** for evaluation, development, testing, and CI/CD. No registration or license key is needed to get started.
65
-
66
- **A paid license is required only for production deployments.**
67
-
68
- - **Evaluation & Development**: Works out of the box — no license token needed
69
- - **CI/CD**: Works without a license token
70
- - **Production**: Requires a paid license
71
-
72
- ### Paid License (Production)
73
-
74
- - **Duration**: 1 year subscription (or longer)
75
- - **Usage**: Production deployments and commercial applications
76
- - **Support**: Professional support included
77
- - **Contact**: [justin@shakacode.com](mailto:justin@shakacode.com) for pricing
64
+ React on Rails Pro is free in development, test, CI, and staging for everyone,
65
+ and free in production for small organizations (under 10 people, under $1M
66
+ revenue, under $1M raised) and for charities, schools, and hospitals at any
67
+ size. Larger organizations subscribe for production use at
68
+ [pro.reactonrails.com](https://pro.reactonrails.com/): $1,800 per year covers
69
+ the whole organization. No license key is needed to run it; a key from your
70
+ subscription only marks your pages `Licensed`. See
71
+ [the license](https://github.com/shakacode/react_on_rails/blob/main/REACT-ON-RAILS-PRO-LICENSE.md).
78
72
 
79
73
  ### License Setup
80
74
 
81
- Once you have a paid license, configure it through Rails credentials:
75
+ If your organization subscribes, configure its optional key through Rails credentials:
82
76
 
83
77
  ```ruby
84
78
  ReactOnRailsPro.configure do |config|
@@ -195,7 +189,8 @@ High-performance standalone Node.js server for server-side rendering with connec
195
189
 
196
190
  - **Parallel rendering**: Multiple worker processes for concurrent SSR
197
191
  - **Memory management**: Automatic worker restarts to prevent leaks
198
- - **Better performance**: Up to 10x faster than ExecJS for high-traffic sites
192
+ - **Workload-dependent performance**: Persistent worker processes support concurrent SSR;
193
+ [benchmark your own pages](../docs/oss/core-concepts/performance-benchmarks.md) rather than relying on a headline multiple
199
194
  - **Loadable Components**: Full support for code splitting with SSR
200
195
 
201
196
  **Example Configuration:**
@@ -290,7 +285,10 @@ end
290
285
 
291
286
  ### Quick Start
292
287
 
293
- **No license token is required to get started.** React on Rails Pro runs freely for evaluation, development, and testing. A paid license is only needed for production deployments.
288
+ Free in development, test, CI, and staging, and in production for small
289
+ organizations, charities, schools, and hospitals; larger organizations
290
+ subscribe at https://pro.reactonrails.com/ ($1,800 per year per organization).
291
+ No license key is needed to run Pro.
294
292
 
295
293
  **1. Install the Gem**
296
294
 
@@ -412,7 +410,7 @@ Check out these production applications using React on Rails Pro:
412
410
  ### Getting Help
413
411
 
414
412
  - **📧 Email Support**: [support@shakacode.com](mailto:support@shakacode.com)
415
- - **💼 Sales & Licensing**: [justin@shakacode.com](mailto:justin@shakacode.com)
413
+ - **💼 Sales & Licensing**: [contact@shakacode.com](mailto:contact@shakacode.com)
416
414
  - **📖 Documentation**: [docs/pro/](../docs/pro/)
417
415
  - **🐛 Found a Bug?**: Email [support@shakacode.com](mailto:support@shakacode.com) (for Pro customers)
418
416
 
@@ -446,11 +444,16 @@ React on Rails Pro is developed and maintained by [ShakaCode](https://www.shakac
446
444
 
447
445
  **Q: Do I need a license to try React on Rails Pro?**
448
446
 
449
- A: No! Under ShakaCode Trust-Based Commercial Licensing, React on Rails Pro works without a license token for evaluation, development, testing, and CI/CD. A paid license is only required for production deployments.
447
+ A: No. React on Rails Pro is free in development, test, CI, and staging, and in
448
+ production for small organizations, charities, schools, and hospitals. Larger
449
+ organizations subscribe for production use. No license key is needed to run
450
+ Pro.
450
451
 
451
- **Q: How much does a production license cost?**
452
+ **Q: How much does a production subscription cost?**
452
453
 
453
- A: Pricing is customized based on your needs. Contact [justin@shakacode.com](mailto:justin@shakacode.com) for a quote.
454
+ A: A subscription costs $1,800 per year per organization and covers every
455
+ application, environment, and developer. Subscribe at
456
+ [pro.reactonrails.com](https://pro.reactonrails.com/).
454
457
 
455
458
  ### Technical Questions
456
459
 
@@ -497,11 +500,11 @@ A: Check the [CHANGELOG](./CHANGELOG.md) for breaking changes and migration step
497
500
 
498
501
  **Q: Where do I start?**
499
502
 
500
- A: Follow our [Quick Start guide](#-getting-started) — no license token needed to get started!
503
+ A: Follow our [Quick Start guide](#-getting-started). No license key is needed to run Pro.
501
504
 
502
505
  **Q: Can I try Pro before buying?**
503
506
 
504
- A: Yes! React on Rails Pro works without a license token for evaluation and development. Just install and start using it.
507
+ A: Yes. Development, test, CI, staging, and a 45-day production evaluation are free for every organization. Just install and start using it.
505
508
 
506
509
  **Q: Is there a demo application?**
507
510
 
@@ -511,13 +514,15 @@ A: Yes! The [spec/dummy](./spec/dummy) app demonstrates all Pro features. [See e
511
514
 
512
515
  ## 📄 License
513
516
 
514
- React on Rails Pro is commercial software under ShakaCode Trust-Based Commercial Licensing. See [LICENSE](./LICENSE) for the complete license agreement.
515
-
516
- **Summary**:
517
+ React on Rails Pro is free in development, test, CI, and staging for everyone,
518
+ and free in production for small organizations (under 10 people, under $1M
519
+ revenue, under $1M raised) and for charities, schools, and hospitals at any
520
+ size. Larger organizations subscribe for production use at
521
+ [pro.reactonrails.com](https://pro.reactonrails.com/): $1,800 per year covers
522
+ the whole organization. No license key is needed to run it; a key from your
523
+ subscription only marks your pages `Licensed`. See [the license](./LICENSE).
517
524
 
518
- - ✅ **No license token needed** for evaluation, development, testing, and CI/CD
519
- - 💼 **Paid license required** for production deployments
520
- - 📧 **Questions?** Contact [justin@shakacode.com](mailto:justin@shakacode.com)
525
+ Questions: [contact@shakacode.com](mailto:contact@shakacode.com).
521
526
 
522
527
  ---
523
528
 
@@ -134,8 +134,9 @@ module ReactOnRailsPro
134
134
  prefix = "[React on Rails Pro] #{issue}."
135
135
 
136
136
  if Rails.env.production?
137
- warning = "Production Use of React on Rails Pro requires a valid license. " \
138
- "If this deployment is Production Use, #{action}"
137
+ warning = "React on Rails Pro is free in production for small organizations, charities, schools, " \
138
+ "and hospitals; other organizations need a subscription. " \
139
+ "If that is you, #{action.sub(/\A[A-Z]/, &:downcase)}"
139
140
  Rails.logger.warn "#{prefix} #{warning}"
140
141
  elsif warn_outside_production
141
142
  Rails.logger.warn "#{prefix} #{action}"
@@ -50,10 +50,11 @@ module ReactOnRailsPro
50
50
  ::OpenTelemetry::Context.with_current(@context) do
51
51
  ::OpenTelemetry.propagation.inject(carrier)
52
52
  end
53
+ headers.reject! { |name, _| TRACE_HEADER_NAMES.include?(name.to_s.downcase) }
53
54
  carrier.each do |name, value|
54
55
  next unless TRACE_HEADER_NAMES.include?(name.to_s.downcase)
55
56
 
56
- set_header(headers, name.to_s, value)
57
+ headers << [name.to_s, value]
57
58
  end
58
59
  rescue StandardError
59
60
  nil
@@ -125,12 +126,6 @@ module ReactOnRailsPro
125
126
  rescue StandardError
126
127
  nil
127
128
  end
128
-
129
- def set_header(headers, name, value)
130
- return if headers.any? { |header_name, _| header_name.to_s.casecmp?(name) }
131
-
132
- headers << [name, value]
133
- end
134
129
  end
135
130
 
136
131
  class << self
@@ -671,32 +671,38 @@ module ReactOnRailsPro
671
671
  end
672
672
 
673
673
  def create_connection
674
- url = ReactOnRailsPro.configuration.renderer_url
674
+ config = ReactOnRailsPro.configuration
675
+ url = config.renderer_url
675
676
  Rails.logger.debug do
676
- "[ReactOnRailsPro] Setting up Node Renderer connection to #{url}"
677
+ "[ReactOnRailsPro] Setting up Node Renderer connection to " \
678
+ "#{ReactOnRails::Utils.sanitize_url_for_display(url)}"
677
679
  end
678
680
 
679
681
  ReactOnRailsPro::RendererHttpClient.new(
680
682
  origin: url,
681
- pool_size: ReactOnRailsPro.configuration.renderer_http_pool_size,
682
- connect_timeout: ReactOnRailsPro.configuration.renderer_http_pool_timeout,
683
- read_timeout: ReactOnRailsPro.configuration.ssr_timeout,
684
- force_http2: ReactOnRailsPro.configuration.renderer_http_force_http2
683
+ pool_size: config.renderer_http_pool_size,
684
+ connect_timeout: config.renderer_http_pool_timeout,
685
+ read_timeout: config.ssr_timeout,
686
+ force_http2: config.renderer_http_force_http2
685
687
  )
686
688
  rescue StandardError => e
687
- message = <<~MSG
689
+ raise ReactOnRailsPro::Error, create_connection_error_message(url, e)
690
+ end
691
+
692
+ def create_connection_error_message(url, error)
693
+ config = ReactOnRailsPro.configuration
694
+ <<~MSG
688
695
  [ReactOnRailsPro] Error creating async-http connection.
689
- renderer_http_pool_size = #{ReactOnRailsPro.configuration.renderer_http_pool_size}
690
- renderer_http_pool_timeout = #{ReactOnRailsPro.configuration.renderer_http_pool_timeout}
691
- renderer_http_pool_warn_timeout = #{ReactOnRailsPro.configuration.renderer_http_pool_warn_timeout}
692
- renderer_http_keep_alive_timeout = #{ReactOnRailsPro.configuration.renderer_http_keep_alive_timeout}
693
- renderer_http_force_http2 = #{ReactOnRailsPro.configuration.renderer_http_force_http2}
694
- renderer_url = #{url}
696
+ renderer_http_pool_size = #{config.renderer_http_pool_size}
697
+ renderer_http_pool_timeout = #{config.renderer_http_pool_timeout}
698
+ renderer_http_pool_warn_timeout = #{config.renderer_http_pool_warn_timeout}
699
+ renderer_http_keep_alive_timeout = #{config.renderer_http_keep_alive_timeout}
700
+ renderer_http_force_http2 = #{config.renderer_http_force_http2}
701
+ renderer_url = #{ReactOnRails::Utils.sanitize_url_for_display(url)}
695
702
  Be sure to use a url that contains the protocol of http or https.
696
703
  Original error is
697
- #{e}
704
+ #{ReactOnRails::Utils.sanitize_error_text(error.message)}
698
705
  MSG
699
- raise ReactOnRailsPro::Error, message
700
706
  end
701
707
 
702
708
  def get_form_body_for_file(path)
@@ -171,7 +171,15 @@ module ReactOnRailsPro
171
171
 
172
172
  FileUtils.rm_rf(dir)
173
173
  FileUtils.mkdir_p(dir)
174
- result = download_from_origin(candidate[:base], bundle_hash, dir:, deadline:)
174
+ begin
175
+ result = download_from_origin(candidate[:base], bundle_hash, dir:, deadline:)
176
+ rescue StandardError => e
177
+ Rails.logger.warn(
178
+ "#{LOG_PREFIX} candidate #{candidate[:base]} failed: #{e.class}: #{e.message}; " \
179
+ "continuing with remaining candidates while time allows."
180
+ )
181
+ next
182
+ end
175
183
  next unless result
176
184
  next unless acceptable_payload?(candidate, result, bundle_hash)
177
185
 
@@ -14,6 +14,6 @@
14
14
  # https://github.com/shakacode/react_on_rails/blob/main/REACT-ON-RAILS-PRO-LICENSE.md
15
15
 
16
16
  module ReactOnRailsPro
17
- VERSION = "17.1.0.rc.5"
17
+ VERSION = "17.2.0.rc.0"
18
18
  PROTOCOL_VERSION = "2.0.0"
19
19
  end
@@ -56,7 +56,8 @@ namespace :react_on_rails_pro do # rubocop:disable Metrics/BlockLength
56
56
 
57
57
  desc "Copy assets to remote node-renderer"
58
58
  task copy_assets_to_remote_vm_renderer: :environment do
59
- puts "[ReactOnRailsPro] Copying assets to remote node-renderer #{ReactOnRailsPro.configuration.renderer_url}"
59
+ puts "[ReactOnRailsPro] Copying assets to remote node-renderer " \
60
+ "#{ReactOnRails::Utils.sanitize_url_for_display(ReactOnRailsPro.configuration.renderer_url)}"
60
61
  ReactOnRailsPro::Request.upload_assets
61
62
  end
62
63
  end
@@ -30,7 +30,7 @@ Gem::Specification.new do |s|
30
30
  s.summary = "Rails with react server rendering with webpack. Performance helpers"
31
31
  s.description = "See README.md"
32
32
  s.homepage = "https://reactonrails.com/docs/pro/"
33
- s.license = "LicenseRef-LICENSE"
33
+ s.license = "LicenseRef-ReactOnRailsPro"
34
34
  s.metadata["rubygems_mfa_required"] = "true"
35
35
  s.metadata["bug_tracker_uri"] = "https://github.com/shakacode/react_on_rails/issues"
36
36
  s.metadata["changelog_uri"] = "https://github.com/shakacode/react_on_rails/blob/main/CHANGELOG.md"
@@ -55,7 +55,9 @@ Gem::Specification.new do |s|
55
55
  s.add_runtime_dependency "io-endpoint", "~> 0.17.0"
56
56
  # Pro's only JWT call site (LicenseValidator) pins algorithm: "RS256" with
57
57
  # public-key verification, which is safe on jwt 2.x as well as 3.x.
58
- s.add_runtime_dependency "jwt", ">= 2.5", "< 4"
58
+ # jwt 2.8 first declares `base64` as a runtime dependency. This keeps offline
59
+ # license validation reliable on Ruby 3.4+, where base64 is a bundled gem.
60
+ s.add_runtime_dependency "jwt", ">= 2.8", "< 4"
59
61
  s.add_runtime_dependency "nokogiri", ">= 1.12", "< 2"
60
62
  s.add_runtime_dependency "react_on_rails", ReactOnRails::VERSION
61
63
  # rubocop:disable Gemspec/DevelopmentDependencies
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: react_on_rails_pro
3
3
  version: !ruby/object:Gem::Version
4
- version: 17.1.0.rc.5
4
+ version: 17.2.0.rc.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Gordon
@@ -71,7 +71,7 @@ dependencies:
71
71
  requirements:
72
72
  - - ">="
73
73
  - !ruby/object:Gem::Version
74
- version: '2.5'
74
+ version: '2.8'
75
75
  - - "<"
76
76
  - !ruby/object:Gem::Version
77
77
  version: '4'
@@ -81,7 +81,7 @@ dependencies:
81
81
  requirements:
82
82
  - - ">="
83
83
  - !ruby/object:Gem::Version
84
- version: '2.5'
84
+ version: '2.8'
85
85
  - - "<"
86
86
  - !ruby/object:Gem::Version
87
87
  version: '4'
@@ -111,14 +111,14 @@ dependencies:
111
111
  requirements:
112
112
  - - '='
113
113
  - !ruby/object:Gem::Version
114
- version: 17.1.0.rc.5
114
+ version: 17.2.0.rc.0
115
115
  type: :runtime
116
116
  prerelease: false
117
117
  version_requirements: !ruby/object:Gem::Requirement
118
118
  requirements:
119
119
  - - '='
120
120
  - !ruby/object:Gem::Version
121
- version: 17.1.0.rc.5
121
+ version: 17.2.0.rc.0
122
122
  - !ruby/object:Gem::Dependency
123
123
  name: bundler
124
124
  requirement: !ruby/object:Gem::Requirement
@@ -297,7 +297,7 @@ files:
297
297
  - sig/react_on_rails_pro/utils.rbs
298
298
  homepage: https://reactonrails.com/docs/pro/
299
299
  licenses:
300
- - LicenseRef-LICENSE
300
+ - LicenseRef-ReactOnRailsPro
301
301
  metadata:
302
302
  rubygems_mfa_required: 'true'
303
303
  bug_tracker_uri: https://github.com/shakacode/react_on_rails/issues