solid_objects 0.16.1 → 0.17.1

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 (68) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +100 -0
  3. data/README.md +9 -0
  4. data/Rakefile +5 -0
  5. data/app/models/solid_objects/message.rb +15 -0
  6. data/docs/agents.md +253 -0
  7. data/docs/architecture.md +16 -6
  8. data/docs/authorization.md +10 -3
  9. data/docs/observability.md +186 -0
  10. data/docs/operations.md +10 -8
  11. data/docs/realtime.md +4 -3
  12. data/docs/reminders.md +3 -1
  13. data/docs/roadmap.md +17 -1
  14. data/docs/security.md +2 -2
  15. data/docs/transmission.md +17 -6
  16. data/docs/virtual-actors.md +226 -0
  17. data/examples/quickstart/README.md +246 -0
  18. data/examples/quickstart/app/actors/ticket_sale.rb +22 -0
  19. data/examples/quickstart/smoke.rb +421 -0
  20. data/lib/solid_objects/activation.rb +6 -3
  21. data/lib/solid_objects/actor.rb +29 -2
  22. data/lib/solid_objects/actor_channel.rb +9 -1
  23. data/lib/solid_objects/actor_snapshot.rb +14 -8
  24. data/lib/solid_objects/broadcast_executor.rb +1 -0
  25. data/lib/solid_objects/client.rb +15 -1
  26. data/lib/solid_objects/configuration.rb +4 -0
  27. data/lib/solid_objects/database_adapters/sqlite.rb +7 -1
  28. data/lib/solid_objects/diagnostics.rb +83 -0
  29. data/lib/solid_objects/effect_executor.rb +4 -0
  30. data/lib/solid_objects/errors.rb +3 -0
  31. data/lib/solid_objects/executor.rb +34 -16
  32. data/lib/solid_objects/instrumentation.rb +22 -1
  33. data/lib/solid_objects/log_subscriber.rb +1 -1
  34. data/lib/solid_objects/mailbox.rb +5 -1
  35. data/lib/solid_objects/message_reference.rb +9 -9
  36. data/lib/solid_objects/observer_registry.rb +47 -0
  37. data/lib/solid_objects/payload_broadcast.rb +9 -8
  38. data/lib/solid_objects/reference.rb +19 -0
  39. data/lib/solid_objects/reminder_scheduler.rb +5 -0
  40. data/lib/solid_objects/state_snapshot.rb +1 -0
  41. data/lib/solid_objects/supervisor.rb +3 -6
  42. data/lib/solid_objects/synchronous_invocation.rb +1 -21
  43. data/lib/solid_objects/telemetry.rb +137 -0
  44. data/lib/solid_objects/version.rb +1 -1
  45. data/lib/solid_objects/wake_up_adapters/postgresql.rb +1 -2
  46. data/lib/solid_objects/wake_up_adapters/redis.rb +1 -2
  47. data/lib/solid_objects/worker.rb +1 -2
  48. data/lib/solid_objects.rb +10 -0
  49. data/sig/generated/lib/solid_objects/actor.rbs +9 -0
  50. data/sig/generated/lib/solid_objects/actor_channel.rbs +3 -0
  51. data/sig/generated/lib/solid_objects/actor_snapshot.rbs +7 -2
  52. data/sig/generated/lib/solid_objects/client.rbs +3 -0
  53. data/sig/generated/lib/solid_objects/configuration.rbs +7 -3
  54. data/sig/generated/lib/solid_objects/diagnostics.rbs +25 -0
  55. data/sig/generated/lib/solid_objects/errors.rbs +3 -0
  56. data/sig/generated/lib/solid_objects/executor.rbs +10 -2
  57. data/sig/generated/lib/solid_objects/message_reference.rbs +6 -6
  58. data/sig/generated/lib/solid_objects/observer_registry.rbs +29 -0
  59. data/sig/generated/lib/solid_objects/payload_broadcast.rbs +2 -4
  60. data/sig/generated/lib/solid_objects/reference.rbs +9 -0
  61. data/sig/generated/lib/solid_objects/synchronous_invocation.rbs +0 -3
  62. data/sig/generated/lib/solid_objects/telemetry.rbs +30 -0
  63. data/sig/generated/lib/solid_objects.rbs +3 -0
  64. data/sig/generated/models/solid_objects/message.rbs +3 -0
  65. data/sig/public/json_value.rbs +3 -0
  66. data/sig/public/telemetry.rbs +49 -0
  67. data/sig/support/framework.rbs +5 -0
  68. metadata +24 -9
