solid_objects 0.2.1 → 0.4.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.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +24 -0
  3. data/README.md +261 -31
  4. data/app/controllers/solid_objects/components_controller.rb +78 -0
  5. data/app/helpers/solid_objects/actor_helper.rb +13 -4
  6. data/config/routes.rb +1 -0
  7. data/db/migrate/20260806000000_add_state_revision_to_solid_objects_instances.rb +12 -0
  8. data/docs/architecture.md +116 -23
  9. data/docs/authorization.md +53 -3
  10. data/docs/benchmarks.md +6 -2
  11. data/docs/correctness.md +45 -1
  12. data/docs/database-schema.md +18 -5
  13. data/docs/development.md +40 -0
  14. data/docs/fit.md +10 -2
  15. data/docs/migrating-existing-state.md +8 -1
  16. data/docs/operations.md +74 -36
  17. data/docs/realtime.md +106 -12
  18. data/docs/roadmap.md +14 -7
  19. data/docs/security.md +25 -3
  20. data/docs/state-migrations.md +2 -0
  21. data/examples/application/README.md +5 -4
  22. data/examples/application/app/views/actors/chat_room_actor/_messages.html.erb +1 -1
  23. data/examples/application/app/views/chat_rooms/show.html.erb +2 -2
  24. data/examples/application/config/initializers/solid_objects.rb +9 -3
  25. data/lib/generators/solid_objects/templates/solid_objects.rb +33 -2
  26. data/lib/solid_objects/activation.rb +33 -4
  27. data/lib/solid_objects/actor.rb +58 -6
  28. data/lib/solid_objects/actor_channel.rb +73 -5
  29. data/lib/solid_objects/actor_definition.rb +2 -0
  30. data/lib/solid_objects/actor_snapshot.rb +35 -10
  31. data/lib/solid_objects/actor_view.rb +103 -10
  32. data/lib/solid_objects/application_write_guard.rb +24 -0
  33. data/lib/solid_objects/caller_process.rb +28 -0
  34. data/lib/solid_objects/cli.rb +44 -5
  35. data/lib/solid_objects/client.rb +98 -5
  36. data/lib/solid_objects/commit_action_registry.rb +42 -0
  37. data/lib/solid_objects/component_path_resolver.rb +27 -0
  38. data/lib/solid_objects/component_registration.rb +117 -0
  39. data/lib/solid_objects/component_renderer.rb +82 -0
  40. data/lib/solid_objects/component_subscriptions.rb +109 -0
  41. data/lib/solid_objects/component_token.rb +139 -0
  42. data/lib/solid_objects/component_view.rb +67 -0
  43. data/lib/solid_objects/configuration.rb +39 -1
  44. data/lib/solid_objects/database_adapter.rb +28 -1
  45. data/lib/solid_objects/database_adapters/mysql.rb +46 -0
  46. data/lib/solid_objects/database_adapters/postgresql.rb +29 -0
  47. data/lib/solid_objects/database_adapters/sqlite.rb +40 -0
  48. data/lib/solid_objects/errors.rb +156 -0
  49. data/lib/solid_objects/executor.rb +65 -4
  50. data/lib/solid_objects/instance_pruner.rb +97 -0
  51. data/lib/solid_objects/message_pruner.rb +97 -0
  52. data/lib/solid_objects/message_reference.rb +9 -0
  53. data/lib/solid_objects/process_pruner.rb +49 -0
  54. data/lib/solid_objects/reference.rb +5 -0
  55. data/lib/solid_objects/state_snapshot.rb +41 -0
  56. data/lib/solid_objects/stream_token.rb +32 -13
  57. data/lib/solid_objects/sync_deadline.rb +57 -0
  58. data/lib/solid_objects/sync_diagnostics.rb +133 -0
  59. data/lib/solid_objects/synchronous_invocation.rb +26 -7
  60. data/lib/solid_objects/test_helper.rb +78 -0
  61. data/lib/solid_objects/turbo_stream_renderer.rb +45 -1
  62. data/lib/solid_objects/version.rb +1 -1
  63. data/lib/solid_objects/worker.rb +1 -1
  64. data/lib/solid_objects.rb +40 -0
  65. data/sig/generated/controllers/solid_objects/components_controller.rbs +22 -0
  66. data/sig/generated/lib/solid_objects/activation.rbs +3 -0
  67. data/sig/generated/lib/solid_objects/actor.rbs +29 -0
  68. data/sig/generated/lib/solid_objects/actor_channel.rbs +20 -0
  69. data/sig/generated/lib/solid_objects/actor_snapshot.rbs +17 -0
  70. data/sig/generated/lib/solid_objects/actor_view.rbs +31 -2
  71. data/sig/generated/lib/solid_objects/application_write_guard.rbs +8 -0
  72. data/sig/generated/lib/solid_objects/caller_process.rbs +11 -0
  73. data/sig/generated/lib/solid_objects/cli.rbs +11 -2
  74. data/sig/generated/lib/solid_objects/client.rbs +15 -0
  75. data/sig/generated/lib/solid_objects/commit_action_registry.rbs +43 -0
  76. data/sig/generated/lib/solid_objects/component_path_resolver.rbs +13 -0
  77. data/sig/generated/lib/solid_objects/component_registration.rbs +51 -0
  78. data/sig/generated/lib/solid_objects/component_renderer.rbs +39 -0
  79. data/sig/generated/lib/solid_objects/component_subscriptions.rbs +40 -0
  80. data/sig/generated/lib/solid_objects/component_token.rbs +38 -0
  81. data/sig/generated/lib/solid_objects/component_view.rbs +43 -0
  82. data/sig/generated/lib/solid_objects/configuration.rbs +35 -7
  83. data/sig/generated/lib/solid_objects/database_adapter.rbs +9 -0
  84. data/sig/generated/lib/solid_objects/database_adapters/mysql.rbs +8 -0
  85. data/sig/generated/lib/solid_objects/database_adapters/postgresql.rbs +8 -0
  86. data/sig/generated/lib/solid_objects/database_adapters/sqlite.rbs +13 -0
  87. data/sig/generated/lib/solid_objects/errors.rbs +130 -0
  88. data/sig/generated/lib/solid_objects/executor.rbs +12 -0
  89. data/sig/generated/lib/solid_objects/instance_pruner.rbs +36 -0
  90. data/sig/generated/lib/solid_objects/message_pruner.rbs +42 -0
  91. data/sig/generated/lib/solid_objects/message_reference.rbs +3 -0
  92. data/sig/generated/lib/solid_objects/process_pruner.rbs +27 -0
  93. data/sig/generated/lib/solid_objects/reference.rbs +3 -0
  94. data/sig/generated/lib/solid_objects/state_snapshot.rbs +30 -0
  95. data/sig/generated/lib/solid_objects/stream_token.rbs +9 -4
  96. data/sig/generated/lib/solid_objects/sync_deadline.rbs +31 -0
  97. data/sig/generated/lib/solid_objects/sync_diagnostics.rbs +34 -0
  98. data/sig/generated/lib/solid_objects/synchronous_invocation.rbs +3 -0
  99. data/sig/generated/lib/solid_objects/test_helper.rbs +25 -0
  100. data/sig/generated/lib/solid_objects/turbo_stream_renderer.rbs +10 -0
  101. data/sig/generated/lib/solid_objects.rbs +12 -0
  102. metadata +34 -1
