solid_objects 0.12.1 → 0.13.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 (83) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +60 -0
  3. data/README.md +69 -13
  4. data/benchmark/idle_polling.rb +98 -0
  5. data/benchmark/support.rb +2 -0
  6. data/docs/adr/0009-realtime-updates.md +5 -1
  7. data/docs/adr/0011-wake-up-strategy.md +6 -0
  8. data/docs/architecture.md +5 -4
  9. data/docs/authorization.md +11 -4
  10. data/docs/benchmarks.md +38 -0
  11. data/docs/correctness.md +3 -3
  12. data/docs/dashboard.md +200 -0
  13. data/docs/database-schema.md +5 -4
  14. data/docs/development.md +1 -0
  15. data/docs/operations.md +24 -0
  16. data/docs/realtime.md +22 -14
  17. data/docs/roadmap.md +32 -11
  18. data/docs/security.md +7 -7
  19. data/examples/application/README.md +5 -5
  20. data/examples/application/app/actors/chat_room_actor.rb +1 -1
  21. data/examples/application/app/actors/shopping_cart_actor.rb +2 -2
  22. data/lib/solid_objects/actor.rb +1 -1
  23. data/lib/solid_objects/broadcast_executor.rb +35 -4
  24. data/lib/solid_objects/configuration.rb +4 -0
  25. data/lib/solid_objects/effect_executor.rb +34 -3
  26. data/lib/solid_objects/polling_backoff.rb +45 -0
  27. data/lib/solid_objects/process_registry.rb +51 -0
  28. data/lib/solid_objects/reminder_scheduler.rb +35 -4
  29. data/lib/solid_objects/version.rb +1 -1
  30. data/lib/solid_objects/wake_up.rb +36 -4
  31. data/lib/solid_objects/wake_up_adapters/postgresql.rb +6 -0
  32. data/lib/solid_objects/wake_up_adapters/redis.rb +25 -3
  33. data/lib/solid_objects/web/action.rb +109 -0
  34. data/lib/solid_objects/web/application.rb +239 -0
  35. data/lib/solid_objects/web/csrf_protection.rb +130 -0
  36. data/lib/solid_objects/web/helpers.rb +227 -0
  37. data/lib/solid_objects/web/paginator.rb +64 -0
  38. data/lib/solid_objects/web/route.rb +55 -0
  39. data/lib/solid_objects/web/router.rb +46 -0
  40. data/lib/solid_objects/web/statistics.rb +78 -0
  41. data/lib/solid_objects/web.rb +222 -0
  42. data/lib/solid_objects/worker.rb +39 -3
  43. data/lib/solid_objects.rb +2 -0
  44. data/sig/generated/lib/solid_objects/broadcast_executor.rbs +7 -0
  45. data/sig/generated/lib/solid_objects/configuration.rbs +6 -2
  46. data/sig/generated/lib/solid_objects/effect_executor.rbs +7 -0
  47. data/sig/generated/lib/solid_objects/polling_backoff.rbs +29 -0
  48. data/sig/generated/lib/solid_objects/process_registry.rbs +15 -0
  49. data/sig/generated/lib/solid_objects/reminder_scheduler.rbs +7 -0
  50. data/sig/generated/lib/solid_objects/wake_up.rbs +19 -2
  51. data/sig/generated/lib/solid_objects/wake_up_adapters/postgresql.rbs +3 -0
  52. data/sig/generated/lib/solid_objects/wake_up_adapters/redis.rbs +17 -2
  53. data/sig/generated/lib/solid_objects/web/action.rbs +78 -0
  54. data/sig/generated/lib/solid_objects/web/application.rbs +50 -0
  55. data/sig/generated/lib/solid_objects/web/csrf_protection.rbs +55 -0
  56. data/sig/generated/lib/solid_objects/web/helpers.rbs +118 -0
  57. data/sig/generated/lib/solid_objects/web/paginator.rbs +54 -0
  58. data/sig/generated/lib/solid_objects/web/route.rbs +45 -0
  59. data/sig/generated/lib/solid_objects/web/router.rbs +29 -0
  60. data/sig/generated/lib/solid_objects/web/statistics.rbs +46 -0
  61. data/sig/generated/lib/solid_objects/web.rbs +129 -0
  62. data/sig/generated/lib/solid_objects/worker.rbs +7 -0
  63. data/web/assets/javascripts/application.js +118 -0
  64. data/web/assets/javascripts/charts.js +190 -0
  65. data/web/assets/stylesheets/application.css +527 -0
  66. data/web/views/_messages.erb +29 -0
  67. data/web/views/_navigation.erb +15 -0
  68. data/web/views/_paging.erb +17 -0
  69. data/web/views/_status_filter.erb +8 -0
  70. data/web/views/_summary.erb +39 -0
  71. data/web/views/broadcasts.erb +35 -0
  72. data/web/views/dashboard.erb +128 -0
  73. data/web/views/dead_letter.erb +40 -0
  74. data/web/views/dead_letters.erb +42 -0
  75. data/web/views/effects.erb +35 -0
  76. data/web/views/instance.erb +139 -0
  77. data/web/views/instances.erb +49 -0
  78. data/web/views/layout.erb +22 -0
  79. data/web/views/mailbox.erb +35 -0
  80. data/web/views/message.erb +34 -0
  81. data/web/views/processes.erb +37 -0
  82. data/web/views/reminders.erb +37 -0
  83. metadata +58 -2
