Repository navigation
Commit 6adf4c6
authored
fix(mothership): close the remaining ways a chat send is lost, resent hot, or polled after unmount (#8695)
* fix(mothership): close the remaining ways a chat send is lost, resent hot, or polled after unmount
- A deleted chat's queue could come back through `enqueue`: a direct send to a
chat deleted while its POST was failing (unreachable or busy) was re-queued,
invisible, and would go out if the chat were restored. A cleared chat now
refuses every queue write until it is restored from Recently Deleted.
- A busy refusal re-queued its message for immediate redispatch. With Redis
down every send is refused as busy without naming a turn, so the message
was resent on every refusal (or stalled in the queue). Busy re-queues now
wait out a jittered, growing delay (`backoffWithJitter`, 1s to 30s) before
the drain sends them again under the same id.
- A send waiting on the server's chat lock behind another tab's turn was
aborted by a return-triggered recovery, and its message was lost. Recovery
now leaves any POST that has not answered alone unless the chat already
holds its message. When the busy refusal then arrives, the chat attaches to
the turn holding it explicitly: the history read it relies on can repeat one
the surface skipped while the POST was pending, so nothing else re-ran to
attach, and the queued message waited behind a turn the tab never showed.
- A retry told "already sent" while the server's earlier attempt with that id
was still in flight (it had opened no stream yet) reattached to the missing
stream, read the 404 as a finished turn, and dropped the message. Seen in
the browser harness when Redis came back during a busy-refusal retry. Such a
refusal is now retried later like a busy one.
- A Send-now message whose Stop handoff failed (for example because the user
switched chats while the Stop settled) returned a plain failure that the
dispatch epoch check discarded. It is now handed back held, so it stays in
its own chat's queue for the user to send; a surface that unmounted keeps
resuming it from its stored handoff as before.
- The saved-turn re-read kept refetching an unobserved chat for up to two
minutes after the chat view unmounted. It now stops with the view.
* fix(mothership): keep deleted chats empty across tabs and back off busy first messages
- migrate no longer moves a new-chat queue into a chat deleted meanwhile
- another tab's delete clears and tombstones the chat's queue; a restore
(published as created) or the chat loading lifts it
- a busy refusal on the new-chat surface waits out the backoff in its own
queue instead of being handed to the surface's listener and resent at once
- a deduplicated send whose stream check resolves after the user moved on
leaves Stop on the new turn
* fix(mothership): lift a chat's delete only when a later server read returns it
The chat history effect also ran on history written locally, such as the
rollback after a busy refusal, so a chat deleted in another tab could take
queued sends again before any restore. The delete is now lifted only by a
server read that began after it.
* fix(mothership): apply the restore check to every server read of a chat
Recovery on a return to the tab reads the chat directly, not through the
history query, so a restore it found left the chat refusing follow-ups.
The check now lives in fetchMothershipChatHistory itself.
* test(mothership): use the central request mock in the restore read test
* fix(mothership): lift only the chat delete a read or restore saw
Each delete now gets a token. A history read or a restore lifts the delete
it saw when it began, so a slow answer cannot reopen a chat deleted again
while it was in flight.
* fix(mothership): keep a send refused as busy after the user switched chats
A chat switch detaches the view but leaves a send waiting on the chat lock
running. Its busy refusal was dropped as a stale answer, so the message was
lost. A conflict is now handled after a switch too, re-queuing the message
in its own chat. The busy branch attaches through recovery's own history
read instead of reading the chat twice.
* fix(mothership): check a deduplicated send's stream before adopting its chat
On the new-chat surface, an "already sent" answer names the chat the
earlier attempt opened. Adopting it before finding no stream moved the
surface to that chat while the retried message was queued under the
new-chat key, where nothing sent it. The stream is now checked first.
* fix(mothership): retry a deduplicated send whose stream lookup failed
A lookup that failed with a network error or 5xx was read as proof that the
earlier attempt's stream existed, so a send that never started was
reattached and finalized instead of re-sent. Only a lookup this send aborted
skips the retry now; the server deduplicates the retry by id.1 parent f98df1b commit 6adf4c6
9 files changed
Lines changed: 1105 additions & 54 deletions
File tree
- apps/sim
- app/workspace/[workspaceId]/home/hooks
- hooks
- queries
- stores/mothership-queue
Lines changed: 723 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 147 additions & 40 deletions
Large diffs are not rendered by default.
Lines changed: 119 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
281 | 281 | | |
282 | 282 | | |
283 | 283 | | |
284 | | - | |
| 284 | + | |
285 | 285 | | |
286 | 286 | | |
287 | 287 | | |
| |||
309 | 309 | | |
310 | 310 | | |
311 | 311 | | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
312 | 328 | | |
313 | 329 | | |
314 | 330 | | |
| |||
365 | 381 | | |
366 | 382 | | |
367 | 383 | | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
368 | 390 | | |
369 | 391 | | |
370 | 392 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
| 18 | + | |
18 | 19 | | |
19 | 20 | | |
20 | 21 | | |
| |||
136 | 137 | | |
137 | 138 | | |
138 | 139 | | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
139 | 161 | | |
140 | 162 | | |
141 | 163 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
| 13 | + | |
13 | 14 | | |
14 | 15 | | |
15 | 16 | | |
| |||
119 | 120 | | |
120 | 121 | | |
121 | 122 | | |
| 123 | + | |
| 124 | + | |
122 | 125 | | |
123 | 126 | | |
| 127 | + | |
| 128 | + | |
124 | 129 | | |
125 | 130 | | |
126 | 131 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
88 | 88 | | |
89 | 89 | | |
90 | 90 | | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
91 | 118 | | |
92 | 119 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
41 | 41 | | |
42 | 42 | | |
43 | 43 | | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
44 | 47 | | |
45 | 48 | | |
46 | 49 | | |
47 | | - | |
| 50 | + | |
48 | 51 | | |
49 | 52 | | |
50 | 53 | | |
| |||
67 | 70 | | |
68 | 71 | | |
69 | 72 | | |
70 | | - | |
71 | | - | |
72 | | - | |
73 | | - | |
74 | | - | |
75 | | - | |
76 | | - | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
77 | 82 | | |
78 | 83 | | |
79 | 84 | | |
| |||
99 | 104 | | |
100 | 105 | | |
101 | 106 | | |
| 107 | + | |
| 108 | + | |
102 | 109 | | |
103 | 110 | | |
104 | 111 | | |
| |||
144 | 151 | | |
145 | 152 | | |
146 | 153 | | |
147 | | - | |
| 154 | + | |
| 155 | + | |
148 | 156 | | |
149 | 157 | | |
150 | 158 | | |
| |||
201 | 209 | | |
202 | 210 | | |
203 | 211 | | |
204 | | - | |
| 212 | + | |
205 | 213 | | |
206 | 214 | | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
207 | 223 | | |
208 | 224 | | |
209 | 225 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
24 | 24 | | |
25 | 25 | | |
26 | 26 | | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
27 | 31 | | |
28 | 32 | | |
29 | 33 | | |
| |||
49 | 53 | | |
50 | 54 | | |
51 | 55 | | |
52 | | - | |
53 | | - | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
54 | 59 | | |
55 | | - | |
| 60 | + | |
56 | 61 | | |
57 | 62 | | |
58 | 63 | | |
| |||
65 | 70 | | |
66 | 71 | | |
67 | 72 | | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
68 | 78 | | |
69 | 79 | | |
0 commit comments