solid_objects 0.10.3 → 0.12.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 (61) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +50 -0
  3. data/README.md +72 -16
  4. data/app/controllers/solid_objects/components_controller.rb +4 -4
  5. data/app/models/solid_objects/message.rb +1 -1
  6. data/app/views/solid_objects/dead_letters/index.html.erb +1 -1
  7. data/app/views/solid_objects/instances/show.html.erb +1 -1
  8. data/benchmark/support.rb +10 -10
  9. data/db/migrate/20260813000000_rename_message_dispatch_columns.rb +53 -0
  10. data/docs/architecture.md +11 -9
  11. data/docs/authorization.md +2 -2
  12. data/docs/database-schema.md +4 -4
  13. data/docs/development.md +1 -1
  14. data/docs/migrating-existing-state.md +1 -3
  15. data/docs/roadmap.md +1 -1
  16. data/lib/solid_objects/actor.rb +43 -32
  17. data/lib/solid_objects/actor_channel.rb +3 -3
  18. data/lib/solid_objects/actor_definition.rb +9 -6
  19. data/lib/solid_objects/actor_view.rb +1 -1
  20. data/lib/solid_objects/application_write_guard.rb +1 -1
  21. data/lib/solid_objects/client.rb +52 -52
  22. data/lib/solid_objects/component_registration.rb +2 -2
  23. data/lib/solid_objects/component_renderer.rb +1 -1
  24. data/lib/solid_objects/component_subscriptions.rb +21 -21
  25. data/lib/solid_objects/configuration.rb +42 -0
  26. data/lib/solid_objects/database_adapters/sqlite.rb +7 -1
  27. data/lib/solid_objects/dead_letter_manager.rb +4 -4
  28. data/lib/solid_objects/doctor.rb +8 -8
  29. data/lib/solid_objects/effect_executor.rb +22 -22
  30. data/lib/solid_objects/errors.rb +27 -27
  31. data/lib/solid_objects/executor.rb +40 -38
  32. data/lib/solid_objects/lease.rb +3 -3
  33. data/lib/solid_objects/mailbox.rb +34 -27
  34. data/lib/solid_objects/operation_dispatcher.rb +51 -0
  35. data/lib/solid_objects/payload_broadcast.rb +1 -1
  36. data/lib/solid_objects/reference.rb +60 -29
  37. data/lib/solid_objects/reminder_scheduler.rb +6 -6
  38. data/lib/solid_objects/supervisor.rb +50 -9
  39. data/lib/solid_objects/sync_diagnostics.rb +6 -6
  40. data/lib/solid_objects/turbo_stream_renderer.rb +13 -13
  41. data/lib/solid_objects/version.rb +1 -1
  42. data/lib/solid_objects.rb +1 -0
  43. data/sig/generated/controllers/solid_objects/components_controller.rbs +2 -2
  44. data/sig/generated/lib/solid_objects/actor.rbs +17 -17
  45. data/sig/generated/lib/solid_objects/actor_definition.rbs +4 -4
  46. data/sig/generated/lib/solid_objects/client.rbs +8 -8
  47. data/sig/generated/lib/solid_objects/component_registration.rbs +2 -2
  48. data/sig/generated/lib/solid_objects/component_subscriptions.rbs +8 -8
  49. data/sig/generated/lib/solid_objects/configuration.rbs +32 -4
  50. data/sig/generated/lib/solid_objects/database_adapters/sqlite.rbs +3 -0
  51. data/sig/generated/lib/solid_objects/effect_executor.rbs +2 -2
  52. data/sig/generated/lib/solid_objects/errors.rbs +18 -18
  53. data/sig/generated/lib/solid_objects/executor.rbs +10 -10
  54. data/sig/generated/lib/solid_objects/lease.rbs +2 -2
  55. data/sig/generated/lib/solid_objects/mailbox.rbs +8 -8
  56. data/sig/generated/lib/solid_objects/operation_dispatcher.rbs +35 -0
  57. data/sig/generated/lib/solid_objects/reference.rbs +7 -4
  58. data/sig/generated/lib/solid_objects/supervisor.rbs +19 -2
  59. data/sig/generated/lib/solid_objects/sync_diagnostics.rbs +2 -2
  60. data/sig/generated/lib/solid_objects/turbo_stream_renderer.rbs +8 -8
  61. metadata +5 -2