@@ -0,0 +1,30 @@
1
+ # Generated from lib/solid_objects/state_snapshot.rb with RBS::Inline
2
+
3
+ module SolidObjects
4
+ class StateSnapshot
5
+ @actor_class: Class
6
+
7
+ @data: Hash[String, untyped]
8
+
9
+ # @rbs (Reference) -> void
10
+ def initialize: (Reference) -> void
11
+
12
+ # @rbs () -> Hash[String, untyped]
13
+ def to_h: () -> Hash[String, untyped]
14
+
15
+ # @rbs (Symbol, *untyped, **untyped) -> untyped
16
+ def method_missing: (Symbol, *untyped, **untyped) -> untyped
17
+
18
+ # @rbs (Symbol, bool) -> bool
19
+ def respond_to_missing?: (Symbol, bool) -> bool
20
+
21
+ private
22
+
23
+ attr_reader actor_class: untyped
24
+
25
+ attr_reader data: untyped
26
+
27
+ # @rbs (Symbol | String) -> bool
28
+ def attribute?: (Symbol | String) -> bool
29
+ end
30
+ end
@@ -4,11 +4,16 @@ module SolidObjects
4
4
  module StreamToken
5
5
  PURPOSE: ::String
6
6
 
7
- # @rbs (Reference) -> String
8
- def self?.generate: (Reference) -> String
7
+ MAXIMUM_OBSERVABLES: ::Integer
9
8
 
