fix: reliable first-message send, QR routing, auto-lock recovery
Fixes reported by testers and found in an app review: - First message right after install no longer fails. Before the app finished registering with the relay, the outgoing message could crash on a null delivery address. The profile field is now optional and the send path throws a clear "still connecting, try again shortly" error while registration completes in the background. - The QR code and share link now appear only once the delivery address is ready. Previously a link generated before the first connection lacked routing, so the other side could not send the first message. The screen now shows a connecting state and reactively swaps in the QR when ready. - Incomplete contact links are rejected on import instead of failing at first send, with a clear prompt to ask for a fresh link. - Auto-lock no longer silences the app: after locking and unlocking, messaging is restarted (it previously stayed dead until app restart). - Group messages are marked failed on a non-per-member send error instead of hanging in the "sending" state forever. - Hardened the relay client against a rare duplicate connection when toggling Tor or locking mid-connect, and fromShareString now rejects a delivery address of the wrong length. - Pin unifiedpush below 6.2.0 to drop the webcrypto dependency (its native framework lacks LC_ENCRYPTION_INFO and blocked the iOS upload). - Skip Android release lint (network dependency check hangs on the build host and adds no value for a Flutter app).
This commit is contained in:
@@ -75,6 +75,9 @@ class RelayClient {
|
||||
|
||||
void _setState(RelayConnectionState s) {
|
||||
_state = s;
|
||||
// Po dispose() je controller zavřený — pozdní přechod z doběhnutého
|
||||
// _connect (zombie) by jinak hodil StateError do listenerů.
|
||||
if (_stateController.isClosed) return;
|
||||
_stateController.add(s);
|
||||
}
|
||||
|
||||
@@ -292,6 +295,14 @@ class RelayClient {
|
||||
try {
|
||||
final channel = _transport.connectWs(Uri.parse('$_wsUrl/v1/ws'));
|
||||
await channel.ready;
|
||||
// Během `ready` (přes Tor může viset dlouho) mohl přijít stop()/dispose()
|
||||
// — Tor toggle nebo auto-lock. Bez téhle kontroly by vzniklo zombie
|
||||
// autentizované spojení (relay má 2× jedno zařízení, DELIVERy padají do
|
||||
// zavřených controllerů). Nezakládat ho, jen zavřít.
|
||||
if (!_shouldRun) {
|
||||
await channel.sink.close();
|
||||
return;
|
||||
}
|
||||
_channel = channel;
|
||||
|
||||
// AUTH: výzva-odpověď podepsaná identity klíčem (XEdDSA)
|
||||
@@ -322,9 +333,13 @@ class RelayClient {
|
||||
return;
|
||||
}
|
||||
if (frame.hasDeliver()) {
|
||||
_deliverController.add(frame.deliver);
|
||||
if (!_deliverController.isClosed) {
|
||||
_deliverController.add(frame.deliver);
|
||||
}
|
||||
} else if (frame.hasReceipt()) {
|
||||
_receiptController.add(frame.receipt);
|
||||
if (!_receiptController.isClosed) {
|
||||
_receiptController.add(frame.receipt);
|
||||
}
|
||||
}
|
||||
},
|
||||
onDone: _onDisconnected,
|
||||
|
||||
Reference in New Issue
Block a user