@@ -71,7 +71,7 @@ module SolidObjects
71
71
 
72
72
  @actor_id: String
73
73
 
74
- @message_name: String
74
+ @operation: String
75
75
 
76
76
  attr_reader timeout: untyped
77
77
 
@@ -79,10 +79,10 @@ module SolidObjects
79
79
 
80
80
  attr_reader actor_id: untyped
81
81
 
82
- attr_reader message_name: untyped
82
+ attr_reader operation: untyped
83
83
 
84
- # @rbs (timeout: Numeric, actor_type: String, actor_id: String, message_name: String) -> void
85
- def initialize: (timeout: Numeric, actor_type: String, actor_id: String, message_name: String) -> void
84
+ # @rbs (timeout: Numeric, actor_type: String, actor_id: String, operation: String) -> void
85
+ def initialize: (timeout: Numeric, actor_type: String, actor_id: String, operation: String) -> void
86
86
  end
87
87
 
88
88
  class SyncTimeout < Error
@@ -92,7 +92,7 @@ module SolidObjects
92
92
 
93
93
  @actor_id: String
94
94
 
95
- @message_name: String
95
+ @operation: String
96
96
 
97
97
  @message_id: Integer
98
98
 
@@ -114,7 +114,7 @@ module SolidObjects
114
114
 
115
115
  attr_reader actor_id: untyped
116
116
 
117
- attr_reader message_name: untyped
117
+ attr_reader operation: untyped
118
118
 
119
119
  attr_reader message_id: untyped
120
120
 
@@ -130,8 +130,8 @@ module SolidObjects
130
130
 
131
131
  attr_reader blocker: untyped
132
132
 
133
- # @rbs (timeout: Numeric, actor_type: String, actor_id: String, message_name: String, message_id: Integer, request_id: String, sequence: Integer, status: String, waiting_on: String, activation: Hash[String, untyped], blocker: Hash[String, untyped]?) -> void
134
- def initialize: (timeout: Numeric, actor_type: String, actor_id: String, message_name: String, message_id: Integer, request_id: String, sequence: Integer, status: String, waiting_on: String, activation: Hash[String, untyped], blocker: Hash[String, untyped]?) -> void
133
+ # @rbs (timeout: Numeric, actor_type: String, actor_id: String, operation: String, message_id: Integer, request_id: String, sequence: Integer, status: String, waiting_on: String, activation: Hash[String, untyped], blocker: Hash[String, untyped]?) -> void
134
+ def initialize: (timeout: Numeric, actor_type: String, actor_id: String, operation: String, message_id: Integer, request_id: String, sequence: Integer, status: String, waiting_on: String, activation: Hash[String, untyped], blocker: Hash[String, untyped]?) -> void
135
135
 
136
136
  # @rbs () -> MessageReference
137
137
  def message_reference: () -> MessageReference
@@ -142,16 +142,16 @@ module SolidObjects
142
142
 
143
143
  @actor_id: String
144
144
 
145
- @message_name: String
145
+ @operation: String
146
146
 
147
147
  attr_reader actor_type: untyped
148
148
 
149
149
  attr_reader actor_id: untyped
150
150
 
151
- attr_reader message_name: untyped
151
+ attr_reader operation: untyped
152
152
 
153
- # @rbs (actor_type: String, actor_id: String, message_name: String) -> void
154
- def initialize: (actor_type: String, actor_id: String, message_name: String) -> void
153
+ # @rbs (actor_type: String, actor_id: String, operation: String) -> void
154
+ def initialize: (actor_type: String, actor_id: String, operation: String) -> void
155
155
  end
156
156
 
157
157
  class ApplicationWriteForbidden < NonRetryableError