10
- # @rbs (String) -> Hash[String, String]
11
- def self?.verify: (String) -> Hash[String, String]
9
+ # @rbs (Reference, ?observables: Array[String]?) -> String
10
+ def self?.generate: (Reference, ?observables: Array[String]?) -> String
11
+
12
+ # @rbs (String) -> Hash[String, untyped]
13
+ def self?.verify: (String) -> Hash[String, untyped]
14
+
15
+ # @rbs (Hash[String, untyped]) -> Hash[String, untyped]
16
+ def self?.validate_identity!: (Hash[String, untyped]) -> Hash[String, untyped]
12
17
 
13
18
  # @rbs () -> ActiveSupport::MessageVerifier
14
19
  def self?.verifier: () -> ActiveSupport::MessageVerifier
@@ -0,0 +1,31 @@
1
+ # Generated from lib/solid_objects/sync_deadline.rb with RBS::Inline
2
+
3
+ module SolidObjects
4
+ class SyncDeadline
5
+ KEY: ::Symbol
6
+
7
+ # @rbs (timeout: Numeric) { () -> untyped } -> untyped
8
+ def self.with: (timeout: Numeric) { () -> untyped } -> untyped
9
+
10
+ # @rbs () -> bool
11
+ def self.active?: () -> bool
12
+
13
+ # @rbs () -> bool
14
+ def self.expired?: () -> bool
15
+
16
+ # @rbs () -> Float
17
+ def self.remaining: () -> Float
18
+
19
+ # @rbs () -> Integer
20
+ def self.remaining_milliseconds: () -> Integer
21
+
22
+ # @rbs () -> Integer
23
+ def self.remaining_seconds: () -> Integer
24
+
25
+ # @rbs () -> Float?
26
+ private def self.deadline: () -> Float?
27
+
28
+ # @rbs () -> Float
29
+ private def self.monotonic_now: () -> Float
30
+ end
31
+ end
@@ -0,0 +1,34 @@
1
+ # Generated from lib/solid_objects/sync_diagnostics.rb with RBS::Inline
2
+
3
+ module SolidObjects
4
+ class SyncDiagnostics
5
+ # @rbs (Message, timeout: Numeric) -> SyncTimeout
6
+ def call: (Message, timeout: Numeric) -> SyncTimeout
7
+
8
+ private
9
+
10
+ # @rbs (Message) -> String
11
+ def message_status: (Message) -> String
12
+
13
+ # @rbs (Message, Instance, Message?) -> String
14
+ def waiting_reason: (Message, Instance, Message?) -> String
15
+
16
+ # @rbs (ReadyMessage?) -> bool
17
+ def future?: (ReadyMessage?) -> bool
18
+
19
+ # @rbs (Instance) -> bool
20
+ def live_activation?: (Instance) -> bool
21
+
22
+ # @rbs (Message) -> Message?
23
+ def earlier_blocker: (Message) -> Message?
24
+
25
+ # @rbs (Instance) -> Hash[String, untyped]
26
+ def activation_details: (Instance) -> Hash[String, untyped]
27
+
28
+ # @rbs (Process?) -> Hash[String, untyped]?
29
+ def process_details: (Process?) -> Hash[String, untyped]?
30
+
31
+ # @rbs (Message?) -> Hash[String, untyped]?
32
+ def blocker_details: (Message?) -> Hash[String, untyped]?
33
+ end
34
+ end
@@ -7,6 +7,9 @@ module SolidObjects
7
7
 