@@ -0,0 +1,30 @@
1
+ # Generated from lib/solid_objects/telemetry.rb with RBS::Inline
2
+
3
+ module SolidObjects
4
+ module Telemetry
5
+ FIELDS: Array[String]
6
+
7
+ ALIASES: Hash[String, String]
8
+
9
+ # @rbs (Effect | Broadcast) -> void
10
+ def self.outbox: (Effect | Broadcast) -> void
11
+
12
+ # @rbs (Symbol, Hash[Symbol, Object]) -> void
13
+ def self.emit: (Symbol, Hash[Symbol, Object]) -> void
14
+
15
+ # @rbs (event_observer, portable_event) -> void
16
+ def self.deliver: (event_observer, portable_event) -> void
17
+
18
+ # @rbs (Symbol, Hash[Symbol, Object]) -> portable_event
19
+ def self.event: (Symbol, Hash[Symbol, Object]) -> portable_event
20
+
21
+ # @rbs (Hash[Symbol, Object]) -> Hash[String, telemetry_value]
22
+ def self.safe_attributes: (Hash[Symbol, Object]) -> Hash[String, telemetry_value]
23
+
24
+ # @rbs (Effect | Broadcast) -> Hash[Symbol, String | Integer]
25
+ private def self.outbox_identity: (Effect | Broadcast) -> Hash[Symbol, String | Integer]
26
+
27
+ # @rbs (String, Exception) -> void
28
+ private def self.log_delivery_failure: (String, Exception) -> void
29
+ end
30
+ end
@@ -27,6 +27,9 @@ module SolidObjects
27
27
  # @rbs (String | Symbol) { (Hash[String, untyped], CommitActionContext) -> untyped } -> Proc
28
28
  def self.register_commit_action: (String | Symbol) { (Hash[String, untyped], CommitActionContext) -> untyped } -> Proc
29
29
 
30
+ # @rbs () -> ObserverRegistry
31
+ def self.observer_registry: () -> ObserverRegistry
32
+
30
33
  # @rbs () -> Client
31
34
  def self.client: () -> Client
32
35
 
@@ -17,6 +17,9 @@ module SolidObjects
17
17
  # @rbs () -> bool
18
18
  def dead?: () -> bool
19
19
 
20
+ # @rbs () -> json_value
21
+ def result!: () -> json_value
22
+
20
23
  private
21
24
 
22
25
  # @rbs () -> void
@@ -0,0 +1,3 @@
1
+ module SolidObjects
2
+ type json_value = String | Integer | Float | bool | nil | Array[json_value] | Hash[String, json_value]
3
+ end
@@ -0,0 +1,49 @@
1
+ module SolidObjects
2
+ type telemetry_value = String | Integer | Float | bool | nil
3
+
4
+ type metric_sample = {
5
+ "name" => String,
6
+ "kind" => "counter" | "gauge" | "histogram",
7
+ "unit" => "1" | "ms",
8
+ "value" => Integer | Float,
9
+ "labels" => Hash[String, String]
10
+ }
11
+
12
+ type portable_event = {
13
+ "schemaVersion" => Integer,
14
+ "name" => String,
15
+ "occurredAt" => String,
16
+ "adapter" => String,
17
+ "actorType" => String?,
18
+ "actorId" => String?,
19
+ "incarnation" => String?,
20
+ "revision" => String?,
21
+ "messageId" => String?,
22
+ "attempt" => Integer,
23
+ "attributes" => Hash[String, telemetry_value],
24
+ "metrics" => Array[metric_sample]
25
+ }
26
+
27
+ type event_observer = ^(portable_event) -> void
28
+
29
+ type diagnostic_summary = {
30
+ "sampled" => Integer,
31
+ "truncated" => bool,
32
+ "oldestAgeMilliseconds" => Integer?
33
+ }
34
+
35
+ type actor_diagnostics = {
36
+ "actorType" => String,
37
+ "actorId" => String,
38
+ "incarnation" => String?,
39
+ "revision" => String?,
40
+ "adapter" => String,
41
+ "occurredAt" => String,
42
+ "limit" => Integer,
43
+ "mailbox" => diagnostic_summary,
44
+ "outbox" => diagnostic_summary,
45
+ "reminders" => diagnostic_summary,
46
+ "retries" => diagnostic_summary,
47
+ "recoveryFailures" => diagnostic_summary
48
+ }
49
+ end
@@ -9,6 +9,11 @@ end
9
9
  module ActiveSupport