@@ -159,21 +159,21 @@ module SolidObjects
159
159
 
160
160
  @actor_id: String
161
161
 
162
- @message_name: String
162
+ @operation: String
163
163
 
164
164
  attr_reader actor_type: untyped
165
165
 
166
166
  attr_reader actor_id: untyped
167
167
 
168
- attr_reader message_name: untyped
168
+ attr_reader operation: untyped
169
169
 
170
- # @rbs (actor_type: String, actor_id: String, message_name: String) -> void
171
- def initialize: (actor_type: String, actor_id: String, message_name: String) -> void
170
+ # @rbs (actor_type: String, actor_id: String, operation: String) -> void
171
+ def initialize: (actor_type: String, actor_id: String, operation: String) -> void
172
172
  end
173
173
 
174
174
  class CommitActionUnavailable < NonRetryableError
175
- # @rbs (actor_type: String, actor_id: String, message_name: String) -> void
176
- def initialize: (actor_type: String, actor_id: String, message_name: String) -> void
175
+ # @rbs (actor_type: String, actor_id: String, operation: String) -> void
176
+ def initialize: (actor_type: String, actor_id: String, operation: String) -> void
177
177
  end
178
178
 
179
179
  class UnknownCommitAction < NonRetryableError
@@ -36,14 +36,14 @@ module SolidObjects
36
36
  # @rbs (Array[Actor::CommitActionIntent]) -> void
37
37
  def execute_commit_actions: (Array[Actor::CommitActionIntent]) -> void
38
38
 
39
- # @rbs (Actor::CommitActionIntent, Proc, CommitActionContext) -> untyped
40
- def execute_commit_action: (Actor::CommitActionIntent, Proc, CommitActionContext) -> untyped
39
+ # @rbs (intent: Actor::CommitActionIntent, handler: Proc, context: CommitActionContext) -> untyped
40
+ def execute_commit_action: (intent: Actor::CommitActionIntent, handler: Proc, context: CommitActionContext) -> untyped
41
41
 
42
42
  # @rbs () -> void
43
43
  def ensure_application_database_is_shared!: () -> void
44
44
 
45
- # @rbs (Message, Instance, Array[Actor::EffectIntent]) -> Array[Effect]
46
- def enqueue_effects: (Message, Instance, Array[Actor::EffectIntent]) -> Array[Effect]
45
+ # @rbs (message: Message, instance: Instance, intents: Array[Actor::EffectIntent]) -> Array[Effect]
46
+ def enqueue_effects: (message: Message, instance: Instance, intents: Array[Actor::EffectIntent]) -> Array[Effect]
47
47
 
48
48
  # A reminder is one named alarm per actor, so scheduling a name that is
49
49
  # already armed moves it rather than adding a second. An actor that arms a
@@ -62,11 +62,11 @@ module SolidObjects
62
62
  # @rbs (Reminder, Time?) -> Hash[Symbol, untyped]?
63
63
  def moved_reminder_payload: (Reminder, Time?) -> Hash[Symbol, untyped]?
64
64
 
65
- # @rbs (Message, Instance, Array[Actor::OutboundMessageIntent]) -> Array[Effect]
66
- def enqueue_actor_messages: (Message, Instance, Array[Actor::OutboundMessageIntent]) -> Array[Effect]
65
+ # @rbs (message: Message, instance: Instance, intents: Array[Actor::OutboundMessageIntent]) -> Array[Effect]
66
+ def enqueue_actor_messages: (message: Message, instance: Instance, intents: Array[Actor::OutboundMessageIntent]) -> Array[Effect]
67
67
 
68
- # @rbs (Message, Instance, Hash[String, untyped], state_changed: bool) -> void
69
- def enqueue_broadcasts: (Message, Instance, Hash[String, untyped], state_changed: bool) -> void
68
+ # @rbs (message: Message, instance: Instance, observable_changes: Hash[String, untyped], state_changed: bool) -> void
69
+ def enqueue_broadcasts: (message: Message, instance: Instance, observable_changes: Hash[String, untyped], state_changed: bool) -> void
70
70
 