8
8
  private
9
9
 
10
+ # @rbs (MessageReference, timeout: Numeric) -> untyped
11
+ def call_before_deadline: (MessageReference, timeout: Numeric) -> untyped
12
+
10
13
  # @rbs (MessageReference) -> Message
11
14
  def load_message: (MessageReference) -> Message
12
15
 
@@ -0,0 +1,25 @@
1
+ # Generated from lib/solid_objects/test_helper.rb with RBS::Inline
2
+
3
+ module SolidObjects
4
+ module TestHelper
5
+ # @rbs (Class) -> void
6
+ def self.included: (Class) -> void
7
+
8
+ # @rbs () -> void
9
+ def self.reset_actors!: () -> void
10
+
11
+ # @rbs () -> void
12
+ def reset_actors!: () -> void
13
+
14
+ # @rbs (?roles: Array[Symbol], ?max_passes: Integer) -> Integer
15
+ def drain_solid_objects: (?roles: Array[Symbol], ?max_passes: Integer) -> Integer
16
+
17
+ private
18
+
19
+ # @rbs (Array[Symbol]) -> Array[Worker | EffectExecutor | ReminderScheduler | BroadcastExecutor]
20
+ def build_solid_objects_runners: (Array[Symbol]) -> Array[Worker | EffectExecutor | ReminderScheduler | BroadcastExecutor]
21
+
22
+ # @rbs (Worker | EffectExecutor | ReminderScheduler | BroadcastExecutor) -> Integer
23
+ def solid_objects_runner_result: (Worker | EffectExecutor | ReminderScheduler | BroadcastExecutor) -> Integer
24
+ end
25
+ end
@@ -2,12 +2,22 @@
2
2
 
3
3
  module SolidObjects
4
4
  module TurboStreamRenderer
5
+ INVALIDATION_MARKER: ::String
6
+
7
+ INVALIDATION_PATTERN: ::Regexp
8
+
5
9
  # @rbs (Broadcast) -> String
6
10
  def self?.observable: (Broadcast) -> String
7
11
 
8
12
  # @rbs (Reference, Symbol | String, untyped) -> String
9
13
  def self?.observable_value: (Reference, Symbol | String, untyped) -> String
10
14
 
15
+ # @rbs (ComponentRegistration, Integer, Integer) -> String
16
+ def self?.component_refresh: (ComponentRegistration, Integer, Integer) -> String
17
+
18
+ # @rbs (String) -> Hash[String, untyped]?
19
+ def self?.invalidation: (String) -> Hash[String, untyped]?
20
+
11
21
  # @rbs (untyped) -> String
12
22
  def self?.display_value: (untyped) -> String
13
23
  end
@@ -18,12 +18,21 @@ module SolidObjects
18
18
  # @rbs (String | Symbol) { (Hash[String, untyped], EffectContext) -> untyped } -> Proc
19
19
  def self.register_effect: (String | Symbol) { (Hash[String, untyped], EffectContext) -> untyped } -> Proc
20
20
 
21
+ # @rbs () -> CommitActionRegistry
22
+ def self.commit_action_registry: () -> CommitActionRegistry
23
+
24
+ # @rbs (String | Symbol) { (Hash[String, untyped], CommitActionContext) -> untyped } -> Proc
25
+ def self.register_commit_action: (String | Symbol) { (Hash[String, untyped], CommitActionContext) -> untyped } -> Proc
26
+
21
27
  # @rbs () -> Client
22
28
  def self.client: () -> Client
23
29
 
24
30
  # @rbs () -> CallerProcess
25
31
  def self.caller_process: () -> CallerProcess
26
32
 
33
+ # @rbs () -> bool
34
+ def self.reset_caller_process!: () -> bool
35
+
27
36
  # @rbs () -> DeadLetterManager
28
37
  def self.dead_letters: () -> DeadLetterManager
29
38
 
@@ -33,6 +42,9 @@ module SolidObjects
33
42
  # @rbs (String, Class) -> Class
