feat(session): hand the session back when the user disconnects
The client never called /session/stop - the string appears nowhere in lib/ or local_packages/, on this branch or on main - while the server has implemented the route all along (hivemind/api.py:237) and AGENTS.md rule 33 documents its ordering. Across a full device test session, two user disconnects and several expiries, the control plane logged zero calls. So a disconnect left the VLESS client provisioned in the Reality inbound and the session dict in memory and sessions.json until its window ran out. Anyone holding that UUID could keep tunnelling for the remainder. Users were not locked out of their quota - _handle_main replaces the session with a fresh full-length one on the next connect - so this is hygiene rather than a user-facing bug. Only SessionTimer.disconnect() calls it, which is reached only from the connect button. Expiry, the hard cap and a server-ended session are already gone server-side, and the route takes nothing but a device_id as proof of ownership, so no error path may reach it. Unawaited and capped at 3 s, so an unreachable API cannot delay the teardown, and every failure is swallowed: the session expires on its own regardless. Verified against a mock control plane: user disconnect POST /api/session/stop -> session removed expiry no call; alert still posted Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
1 parent
00b84dde61
commit
e67f0b93ee
2 files changed
+69
No files matched your search
@@ -241,6 +241,10 @@ class SessionTimer extends ChangeNotifier with WidgetsBindingObserver {
|
||||
}
|
||||
|
||||
Future<void> disconnect({String reason = 'User requested'}) async {
|
||||
// Only here, not in _doDisconnect: this is the one path the user actually
|
||||
// asked for. Unawaited so a slow or unreachable API never holds up the
|
||||
// teardown.
|
||||
unawaited(HivemindService.releaseSession());
|
||||
await _doDisconnect(reason);
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user