71
71
  # @rbs () -> bool
72
72
  def payload_broadcasts?: () -> bool
@@ -83,8 +83,8 @@ module SolidObjects
83
83
  # @rbs (Exception) -> Hash[String, untyped]
84
84
  def serialized_error: (Exception) -> Hash[String, untyped]
85
85
 
86
- # @rbs (Message, Hash[String, untyped], Time) -> DeadLetter
87
- def create_dead_letter: (Message, Hash[String, untyped], Time) -> DeadLetter
86
+ # @rbs (message: Message, error_details: Hash[String, untyped], now: Time) -> DeadLetter
87
+ def create_dead_letter: (message: Message, error_details: Hash[String, untyped], now: Time) -> DeadLetter
88
88
 
89
89
  # @rbs () -> Hash[Symbol, untyped]
90
90
  def instrumentation_payload: () -> Hash[Symbol, untyped]
@@ -8,8 +8,8 @@ module SolidObjects
8
8
  # @rbs (instance_id: Integer, owner_id: String, ?activation_token: String, ?duration: Numeric, ?database_adapter: DatabaseAdapter) -> Lease?
9
9
  def self.acquire: (instance_id: Integer, owner_id: String, ?activation_token: String, ?duration: Numeric, ?database_adapter: DatabaseAdapter) -> Lease?
10
10
 
11
- # @rbs (Instance, String, Time) -> bool
12
- private def self.held_by_another_live_owner?: (Instance, String, Time) -> bool
11
+ # @rbs (instance: Instance, activation_token: String, now: Time) -> bool
12
+ private def self.held_by_another_live_owner?: (instance: Instance, activation_token: String, now: Time) -> bool
13
13
 
14
14
  @database_adapter: DatabaseAdapter
15
15
 
@@ -9,11 +9,11 @@ module SolidObjects
9
9
  # @rbs (?database_adapter: DatabaseAdapter) -> void
10
10
  def initialize: (?database_adapter: DatabaseAdapter) -> void
11
11
 
12
- # @rbs (Reference, Symbol | String, Hash[Symbol | String, untyped], kind: String, ?available_at: Time?, idempotency_key: String?) -> MessageReference
13
- def enqueue: (Reference, Symbol | String, Hash[Symbol | String, untyped], kind: String, idempotency_key: String?, ?available_at: Time?) -> MessageReference
12
+ # @rbs (reference: Reference, operation: Symbol | String, arguments: Hash[Symbol | String, untyped], delivery_mode: String, ?available_at: Time?, idempotency_key: String?) -> MessageReference
13
+ def enqueue: (reference: Reference, operation: Symbol | String, arguments: Hash[Symbol | String, untyped], delivery_mode: String, idempotency_key: String?, ?available_at: Time?) -> MessageReference
14
14
 
15
- # @rbs (Reference, Symbol | String, Hash[Symbol | String, untyped], kind: String, ?available_at: Time?, idempotency_key: String?, ?actor_class: Class?) -> Message
16
- def enqueue_in_transaction: (Reference, Symbol | String, Hash[Symbol | String, untyped], kind: String, idempotency_key: String?, ?available_at: Time?, ?actor_class: Class?) -> Message
15
+ # @rbs (reference: Reference, operation: Symbol | String, arguments: Hash[Symbol | String, untyped], delivery_mode: String, ?available_at: Time?, idempotency_key: String?, ?actor_class: Class?) -> Message
16
+ def enqueue_in_transaction: (reference: Reference, operation: Symbol | String, arguments: Hash[Symbol | String, untyped], delivery_mode: String, idempotency_key: String?, ?available_at: Time?, ?actor_class: Class?) -> Message
17
17
 
18
18
  # @rbs (Message) -> void
19
19
  def announce: (Message) -> void
@@ -31,14 +31,14 @@ module SolidObjects
31
31
  # @rbs (Instance, String?) -> Message?
32
32
  def find_idempotent_message: (Instance, String?) -> Message?