@@ -0,0 +1,34 @@
1
+ <section class="panel">
2
+ <div class="panel-head">
3
+ <h2><%= h(@message.operation) %></h2>
4
+ <div class="actions">
5
+ <%= status_label(@message.delivery_mode) %>
6
+ <a href="<%= h(path_to("/instances/#{@message.instance_id}")) %>"><%= actor_label(@message) %></a>
7
+ </div>
8
+ </div>
9
+
10
+ <dl class="attributes">
11
+ <div><dt>Sequence</dt><dd><%= number(@message.sequence) %></dd></div>
12
+ <div><dt>Attempts</dt><dd><%= number(@message.attempt_count) %> / <%= number(@message.max_attempts) %></dd></div>
13
+ <div><dt>Request id</dt><dd><%= h(@message.request_id) %></dd></div>
14
+ <div><dt>Idempotency key</dt><dd><%= h(@message.idempotency_key || "none") %></dd></div>
15
+ <div><dt>Enqueued</dt><dd><%= relative_time(@message.enqueued_at) %></dd></div>
16
+ <div><dt>Available</dt><dd><%= relative_time(@message.available_at) %></dd></div>
17
+ <div><dt>Started</dt><dd><%= relative_time(@message.started_at) %></dd></div>
18
+ <div><dt>Completed</dt><dd><%= relative_time(@message.completed_at) %></dd></div>
19
+ <div><dt>Rejected</dt><dd><%= relative_time(@message.rejected_at) %></dd></div>
20
+ <div><dt>Last failed</dt><dd><%= relative_time(@message.last_failed_at) %></dd></div>
21
+ </dl>
22
+
23
+ <h3>Arguments</h3>
24
+ <%= json_block(@message.arguments) %>
25
+
26
+ <h3>Result</h3>
27
+ <%= json_block(@message.result) %>
28
+
29
+ <h3>Error</h3>
30
+ <%= json_block(@message.error) %>
31
+
32
+ <h3>Rejection</h3>
33
+ <%= json_block(@message.rejection) %>
34
+ </section>
@@ -0,0 +1,37 @@
1
+ <section class="panel">
2
+ <h2>Processes</h2>
3
+ <%= erb(:_status_filter, statuses: SolidObjects::Web::Statistics::PROCESS_STATES, selected: @status) %>
4
+
5
+ <% if @paginator.records.empty? %>
6
+ <p class="empty">No process matches this filter.</p>
7
+ <% else %>
8
+ <table>
9
+ <thead>
10
+ <tr>
11
+ <th>Kind</th>
12
+ <th>Host</th>
13
+ <th>PID</th>
14
+ <th>State</th>
15
+ <th>Started</th>
16
+ <th>Last heartbeat</th>
17
+ <th>Activated instances</th>
18
+ </tr>
19
+ </thead>
20
+ <tbody>
21
+ <% @paginator.records.each do |process_record| %>
22
+ <tr>
23
+ <td><%= h(process_record.kind) %></td>
24
+ <td><%= h(process_record.hostname) %></td>
25
+ <td><%= h(process_record.pid) %></td>
26
+ <td><%= status_label(process_record.shutdown_state) %></td>
27
+ <td><%= relative_time(process_record.started_at) %></td>
28
+ <td><%= relative_time(process_record.last_heartbeat_at) %></td>
29
+ <td><%= number(@activated_counts.fetch(process_record.id, 0)) %></td>
30
+ </tr>
31
+ <% end %>
32
+ </tbody>
33
+ </table>
34
+ <% end %>
35
+
36
+ <%= erb(:_paging) %>
37
+ </section>
@@ -0,0 +1,37 @@
1
+ <section class="panel">
2
+ <h2>Reminders</h2>
3
+ <%= erb(:_status_filter, statuses: SolidObjects::Web::Statistics::REMINDER_STATUSES, selected: @status) %>
4
+
5
+ <% if @paginator.records.empty? %>
6
+ <p class="empty">No reminder matches this filter.</p>
7
+ <% else %>
8
+ <table>
9
+ <thead>
10
+ <tr>
11
+ <th>Actor</th>
12
+ <th>Name</th>
13
+ <th>Operation</th>
14
+ <th>Status</th>
15
+ <th>Next run</th>
16
+ <th>Interval</th>
17
+ <th>Occurrence</th>
18
+ </tr>
19
+ </thead>
20
+ <tbody>
21
+ <% @paginator.records.each do |reminder| %>
22
+ <tr>
23
+ <td><a href="<%= h(path_to("/instances/#{reminder.instance_id}")) %>"><%= actor_label(reminder) %></a></td>
24
+ <td><%= h(reminder.name) %></td>
25
+ <td><%= h(reminder.operation) %></td>
26
+ <td><%= status_label(reminder.status) %></td>
27
+ <td><%= relative_time(reminder.next_run_at) %></td>
28
+ <td><%= duration(reminder.interval_seconds) %></td>
29
+ <td><%= number(reminder.occurrence) %></td>
30
+ </tr>
31
+ <% end %>
32
+ </tbody>
33
+ </table>
34
+ <% end %>
35
+
36
+ <%= erb(:_paging) %>
37
+ </section>
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.12.1
4
+ version: 0.13.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-08-13 00:00:00.000000000 Z
11
+ date: 2026-08-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actioncable
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '8.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rack
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '3.1'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '3.1'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: railties
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -305,6 +319,7 @@ files:
305
319
  - benchmark/concurrent_actors.rb
