Add reactive ERB components - #1
Merged
Merged
Conversation
cardmagic
marked this pull request as ready for review
August 7, 2026 01:10
cardmagic
marked this pull request as draft
August 7, 2026 01:11
Owner
Author
cardmagic
marked this pull request as ready for review
August 7, 2026 01:15
Greptile SummaryThe PR adds dependency-driven reactive ERB components that refresh through an authorized request-time endpoint while retaining durable actor invalidations and revision ordering.
Confidence Score: 5/5The PR appears safe to merge. No blocking failure remains. Important Files Changed
Reviews (2): Last reviewed commit: "Preserve component authorization" | Re-trigger Greptile |
Owner
Author
Finalize the reactive component release version, changelog, lockfile, and status language so the package and documentation describe the same artifact.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changed
actor.component(..., observes:)rendering for collections, conditionals, nested ERB, and personalized contentstate_revisionatomically with fenced actor state, message completion, and broadcast outbox rowsWhy
Scalar observable replacement escaped arrays and hashes as JSON, while component partials rendered only once. Rendering personalized HTML into a shared durable broadcast would cross subscriber authorization boundaries. This design keeps the database row as the committed source of truth and broadcasts invalidation metadata; each browser refreshes with its normal request cookies and is reauthorized before host ERB is rendered.
Security and correctness
actors/<actor_class>/_<component>and can read only declared observablesprivate, no-storeand never enters an outbox row or shared Cable payloadstate_revisionor enqueue invalidations(instance_id, state_revision)rejects older invalidations and distinguishes destroy/recreate incarnationsMigration
Adds the portable, non-null
solid_objects_instances.state_revisionbigint with a default of0. Successful fenced commits advance it to the actor message sequence.Validation
bundle exec rake— 205 runs, 792 assertions; Standard Ruby, RuboCop, RBS validation, Steep, and Brakeman all pass; 0 security warningsSOLID_OBJECTS_DATABASE_URL=postgresql://... bundle exec rake testagainst PostgreSQL 18 — 205 runs, 792 assertions, 0 failures/errors/skipsSOLID_OBJECTS_DATABASE_URL=mysql2://... bundle exec rake testagainst MySQL 8.4 — 205 runs, 792 assertions, 0 failures/errors/skipsbundle exec ruby -Itest test/integration/example_chat_room_test.rb— 1 run, 9 assertions, 0 failures/errorsgem build solid_objects.gemspec --output /tmp/solid_objects-reactive-erb.gem— builtsolid_objects0.3.0 successfullyFollow-up
Turbo append intents and expanded full-browser reconnect coverage remain roadmap work; scalar replacement and dependency-driven full component replacement are implemented here.