33
33
 
34
- # @rbs (Message, Symbol | String, String, untyped) -> Message
35
- def validate_idempotent_message!: (Message, Symbol | String, String, untyped) -> Message
34
+ # @rbs (existing_message: Message, operation: Symbol | String, delivery_mode: String, arguments: untyped) -> Message
35
+ def validate_idempotent_message!: (existing_message: Message, operation: Symbol | String, delivery_mode: String, arguments: untyped) -> Message
36
36
 
37
37
  # @rbs (Instance) -> void
38
38
  def enforce_mailbox_limit!: (Instance) -> void
39
39
 
40
- # @rbs (Instance, Reference, Symbol | String, untyped, kind: String, available_at: Time?, idempotency_key: String?) -> Message
41
- def create_message: (Instance, Reference, Symbol | String, untyped, kind: String, available_at: Time?, idempotency_key: String?) -> Message
40
+ # @rbs (instance: Instance, reference: Reference, operation: Symbol | String, arguments: untyped, delivery_mode: String, available_at: Time?, idempotency_key: String?) -> Message
41
+ def create_message: (instance: Instance, reference: Reference, operation: Symbol | String, arguments: untyped, delivery_mode: String, available_at: Time?, idempotency_key: String?) -> Message
42
42
 
43
43
  # @rbs (Time?, Time) -> Time
44
44
  def normalize_availability: (Time?, Time) -> Time
@@ -0,0 +1,35 @@
1
+ # Generated from lib/solid_objects/operation_dispatcher.rb with RBS::Inline
2
+
3
+ module SolidObjects
4
+ class OperationDispatcher
5
+ @actor_type: String
6
+
7
+ @handlers: Hash[Symbol, ActorDefinition::Handler]
8
+
9
+ @dispatch: Proc
10
+
11
+ # @rbs (actor_type: String, handlers: Hash[Symbol, ActorDefinition::Handler]) { (Symbol, Hash[Symbol, untyped]) -> untyped } -> void
12
+ def initialize: (actor_type: String, handlers: Hash[Symbol, ActorDefinition::Handler]) { (Symbol, Hash[Symbol, untyped]) -> untyped } -> void
13
+
14
+ # @rbs (Symbol, *untyped, **untyped) -> untyped
15
+ def method_missing: (Symbol, *untyped, **untyped) -> untyped
16
+
17
+ # @rbs (Symbol, bool) -> bool
18
+ def respond_to_missing?: (Symbol, bool) -> bool
19
+
20
+ private
21
+
22
+ attr_reader actor_type: untyped
23
+
24
+ attr_reader handlers: untyped
25
+
26
+ attr_reader dispatch: untyped
27
+
28
+ RESERVED_REFERENCE_METHOD_NAMES: untyped
29
+
30
+ RESERVED_OPERATION_NAMES: untyped
31
+
32
+ # @rbs (Symbol | String) -> void
33
+ def self.validate_operation_name!: (Symbol | String) -> void
34
+ end
35
+ end
@@ -13,11 +13,11 @@ module SolidObjects
13
13
  # @rbs (actor_type: String, actor_id: String) -> void
14
14
  def initialize: (actor_type: String, actor_id: String) -> void
15
15
 
16
- # @rbs (Symbol | String, ?available_at: Time?, ?idempotency_key: String?, ?authorization_context: untyped, **untyped) -> MessageReference?
17
- def async: (Symbol | String, ?available_at: Time?, ?idempotency_key: String?, ?authorization_context: untyped, **untyped) -> MessageReference?
16
+ # @rbs (?available_at: Time?, ?idempotency_key: String?, ?authorization_context: untyped) -> OperationDispatcher
17
+ def async: (?available_at: Time?, ?idempotency_key: String?, ?authorization_context: untyped) -> OperationDispatcher
18
18
 
