solid_objects 0.1.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 (178) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +17 -0
  3. data/MIT-LICENSE +19 -0
  4. data/README.md +744 -0
  5. data/Rakefile +40 -0
  6. data/app/controllers/solid_objects/application_controller.rb +23 -0
  7. data/app/controllers/solid_objects/dead_letters_controller.rb +23 -0
  8. data/app/controllers/solid_objects/instances_controller.rb +29 -0
  9. data/app/helpers/solid_objects/actor_helper.rb +25 -0
  10. data/app/models/solid_objects/broadcast.rb +10 -0
  11. data/app/models/solid_objects/claimed_message.rb +14 -0
  12. data/app/models/solid_objects/dead_letter.rb +13 -0
  13. data/app/models/solid_objects/effect.rb +10 -0
  14. data/app/models/solid_objects/instance.rb +93 -0
  15. data/app/models/solid_objects/message.rb +53 -0
  16. data/app/models/solid_objects/process.rb +13 -0
  17. data/app/models/solid_objects/ready_message.rb +10 -0
  18. data/app/models/solid_objects/record.rb +17 -0
  19. data/app/models/solid_objects/reminder.rb +9 -0
  20. data/app/views/solid_objects/dead_letters/index.html.erb +26 -0
  21. data/app/views/solid_objects/instances/index.html.erb +24 -0
  22. data/app/views/solid_objects/instances/show.html.erb +35 -0
  23. data/benchmark/activation_cache.rb +5 -0
  24. data/benchmark/ask_latency.rb +5 -0
  25. data/benchmark/claim.rb +5 -0
  26. data/benchmark/cold_actors.rb +5 -0
  27. data/benchmark/concurrent_actors.rb +5 -0
  28. data/benchmark/enqueue.rb +5 -0
  29. data/benchmark/hot_actor.rb +5 -0
  30. data/benchmark/processing.rb +5 -0
  31. data/benchmark/query_count.rb +5 -0
  32. data/benchmark/support.rb +271 -0
  33. data/config/routes.rb +8 -0
  34. data/db/migrate/20260805000000_create_solid_objects_tables.rb +319 -0
  35. data/docs/adr/0001-postgresql-backend.md +21 -0
  36. data/docs/adr/0002-jsonb-actor-state.md +21 -0
  37. data/docs/adr/0003-mailbox-ordering.md +30 -0
  38. data/docs/adr/0004-activation-leasing.md +21 -0
  39. data/docs/adr/0005-fencing-tokens.md +25 -0
  40. data/docs/adr/0006-at-least-once-delivery.md +24 -0
  41. data/docs/adr/0007-transactional-outbox.md +21 -0
  42. data/docs/adr/0008-actor-communication.md +21 -0
  43. data/docs/adr/0009-realtime-updates.md +21 -0
  44. data/docs/adr/0010-state-versioning.md +29 -0
  45. data/docs/adr/0011-wake-up-strategy.md +34 -0
  46. data/docs/adr/0012-not-active-jobs.md +21 -0
  47. data/docs/adr/0013-database-adapters.md +48 -0
  48. data/docs/architecture.md +615 -0
  49. data/docs/benchmarks.md +26 -0
  50. data/docs/correctness.md +124 -0
  51. data/docs/database-schema.md +111 -0
  52. data/docs/development.md +87 -0
  53. data/docs/implementation-plan.md +518 -0
  54. data/docs/operations.md +123 -0
  55. data/docs/realtime.md +51 -0
  56. data/docs/research/solid_queue.md +545 -0
  57. data/docs/roadmap.md +53 -0
  58. data/docs/security.md +61 -0
  59. data/docs/state-migrations.md +46 -0
  60. data/examples/application/README.md +16 -0
  61. data/examples/application/app/actors/chat_room_actor.rb +34 -0
  62. data/examples/application/app/actors/shopping_cart_actor.rb +79 -0
  63. data/examples/application/app/controllers/cart_controller.rb +54 -0
  64. data/examples/application/app/controllers/chat_rooms_controller.rb +44 -0
  65. data/examples/application/app/views/actors/chat_room_actor/_messages.html.erb +8 -0
  66. data/examples/application/app/views/actors/shopping_cart_actor/_summary.html.erb +10 -0
  67. data/examples/application/app/views/cart/show.html.erb +13 -0
  68. data/examples/application/app/views/chat_rooms/show.html.erb +8 -0
  69. data/examples/application/config/initializers/solid_objects.rb +23 -0
  70. data/examples/application/config/routes.rb +20 -0
  71. data/exe/solid_objects +9 -0
  72. data/lib/generators/solid_objects/install_generator.rb +21 -0
  73. data/lib/generators/solid_objects/templates/solid_objects.rb +13 -0
  74. data/lib/solid_objects/action_cable_broadcast_adapter.rb +19 -0
  75. data/lib/solid_objects/activation.rb +183 -0
  76. data/lib/solid_objects/activation_manager.rb +102 -0
  77. data/lib/solid_objects/actor.rb +271 -0
  78. data/lib/solid_objects/actor_channel.rb +29 -0
  79. data/lib/solid_objects/actor_definition.rb +212 -0
  80. data/lib/solid_objects/actor_registry.rb +65 -0
  81. data/lib/solid_objects/actor_snapshot.rb +42 -0
  82. data/lib/solid_objects/actor_view.rb +117 -0
  83. data/lib/solid_objects/broadcast_executor.rb +162 -0
  84. data/lib/solid_objects/cli.rb +118 -0
  85. data/lib/solid_objects/client.rb +153 -0
  86. data/lib/solid_objects/configuration.rb +168 -0
  87. data/lib/solid_objects/context.rb +41 -0
  88. data/lib/solid_objects/database_adapter.rb +82 -0
  89. data/lib/solid_objects/database_adapters/mysql.rb +22 -0
  90. data/lib/solid_objects/database_adapters/postgresql.rb +17 -0
  91. data/lib/solid_objects/database_adapters/sqlite.rb +12 -0
  92. data/lib/solid_objects/dead_letter_manager.rb +47 -0
  93. data/lib/solid_objects/dom_identity.rb +38 -0
  94. data/lib/solid_objects/effect_executor.rb +235 -0
  95. data/lib/solid_objects/effect_registry.rb +34 -0
  96. data/lib/solid_objects/engine.rb +33 -0
  97. data/lib/solid_objects/errors.rb +65 -0
  98. data/lib/solid_objects/executor.rb +290 -0
  99. data/lib/solid_objects/instrumentation.rb +10 -0
  100. data/lib/solid_objects/lease.rb +172 -0
  101. data/lib/solid_objects/lease_renewer.rb +70 -0
  102. data/lib/solid_objects/log_subscriber.rb +29 -0
  103. data/lib/solid_objects/mailbox.rb +178 -0
  104. data/lib/solid_objects/message_reference.rb +52 -0
  105. data/lib/solid_objects/process_registry.rb +143 -0
  106. data/lib/solid_objects/reference.rb +96 -0
  107. data/lib/solid_objects/reminder_scheduler.rb +168 -0
  108. data/lib/solid_objects/serialization.rb +99 -0
  109. data/lib/solid_objects/state.rb +111 -0
  110. data/lib/solid_objects/stream_name.rb +29 -0
  111. data/lib/solid_objects/stream_token.rb +59 -0
  112. data/lib/solid_objects/supervisor.rb +87 -0
  113. data/lib/solid_objects/turbo_stream_renderer.rb +35 -0
  114. data/lib/solid_objects/version.rb +5 -0
  115. data/lib/solid_objects/wake_up.rb +28 -0
  116. data/lib/solid_objects/worker.rb +139 -0
  117. data/lib/solid_objects.rb +118 -0
  118. data/sig/generated/controllers/solid_objects/application_controller.rbs +10 -0
  119. data/sig/generated/controllers/solid_objects/dead_letters_controller.rbs +11 -0
  120. data/sig/generated/controllers/solid_objects/instances_controller.rbs +11 -0
  121. data/sig/generated/helpers/solid_objects/actor_helper.rbs +8 -0
  122. data/sig/generated/lib/generators/solid_objects/install_generator.rbs +13 -0
  123. data/sig/generated/lib/solid_objects/action_cable_broadcast_adapter.rbs +8 -0
  124. data/sig/generated/lib/solid_objects/activation.rbs +65 -0
  125. data/sig/generated/lib/solid_objects/activation_manager.rbs +36 -0
  126. data/sig/generated/lib/solid_objects/actor.rbs +183 -0
  127. data/sig/generated/lib/solid_objects/actor_channel.rbs +8 -0
  128. data/sig/generated/lib/solid_objects/actor_definition.rbs +117 -0
  129. data/sig/generated/lib/solid_objects/actor_registry.rbs +36 -0
  130. data/sig/generated/lib/solid_objects/actor_snapshot.rbs +28 -0
  131. data/sig/generated/lib/solid_objects/actor_view.rbs +56 -0
  132. data/sig/generated/lib/solid_objects/broadcast_executor.rbs +55 -0
  133. data/sig/generated/lib/solid_objects/cli.rbs +31 -0
  134. data/sig/generated/lib/solid_objects/client.rbs +35 -0
  135. data/sig/generated/lib/solid_objects/configuration.rbs +147 -0
  136. data/sig/generated/lib/solid_objects/context.rbs +56 -0
  137. data/sig/generated/lib/solid_objects/database_adapter.rbs +42 -0
  138. data/sig/generated/lib/solid_objects/database_adapters/mysql.rbs +16 -0
  139. data/sig/generated/lib/solid_objects/database_adapters/postgresql.rbs +13 -0
  140. data/sig/generated/lib/solid_objects/database_adapters/sqlite.rbs +10 -0
  141. data/sig/generated/lib/solid_objects/dead_letter_manager.rbs +16 -0
  142. data/sig/generated/lib/solid_objects/dom_identity.rbs +20 -0
  143. data/sig/generated/lib/solid_objects/effect_executor.rbs +82 -0
  144. data/sig/generated/lib/solid_objects/effect_registry.rbs +24 -0
  145. data/sig/generated/lib/solid_objects/engine.rbs +7 -0
  146. data/sig/generated/lib/solid_objects/errors.rbs +64 -0
  147. data/sig/generated/lib/solid_objects/executor.rbs +60 -0
  148. data/sig/generated/lib/solid_objects/instrumentation.rbs +8 -0
  149. data/sig/generated/lib/solid_objects/lease.rbs +57 -0
  150. data/sig/generated/lib/solid_objects/lease_renewer.rbs +42 -0
  151. data/sig/generated/lib/solid_objects/log_subscriber.rbs +11 -0
  152. data/sig/generated/lib/solid_objects/mailbox.rbs +46 -0
  153. data/sig/generated/lib/solid_objects/message_reference.rbs +37 -0
  154. data/sig/generated/lib/solid_objects/process_registry.rbs +46 -0
  155. data/sig/generated/lib/solid_objects/reference.rbs +45 -0
  156. data/sig/generated/lib/solid_objects/reminder_scheduler.rbs +55 -0
  157. data/sig/generated/lib/solid_objects/serialization.rbs +31 -0
  158. data/sig/generated/lib/solid_objects/state.rbs +72 -0
  159. data/sig/generated/lib/solid_objects/stream_name.rbs +11 -0
  160. data/sig/generated/lib/solid_objects/stream_token.rbs +19 -0
  161. data/sig/generated/lib/solid_objects/supervisor.rbs +38 -0
  162. data/sig/generated/lib/solid_objects/turbo_stream_renderer.rbs +14 -0
  163. data/sig/generated/lib/solid_objects/version.rbs +5 -0
  164. data/sig/generated/lib/solid_objects/wake_up.rbs +24 -0
  165. data/sig/generated/lib/solid_objects/worker.rbs +56 -0
  166. data/sig/generated/lib/solid_objects.rbs +41 -0
  167. data/sig/generated/models/solid_objects/broadcast.rbs +6 -0
  168. data/sig/generated/models/solid_objects/claimed_message.rbs +6 -0
  169. data/sig/generated/models/solid_objects/dead_letter.rbs +6 -0
  170. data/sig/generated/models/solid_objects/effect.rbs +6 -0
  171. data/sig/generated/models/solid_objects/instance.rbs +25 -0
  172. data/sig/generated/models/solid_objects/message.rbs +22 -0
  173. data/sig/generated/models/solid_objects/process.rbs +6 -0
  174. data/sig/generated/models/solid_objects/ready_message.rbs +6 -0
  175. data/sig/generated/models/solid_objects/record.rbs +8 -0
  176. data/sig/generated/models/solid_objects/reminder.rbs +6 -0
  177. data/sig/support/framework.rbs +37 -0
  178. metadata +467 -0