10
10
  class MessageVerifier
11
11
  end
12
+
13
+ module Notifications
14
+ class Event
15
+ end
16
+ end
12
17
  end
13
18
 
14
19
  module ActionCable
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.16.1
4
+ version: 0.17.1
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-10-03 00:00:00.000000000 Z
11
+ date: 2026-10-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actioncable
@@ -276,10 +276,11 @@ dependencies:
276
276
  - - ">="
277
277
  - !ruby/object:Gem::Version
278
278
  version: '2.7'
279
- description: 'The Cloudflare Durable Objects programming model for Rails: addressable
280
- objects with durable state, ordered mailboxes, fenced activation, per-object alarms,
281
- transactional effects, and reactive ERB. It runs on MySQL, PostgreSQL, and SQLite
282
- without requiring Redis.'
279
+ description: 'Solid Objects is a SQL-backed virtual actor library for Ruby on Rails,
280
+ with durable state, ordered operations, and automatic activation. It brings the
281
+ Cloudflare Durable Objects programming model to Rails: addressable objects with
282
+ ordered mailboxes, fenced activation, per-object reminders, transactional effects,
283
+ and reactive ERB. It runs on MySQL, PostgreSQL, and SQLite without Redis.'
283
284
  email:
284
285
  executables:
285
286
  - solid_objects
@@ -350,6 +351,7 @@ files:
350
351
  - docs/adr/0011-wake-up-strategy.md
351
352
  - docs/adr/0012-not-active-jobs.md
352
353
  - docs/adr/0013-database-adapters.md
354
+ - docs/agents.md
353
355
  - docs/architecture.md
354
356
  - docs/authorization.md
355
357
  - docs/benchmarks.md
@@ -362,6 +364,7 @@ files:
362
364
  - docs/implementation-plan.md
363
365
  - docs/local-testing.md
364
366
  - docs/migrating-existing-state.md
367
+ - docs/observability.md
365
368
  - docs/operations.md
366
369
  - docs/realtime.md
367
370
  - docs/reminders.md
@@ -370,6 +373,7 @@ files:
370
373
  - docs/security.md
371
374
  - docs/state-migrations.md
372
375
  - docs/transmission.md
376
+ - docs/virtual-actors.md
373
377
  - examples/application/README.md
374
378
  - examples/application/app/actors/chat_room_actor.rb
375
379
  - examples/application/app/actors/shopping_cart_actor.rb
@@ -386,6 +390,9 @@ files:
386
390
  - examples/at_least_once/demo.rb
387
391
  - examples/at_least_once/effect_worker.rb
388
392
  - examples/at_least_once/sink.rb
393
+ - examples/quickstart/README.md
394
+ - examples/quickstart/app/actors/ticket_sale.rb
395
+ - examples/quickstart/smoke.rb
389
396
  - exe/solid_objects
390
397
  - lib/generators/solid_objects/install_generator.rb
391
398
  - lib/generators/solid_objects/templates/solid_objects.rb
@@ -425,6 +432,7 @@ files:
425
432
  - lib/solid_objects/dead_letter_manager.rb
426
433
  - lib/solid_objects/dead_letter_scope.rb
427
434
  - lib/solid_objects/dead_row.rb
435
+ - lib/solid_objects/diagnostics.rb
428
436
  - lib/solid_objects/doctor.rb
429
437
  - lib/solid_objects/dom_identity.rb
430
438
  - lib/solid_objects/effect_executor.rb
@@ -442,6 +450,7 @@ files:
442
450
  - lib/solid_objects/mailbox.rb
443
451
  - lib/solid_objects/message_pruner.rb
444
452
  - lib/solid_objects/message_reference.rb
453
+ - lib/solid_objects/observer_registry.rb
445
454
  - lib/solid_objects/operation_dispatcher.rb
