Three correctness fixes and one new seam, from an integration review against a real host.
Fixed
- A busy stack can no longer evict other people from the inbox. The grouped-inbox window is now taken per counterpart, so one desk with many recent conversations cannot consume another counterpart's row. At most twice the row limit is materialized.
- Lifecycle events fire after commit, and stay silent on rollback.
conversation_createdandparticipant_leftpreviously ran inside the transaction, so a subscriber could act on a conversation that never existed. - An author no longer has to be a messager. Signing a desk's reply is about who wrote it, not about holding a seat, so staff need not be given
acts_as_messagerjust to sign. The author must be persisted; the host decides who may sign for a shared identity, and the HTTP controller never accepts an author from request parameters.
Added
-
Chats::SendRateLimited— the send-rate budget as a controller concern, so a product built on chats (its own composer, its own controller) shares one configured budget with the chat composer instead of inventing a second one.config.send_rate_limit = { to: 60, within: 1.minute } # shared; nil disables
Upgrading
Nothing to do. If you were relying on an author having to be a messager, note that constraint is gone by design.
Verified
| Tests | 324 runs, 1350 assertions, 0 failures |
| Databases | SQLite, PostgreSQL |
| Rails | 7.1, 7.2, 8.1 |
What's Changed
Full Changelog: v0.3.1...v0.3.2