19
- # @rbs (Symbol | String, ?timeout: Numeric, ?idempotency_key: String?, ?authorization_context: untyped, **untyped) -> untyped
20
- def sync: (Symbol | String, ?timeout: Numeric, ?idempotency_key: String?, ?authorization_context: untyped, **untyped) -> untyped
19
+ # @rbs (?timeout: Numeric, ?idempotency_key: String?, ?authorization_context: untyped) -> OperationDispatcher
20
+ def sync: (?timeout: Numeric, ?idempotency_key: String?, ?authorization_context: untyped) -> OperationDispatcher
21
21
 
22
22
  # @rbs (?authorization_context: untyped) -> bool
23
23
  def destroy: (?authorization_context: untyped) -> bool
@@ -36,6 +36,9 @@ module SolidObjects
36
36
 
37
37
  private
38
38
 
39
+ # @rbs (Symbol | String, Hash[Symbol, untyped], timeout: Numeric, idempotency_key: String?, authorization_context: untyped) -> untyped
40
+ def invoke_synchronously: (Symbol | String, Hash[Symbol, untyped], timeout: Numeric, idempotency_key: String?, authorization_context: untyped) -> untyped
41
+
39
42
  # @rbs (Symbol | String) -> bool
40
43
  def actor_message?: (Symbol | String) -> bool
41
44
 
@@ -36,6 +36,8 @@ module SolidObjects
36
36
 
37
37
  attr_reader threads: untyped
38
38
 
39
+ attr_reader builders: untyped
40
+
39
41
  # A role that raises leaves its thread dead. Without replacement the
40
42
  # process keeps running while quietly doing less work, so the supervisor
41
43
  # watches its threads and restarts any that stopped before shutdown.
@@ -101,8 +103,23 @@ module SolidObjects
101
103
  # @rbs () -> void
102
104
  def release_wake_up: () -> void
103
105
 
104
- # @rbs (worker_count: Integer, effect_worker_count: Integer, broadcast_worker_count: Integer, reminder_scheduler_count: Integer) -> Array[Worker | EffectExecutor | ReminderScheduler | BroadcastExecutor]
105
- def build_components: (worker_count: Integer, effect_worker_count: Integer, broadcast_worker_count: Integer, reminder_scheduler_count: Integer) -> Array[Worker | EffectExecutor | ReminderScheduler | BroadcastExecutor]
106
+ # A constructor can take a resource, and a later builder can raise. Without
107
+ # this, the components built first would be dropped while still holding
108
+ # whatever they took, and nothing would ever give it back.
109
+ # @rbs (Array[^() -> untyped]) -> Array[untyped]
110
+ def build_all: (Array[^() -> untyped]) -> Array[untyped]
111
+
112
+ # The failure that stopped the build is the one worth reporting, so a
113
+ # failure inside the cleanup never replaces it.
114
+ # @rbs (untyped) -> void
115
+ def stop_after_failed_build: (untyped) -> void
116
+
117
+ # Each component keeps the builder that made it, so a replacement after a
118
+ # crash is built the same way as the original. Components registered
119
+ # through the configuration run beside the built in ones, under the same
120
+ # supervision, restart, and shutdown timeout.
121
+ # @rbs (worker_count: Integer, effect_worker_count: Integer, broadcast_worker_count: Integer, reminder_scheduler_count: Integer) -> Array[^() -> untyped]
122
+ def component_builders: (worker_count: Integer, effect_worker_count: Integer, broadcast_worker_count: Integer, reminder_scheduler_count: Integer) -> Array[^() -> untyped]
106
123
 
107
124
  # @rbs () -> void
108
125
  def join_until_timeout: () -> void
@@ -19,8 +19,8 @@ module SolidObjects
19
19
  # @rbs (Message) -> String
20
20
  def message_status: (Message) -> String
21
21
 
22
- # @rbs (Message, Instance, Message?) -> String
23
- def waiting_reason: (Message, Instance, Message?) -> String
22
+ # @rbs (message: Message, instance: Instance, blocker: Message?) -> String
23
+ def waiting_reason: (message: Message, instance: Instance, blocker: Message?) -> String
24
24
 
25
25
  # @rbs (ReadyMessage?) -> bool