446
455
  - lib/solid_objects/outcome.rb
447
456
  - lib/solid_objects/payload_broadcast.rb
@@ -464,6 +473,7 @@ files:
464
473
  - lib/solid_objects/sync_deadline.rb
465
474
  - lib/solid_objects/sync_diagnostics.rb
466
475
  - lib/solid_objects/synchronous_invocation.rb
476
+ - lib/solid_objects/telemetry.rb
467
477
  - lib/solid_objects/test_helper.rb
468
478
  - lib/solid_objects/transmission.rb
469
479
  - lib/solid_objects/turbo_stream_renderer.rb
@@ -527,6 +537,7 @@ files:
527
537
  - sig/generated/lib/solid_objects/dead_letter_manager.rbs
528
538
  - sig/generated/lib/solid_objects/dead_letter_scope.rbs
529
539
  - sig/generated/lib/solid_objects/dead_row.rbs
540
+ - sig/generated/lib/solid_objects/diagnostics.rbs
530
541
  - sig/generated/lib/solid_objects/doctor.rbs
531
542
  - sig/generated/lib/solid_objects/dom_identity.rbs
532
543
  - sig/generated/lib/solid_objects/effect_executor.rbs
@@ -544,6 +555,7 @@ files:
544
555
  - sig/generated/lib/solid_objects/mailbox.rbs
545
556
  - sig/generated/lib/solid_objects/message_pruner.rbs
546
557
  - sig/generated/lib/solid_objects/message_reference.rbs
558
+ - sig/generated/lib/solid_objects/observer_registry.rbs
547
559
  - sig/generated/lib/solid_objects/operation_dispatcher.rbs
548
560
  - sig/generated/lib/solid_objects/outcome.rbs
549
561
  - sig/generated/lib/solid_objects/payload_broadcast.rbs
@@ -566,6 +578,7 @@ files:
566
578
  - sig/generated/lib/solid_objects/sync_deadline.rbs
567
579
  - sig/generated/lib/solid_objects/sync_diagnostics.rbs
568
580
  - sig/generated/lib/solid_objects/synchronous_invocation.rbs
581
+ - sig/generated/lib/solid_objects/telemetry.rbs
569
582
  - sig/generated/lib/solid_objects/test_helper.rbs
570
583
  - sig/generated/lib/solid_objects/transmission.rbs
571
584
  - sig/generated/lib/solid_objects/turbo_stream_renderer.rbs
@@ -599,7 +612,9 @@ files:
599
612
  - sig/generated/models/solid_objects/redrive.rbs
600
613
  - sig/generated/models/solid_objects/reminder.rbs
601
614
  - sig/public/effect_payload.rbs
615
+ - sig/public/json_value.rbs
602
616
  - sig/public/reminder_payload.rbs
617
+ - sig/public/telemetry.rbs
603
618
  - sig/support/framework.rbs
604
619
  - web/assets/javascripts/application.js
605
620
  - web/assets/javascripts/charts.js
@@ -621,7 +636,7 @@ files:
621
636
  - web/views/message.erb
622
637
  - web/views/processes.erb
623
638
  - web/views/reminders.erb
624
- homepage: https://solidobjects.dev
639
+ homepage: https://solidobjects.dev/ruby
625
640
  licenses:
626
641
  - MIT
627
642
  metadata:
@@ -629,7 +644,7 @@ metadata:
629
644
  bug_tracker_uri: https://github.com/cardmagic/solid-objects-ruby/issues
630
645
  changelog_uri: https://github.com/cardmagic/solid-objects-ruby/blob/main/CHANGELOG.md
631
646
  documentation_uri: https://github.com/cardmagic/solid-objects-ruby#readme
632
- homepage_uri: https://solidobjects.dev
647
+ homepage_uri: https://solidobjects.dev/ruby
633
648
  rubygems_mfa_required: 'true'
634
649
  source_code_uri: https://github.com/cardmagic/solid-objects-ruby
635
650
  post_install_message:
@@ -650,5 +665,5 @@ requirements: []
650
665
  rubygems_version: 3.5.22
651
666
  signing_key:
652
667
  specification_version: 4
653
- summary: Cloudflare Durable Objects, ported to Rails
668
+ summary: SQL-backed virtual actors for Ruby on Rails
654
669
  test_files: []