34
43
  def self.register_actor: (String, Class) -> Class
35
44
 
45
+ # @rbs (untyped) -> untyped
46
+ def self.mutable_copy: (untyped) -> untyped
47
+
36
48
  # @rbs () -> void
37
49
  def self.reset!: () -> void
38
50
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solid_objects
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lucas Carlson
@@ -261,6 +261,7 @@ files:
261
261
  - README.md
262
262
  - Rakefile
263
263
  - app/controllers/solid_objects/application_controller.rb
264
+ - app/controllers/solid_objects/components_controller.rb
264
265
  - app/controllers/solid_objects/dead_letters_controller.rb
265
266
  - app/controllers/solid_objects/instances_controller.rb
266
267
  - app/helpers/solid_objects/actor_helper.rb
@@ -290,6 +291,7 @@ files:
290
291
  - benchmark/sync_latency.rb
291
292
  - config/routes.rb
292
293
  - db/migrate/20260805000000_create_solid_objects_tables.rb
294
+ - db/migrate/20260806000000_add_state_revision_to_solid_objects_instances.rb
293
295
  - docs/adr/0001-postgresql-backend.md
294
296
  - docs/adr/0002-jsonb-actor-state.md
295
297
  - docs/adr/0003-mailbox-ordering.md
@@ -342,10 +344,18 @@ files:
342
344
  - lib/solid_objects/actor_registry.rb
343
345
  - lib/solid_objects/actor_snapshot.rb
344
346
  - lib/solid_objects/actor_view.rb
347
+ - lib/solid_objects/application_write_guard.rb
345
348
  - lib/solid_objects/broadcast_executor.rb
346
349
  - lib/solid_objects/caller_process.rb
347
350
  - lib/solid_objects/cli.rb
348
351
  - lib/solid_objects/client.rb
352
+ - lib/solid_objects/commit_action_registry.rb
353
+ - lib/solid_objects/component_path_resolver.rb
354
+ - lib/solid_objects/component_registration.rb
355
+ - lib/solid_objects/component_renderer.rb
356
+ - lib/solid_objects/component_subscriptions.rb
357
+ - lib/solid_objects/component_token.rb
358
+ - lib/solid_objects/component_view.rb
349
359
  - lib/solid_objects/configuration.rb
350
360
  - lib/solid_objects/context.rb
351
361
  - lib/solid_objects/database_adapter.rb
@@ -360,27 +370,35 @@ files:
360
370
  - lib/solid_objects/engine.rb
361
371
  - lib/solid_objects/errors.rb
362
372
  - lib/solid_objects/executor.rb
373
+ - lib/solid_objects/instance_pruner.rb
363
374
  - lib/solid_objects/instrumentation.rb
364
375
  - lib/solid_objects/lease.rb
365
376
  - lib/solid_objects/lease_renewer.rb
366
377
  - lib/solid_objects/log_subscriber.rb
367
378
  - lib/solid_objects/mailbox.rb
379
+ - lib/solid_objects/message_pruner.rb
368
380
  - lib/solid_objects/message_reference.rb
381
+ - lib/solid_objects/process_pruner.rb
369
382
  - lib/solid_objects/process_registry.rb
370
383
  - lib/solid_objects/reference.rb
371
384
  - lib/solid_objects/reminder_scheduler.rb
372
385
  - lib/solid_objects/serialization.rb
373
386
  - lib/solid_objects/state.rb
387
+ - lib/solid_objects/state_snapshot.rb
374
388
  - lib/solid_objects/stream_name.rb
375
389
  - lib/solid_objects/stream_token.rb
376
390
  - lib/solid_objects/supervisor.rb
391
+ - lib/solid_objects/sync_deadline.rb
392
+ - lib/solid_objects/sync_diagnostics.rb
377
393
  - lib/solid_objects/synchronous_invocation.rb
394
+ - lib/solid_objects/test_helper.rb
378
395
  - lib/solid_objects/turbo_stream_renderer.rb
379
396
  - lib/solid_objects/version.rb
380
397
  - lib/solid_objects/wake_up.rb
381
398
  - lib/solid_objects/worker.rb