306
320
  - benchmark/enqueue.rb
307
321
  - benchmark/hot_actor.rb
322
+ - benchmark/idle_polling.rb
308
323
  - benchmark/processing.rb
309
324
  - benchmark/query_count.rb
310
325
  - benchmark/support.rb
@@ -330,6 +345,7 @@ files:
330
345
  - docs/authorization.md
331
346
  - docs/benchmarks.md
332
347
  - docs/correctness.md
348
+ - docs/dashboard.md
333
349
  - docs/database-schema.md
334
350
  - docs/development.md
335
351
  - docs/fit.md
@@ -404,6 +420,7 @@ files:
404
420
  - lib/solid_objects/message_reference.rb
405
421
  - lib/solid_objects/operation_dispatcher.rb
406
422
  - lib/solid_objects/payload_broadcast.rb
423
+ - lib/solid_objects/polling_backoff.rb
407
424
  - lib/solid_objects/process_pruner.rb
408
425
  - lib/solid_objects/process_registry.rb
409
426
  - lib/solid_objects/reference.rb
@@ -424,6 +441,15 @@ files:
424
441
  - lib/solid_objects/wake_up_adapters.rb
425
442
  - lib/solid_objects/wake_up_adapters/postgresql.rb
426
443
  - lib/solid_objects/wake_up_adapters/redis.rb