26
26
  def future?: (ReadyMessage?) -> bool
@@ -9,14 +9,14 @@ module SolidObjects
9
9
  # @rbs (Broadcast) -> String
10
10
  def self?.observable: (Broadcast) -> String
11
11
 
12
- # @rbs (Reference, Symbol | String, untyped) -> String
13
- def self?.observable_value: (Reference, Symbol | String, untyped) -> String
12
+ # @rbs (reference: Reference, name: Symbol | String, value: untyped) -> String
13
+ def self?.observable_value: (reference: Reference, name: Symbol | String, value: untyped) -> String
14
14
 
15
- # @rbs (ComponentRegistration, Integer, Integer) -> String
16
- def self?.component_refresh: (ComponentRegistration, Integer, Integer) -> String
15
+ # @rbs (registration: ComponentRegistration, instance_id: Integer, revision: Integer) -> String
16
+ def self?.component_refresh: (registration: ComponentRegistration, instance_id: Integer, revision: Integer) -> String
17
17
 
18
- # @rbs (Array[ComponentRegistration], Integer, Integer) -> String
19
- def self?.batch_refresh: (Array[ComponentRegistration], Integer, Integer) -> String
18
+ # @rbs (registrations: Array[ComponentRegistration], instance_id: Integer, revision: Integer) -> String
19
+ def self?.batch_refresh: (registrations: Array[ComponentRegistration], instance_id: Integer, revision: Integer) -> String
20
20
 
21
21
  # @rbs (Hash[String, untyped]) -> String
22
22
  def self?.state_payload: (Hash[String, untyped]) -> String
@@ -27,7 +27,7 @@ module SolidObjects
27
27
  # @rbs (untyped) -> String
28
28
  def self?.display_value: (untyped) -> String
29
29
 
30
- # @rbs (ComponentRegistration, Integer, Integer) -> String
31
- def self?.morph_component_refresh: (ComponentRegistration, Integer, Integer) -> String
30
+ # @rbs (registration: ComponentRegistration, instance_id: Integer, revision: Integer) -> String
31
+ def self?.morph_component_refresh: (registration: ComponentRegistration, instance_id: Integer, revision: Integer) -> String
32
32
  end
33
33
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solid_objects
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.3
4
+ version: 0.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lucas Carlson
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-08-11 00:00:00.000000000 Z
11
+ date: 2026-08-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actioncable
@@ -312,6 +312,7 @@ files:
312
312
  - config/routes.rb
313
313
  - db/migrate/20260805000000_create_solid_objects_tables.rb
314
314
  - db/migrate/20260806000000_add_state_revision_to_solid_objects_instances.rb
315
+ - db/migrate/20260813000000_rename_message_dispatch_columns.rb
315
316
  - docs/adr/0001-postgresql-backend.md
316
317
  - docs/adr/0002-jsonb-actor-state.md
317
318
  - docs/adr/0003-mailbox-ordering.md
@@ -401,6 +402,7 @@ files:
401
402
  - lib/solid_objects/mailbox.rb
402
403
  - lib/solid_objects/message_pruner.rb
403
404
  - lib/solid_objects/message_reference.rb
405
+ - lib/solid_objects/operation_dispatcher.rb
404
406
  - lib/solid_objects/payload_broadcast.rb
405
407
  - lib/solid_objects/process_pruner.rb
406
408
  - lib/solid_objects/process_registry.rb
@@ -476,6 +478,7 @@ files:
476
478
  - sig/generated/lib/solid_objects/mailbox.rbs
477
479
  - sig/generated/lib/solid_objects/message_pruner.rbs
478
480
  - sig/generated/lib/solid_objects/message_reference.rbs
481
+ - sig/generated/lib/solid_objects/operation_dispatcher.rbs
479
482
  - sig/generated/lib/solid_objects/payload_broadcast.rbs
480
483
  - sig/generated/lib/solid_objects/process_pruner.rbs
481
484
  - sig/generated/lib/solid_objects/process_registry.rbs