382
399
  - lib/tasks/solid_objects_tasks.rake
383
400
  - sig/generated/controllers/solid_objects/application_controller.rbs
401
+ - sig/generated/controllers/solid_objects/components_controller.rbs
384
402
  - sig/generated/controllers/solid_objects/dead_letters_controller.rbs
385
403
  - sig/generated/controllers/solid_objects/instances_controller.rbs
386
404
  - sig/generated/helpers/solid_objects/actor_helper.rbs
@@ -395,10 +413,18 @@ files:
395
413
  - sig/generated/lib/solid_objects/actor_registry.rbs
396
414
  - sig/generated/lib/solid_objects/actor_snapshot.rbs
397
415
  - sig/generated/lib/solid_objects/actor_view.rbs
416
+ - sig/generated/lib/solid_objects/application_write_guard.rbs
398
417
  - sig/generated/lib/solid_objects/broadcast_executor.rbs
399
418
  - sig/generated/lib/solid_objects/caller_process.rbs
400
419
  - sig/generated/lib/solid_objects/cli.rbs
401
420
  - sig/generated/lib/solid_objects/client.rbs
421
+ - sig/generated/lib/solid_objects/commit_action_registry.rbs
422
+ - sig/generated/lib/solid_objects/component_path_resolver.rbs
423
+ - sig/generated/lib/solid_objects/component_registration.rbs
424
+ - sig/generated/lib/solid_objects/component_renderer.rbs
425
+ - sig/generated/lib/solid_objects/component_subscriptions.rbs
426
+ - sig/generated/lib/solid_objects/component_token.rbs
427
+ - sig/generated/lib/solid_objects/component_view.rbs
402
428
  - sig/generated/lib/solid_objects/configuration.rbs
403
429
  - sig/generated/lib/solid_objects/context.rbs
404
430
  - sig/generated/lib/solid_objects/database_adapter.rbs
@@ -413,21 +439,28 @@ files:
413
439
  - sig/generated/lib/solid_objects/engine.rbs
414
440
  - sig/generated/lib/solid_objects/errors.rbs
415
441
  - sig/generated/lib/solid_objects/executor.rbs
442
+ - sig/generated/lib/solid_objects/instance_pruner.rbs
416
443
  - sig/generated/lib/solid_objects/instrumentation.rbs
417
444
  - sig/generated/lib/solid_objects/lease.rbs
418
445
  - sig/generated/lib/solid_objects/lease_renewer.rbs
419
446
  - sig/generated/lib/solid_objects/log_subscriber.rbs
420
447
  - sig/generated/lib/solid_objects/mailbox.rbs
448
+ - sig/generated/lib/solid_objects/message_pruner.rbs
421
449
  - sig/generated/lib/solid_objects/message_reference.rbs
450
+ - sig/generated/lib/solid_objects/process_pruner.rbs
422
451
  - sig/generated/lib/solid_objects/process_registry.rbs
423
452
  - sig/generated/lib/solid_objects/reference.rbs
424
453
  - sig/generated/lib/solid_objects/reminder_scheduler.rbs
425
454
  - sig/generated/lib/solid_objects/serialization.rbs
426
455
  - sig/generated/lib/solid_objects/state.rbs
456
+ - sig/generated/lib/solid_objects/state_snapshot.rbs
427
457
  - sig/generated/lib/solid_objects/stream_name.rbs
428
458
  - sig/generated/lib/solid_objects/stream_token.rbs
429
459
  - sig/generated/lib/solid_objects/supervisor.rbs
460
+ - sig/generated/lib/solid_objects/sync_deadline.rbs
461
+ - sig/generated/lib/solid_objects/sync_diagnostics.rbs
430
462
  - sig/generated/lib/solid_objects/synchronous_invocation.rbs
463
+ - sig/generated/lib/solid_objects/test_helper.rbs
431
464
  - sig/generated/lib/solid_objects/turbo_stream_renderer.rbs
432
465
  - sig/generated/lib/solid_objects/version.rbs
433
466
  - sig/generated/lib/solid_objects/wake_up.rbs