444
+ - lib/solid_objects/web.rb
445
+ - lib/solid_objects/web/action.rb
446
+ - lib/solid_objects/web/application.rb
447
+ - lib/solid_objects/web/csrf_protection.rb
448
+ - lib/solid_objects/web/helpers.rb
449
+ - lib/solid_objects/web/paginator.rb
450
+ - lib/solid_objects/web/route.rb
451
+ - lib/solid_objects/web/router.rb
452
+ - lib/solid_objects/web/statistics.rb
427
453
  - lib/solid_objects/worker.rb
428
454
  - lib/tasks/solid_objects_tasks.rake
429
455
  - sig/generated/controllers/solid_objects/application_controller.rbs
@@ -480,6 +506,7 @@ files:
480
506
  - sig/generated/lib/solid_objects/message_reference.rbs
481
507
  - sig/generated/lib/solid_objects/operation_dispatcher.rbs
482
508
  - sig/generated/lib/solid_objects/payload_broadcast.rbs
509
+ - sig/generated/lib/solid_objects/polling_backoff.rbs
483
510
  - sig/generated/lib/solid_objects/process_pruner.rbs
484
511
  - sig/generated/lib/solid_objects/process_registry.rbs
485
512
  - sig/generated/lib/solid_objects/reference.rbs
@@ -500,6 +527,15 @@ files:
500
527
  - sig/generated/lib/solid_objects/wake_up_adapters.rbs
501
528
  - sig/generated/lib/solid_objects/wake_up_adapters/postgresql.rbs
502
529
  - sig/generated/lib/solid_objects/wake_up_adapters/redis.rbs
530
+ - sig/generated/lib/solid_objects/web.rbs
531
+ - sig/generated/lib/solid_objects/web/action.rbs
532
+ - sig/generated/lib/solid_objects/web/application.rbs
533
+ - sig/generated/lib/solid_objects/web/csrf_protection.rbs
534
+ - sig/generated/lib/solid_objects/web/helpers.rbs
535
+ - sig/generated/lib/solid_objects/web/paginator.rbs
536
+ - sig/generated/lib/solid_objects/web/route.rbs
537
+ - sig/generated/lib/solid_objects/web/router.rbs
538
+ - sig/generated/lib/solid_objects/web/statistics.rbs
503
539
  - sig/generated/lib/solid_objects/worker.rbs
504
540
  - sig/generated/models/solid_objects/broadcast.rbs
505
541
  - sig/generated/models/solid_objects/claimed_message.rbs
@@ -512,6 +548,26 @@ files:
512
548
  - sig/generated/models/solid_objects/record.rbs
513
549
  - sig/generated/models/solid_objects/reminder.rbs
514
550
  - sig/support/framework.rbs
551
+ - web/assets/javascripts/application.js
552
+ - web/assets/javascripts/charts.js
553
+ - web/assets/stylesheets/application.css
554
+ - web/views/_messages.erb
555
+ - web/views/_navigation.erb
556
+ - web/views/_paging.erb
557
+ - web/views/_status_filter.erb
558
+ - web/views/_summary.erb
559
+ - web/views/broadcasts.erb
560
+ - web/views/dashboard.erb
561
+ - web/views/dead_letter.erb
562
+ - web/views/dead_letters.erb
563
+ - web/views/effects.erb
564
+ - web/views/instance.erb
565
+ - web/views/instances.erb
566
+ - web/views/layout.erb
567
+ - web/views/mailbox.erb
568
+ - web/views/message.erb
569
+ - web/views/processes.erb
570
+ - web/views/reminders.erb
515
571
  homepage: https://solidobjects.dev
516
572
  licenses:
517
573
  - MIT