@@ -0,0 +1,56 @@
1
+ # Generated from lib/solid_objects/worker.rb with RBS::Inline
2
+
3
+ module SolidObjects
4
+ class Worker
5
+ @shutdown_requested: bool
6
+
7
+ @stopped: bool
8
+
9
+ @activations: Hash[Integer, Activation]
10
+
11
+ @activation_manager: ActivationManager
12
+
13
+ @process_registry: ProcessRegistry
14
+
15
+ # @rbs (?process_registry: ProcessRegistry) -> void
16
+ def initialize: (?process_registry: ProcessRegistry) -> void
17
+
18
+ # @rbs () -> Integer
19
+ def run_once: () -> Integer
20
+
21
+ # @rbs (?max_passes: Integer) -> Integer
22
+ def run_until_idle: (?max_passes: Integer) -> Integer
23
+
24
+ # @rbs () -> void
25
+ def run: () -> void
26
+
27
+ # @rbs () -> void
28
+ def request_shutdown: () -> void
29
+
30
+ # @rbs () -> void
31
+ def stop: () -> void
32
+
33
+ # @rbs () -> bool
34
+ def stopped?: () -> bool
35
+
36
+ # @rbs () -> bool
37
+ def shutdown_requested?: () -> bool
38
+
39
+ private
40
+
41
+ attr_reader process_registry: untyped
42
+
43
+ attr_reader activation_manager: untyped
44
+
45
+ attr_reader activations: untyped
46
+
47
+ # @rbs () -> Activation?
48
+ def cached_ready_activation: () -> Activation?
49
+
50
+ # @rbs () -> void
51
+ def maintain_cached_activations: () -> void
52
+
53
+ # @rbs (Activation) -> void
54
+ def release_activation: (Activation) -> void
55
+ end
56
+ end
@@ -0,0 +1,41 @@
1
+ # Generated from lib/solid_objects.rb with RBS::Inline
2
+
3
+ module SolidObjects
4
+ extend Instrumentation
5
+
6
+ # @rbs () -> Configuration
7
+ def self.configuration: () -> Configuration
8
+
9
+ # @rbs () { (Configuration) -> void } -> Configuration
10
+ def self.configure: () { (Configuration) -> void } -> Configuration
11
+
12
+ # @rbs () -> ActorRegistry
13
+ def self.registry: () -> ActorRegistry
14
+
15
+ # @rbs () -> EffectRegistry
16
+ def self.effect_registry: () -> EffectRegistry
17
+
18
+ # @rbs (String | Symbol) { (Hash[String, untyped], EffectContext) -> untyped } -> Proc
19
+ def self.register_effect: (String | Symbol) { (Hash[String, untyped], EffectContext) -> untyped } -> Proc
20
+
21
+ # @rbs () -> Client
22
+ def self.client: () -> Client
23
+
24
+ # @rbs () -> DeadLetterManager
25
+ def self.dead_letters: () -> DeadLetterManager
26
+
27
+ # @rbs (String | Symbol) -> String
28
+ def self.table_name: (String | Symbol) -> String
29
+
30
+ # @rbs (String, Class) -> Class
31
+ def self.register_actor: (String, Class) -> Class
32
+
33
+ # @rbs () -> void
34
+ def self.reset!: () -> void
35
+
36
+ # @rbs () -> DatabaseAdapter
37
+ def self.database_adapter: () -> DatabaseAdapter
38
+
39
+ # @rbs () -> WakeUp
40
+ def self.wake_up: () -> WakeUp
41
+ end
@@ -0,0 +1,6 @@
1
+ # Generated from app/models/solid_objects/broadcast.rb with RBS::Inline
2
+
3
+ module SolidObjects
4
+ class Broadcast < Record
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ # Generated from app/models/solid_objects/claimed_message.rb with RBS::Inline
2
+
3
+ module SolidObjects
4
+ class ClaimedMessage < Record
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ # Generated from app/models/solid_objects/dead_letter.rb with RBS::Inline
2
+
3
+ module SolidObjects
4
+ class DeadLetter < Record
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ # Generated from app/models/solid_objects/effect.rb with RBS::Inline
2
+
3
+ module SolidObjects
4
+ class Effect < Record
5
+ end
6
+ end
@@ -0,0 +1,25 @@
1
+ # Generated from app/models/solid_objects/instance.rb with RBS::Inline
2
+
3
+ module SolidObjects
4
+ class Instance < Record
5
+ # @rbs (?actor_type: String?) -> ActiveRecord::Relation[Instance]
6
+ def self.active: (?actor_type: String?) -> ActiveRecord::Relation[Instance]
7
+
8
+ # @rbs (quiet_for: Numeric, ?now: Time) -> ActiveRecord::Relation[Instance]
9
+ def self.without_pending_work: (quiet_for: Numeric, ?now: Time) -> ActiveRecord::Relation[Instance]
10
+
11
+ # @rbs (actor_type: String, owner: ActiveRecord::Relation[untyped] | Class) -> ActiveRecord::Relation[Instance]
12
+ def self.orphaned: (actor_type: String, owner: ActiveRecord::Relation[untyped] | Class) -> ActiveRecord::Relation[Instance]
13
+
14
+ # @rbs (actor_type: String, actor_ids: Array[String]) -> Hash[String, Hash[String, untyped]]
15
+ def self.states_for: (actor_type: String, actor_ids: Array[String]) -> Hash[String, Hash[String, untyped]]
16
+
17
+ # @rbs () -> String
18
+ private def self.owner_id_cast_type: () -> String
19
+
20
+ private
21
+
22
+ # @rbs () -> void
23
+ def supply_defaults: () -> void
24
+ end
25
+ end
@@ -0,0 +1,22 @@
1
+ # Generated from app/models/solid_objects/message.rb with RBS::Inline
2
+
3
+ module SolidObjects
4
+ class Message < Record
5
+ # @rbs () -> bool
6
+ def ready?: () -> bool
7
+
8
+ # @rbs () -> bool
9
+ def claimed?: () -> bool
10
+
11
+ # @rbs () -> bool
12
+ def completed?: () -> bool
13
+
14
+ # @rbs () -> bool
15
+ def dead?: () -> bool
16
+
17
+ private
18
+
19
+ # @rbs () -> void
20
+ def supply_defaults: () -> void
21
+ end
22
+ end
@@ -0,0 +1,6 @@
1
+ # Generated from app/models/solid_objects/process.rb with RBS::Inline
2
+
3
+ module SolidObjects
4
+ class Process < Record
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ # Generated from app/models/solid_objects/ready_message.rb with RBS::Inline
2
+
3
+ module SolidObjects
4
+ class ReadyMessage < Record
5
+ end
6
+ end
@@ -0,0 +1,8 @@
1
+ # Generated from app/models/solid_objects/record.rb with RBS::Inline
2
+
3
+ module SolidObjects
4
+ class Record < ActiveRecord::Base
5
+ # @rbs () -> void
6
+ def self.configure_connection: () -> void
7
+ end
8
+ end
@@ -0,0 +1,6 @@
1
+ # Generated from app/models/solid_objects/reminder.rb with RBS::Inline
2
+
3
+ module SolidObjects
4
+ class Reminder < Record
5
+ end
6
+ end
@@ -0,0 +1,37 @@
1
+ module ActiveRecord
2
+ class Base
3
+ end
4
+
5
+ class Relation[unchecked out Element]
6
+ end
7
+ end
8
+
9
+ module ActiveSupport
10
+ class MessageVerifier
11
+ end
12
+ end
13
+
14
+ module ActionCable
15
+ module Channel
16
+ class Base
17
+ end
18
+ end
19
+ end
20
+
21
+ module ActionController
22
+ class Base
23
+ end
24
+ end
25
+
26
+ module Rails
27
+ class Engine
28
+ end
29
+
30
+ module Generators
31
+ class Base
32
+ end
33
+ end
34
+ end
35
+
36
+ class Thor
37
+ end