Skip to content

Commit 6d02f42

Browse files
committed
server_support [nfc]: Move some server-support logic out to this new file
1 parent c67a4cc commit 6d02f42

File tree

4 files changed

+64
-57
lines changed

4 files changed

+64
-57
lines changed

lib/model/server_support.dart

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import '../api/core.dart';
2+
import '../api/exception.dart';
3+
import '../api/model/initial_snapshot.dart';
4+
import 'database.dart';
5+
6+
/// The fields 'zulip_version', 'zulip_merge_base', and 'zulip_feature_level'
7+
/// from a /register response.
8+
class ZulipVersionData {
9+
const ZulipVersionData({
10+
required this.zulipVersion,
11+
required this.zulipMergeBase,
12+
required this.zulipFeatureLevel,
13+
});
14+
15+
factory ZulipVersionData.fromInitialSnapshot(InitialSnapshot initialSnapshot) =>
16+
ZulipVersionData(
17+
zulipVersion: initialSnapshot.zulipVersion,
18+
zulipMergeBase: initialSnapshot.zulipMergeBase,
19+
zulipFeatureLevel: initialSnapshot.zulipFeatureLevel);
20+
21+
/// Make a [ZulipVersionData] from a [MalformedServerResponseException],
22+
/// if the body was readable/valid JSON and contained the data, else null.
23+
///
24+
/// If there's a zulip_version but no zulip_feature_level,
25+
/// we infer it's indeed a Zulip server,
26+
/// just an ancient one before feature levels were introduced in Zulip 3.0,
27+
/// and we set 0 for zulipFeatureLevel.
28+
static ZulipVersionData? fromMalformedServerResponseException(MalformedServerResponseException e) {
29+
try {
30+
final data = e.data!;
31+
return ZulipVersionData(
32+
zulipVersion: data['zulip_version'] as String,
33+
zulipMergeBase: data['zulip_merge_base'] as String?,
34+
zulipFeatureLevel: data['zulip_feature_level'] as int? ?? 0);
35+
} catch (inner) {
36+
return null;
37+
}
38+
}
39+
40+
final String zulipVersion;
41+
final String? zulipMergeBase;
42+
final int zulipFeatureLevel;
43+
44+
bool matchesAccount(Account account) =>
45+
zulipVersion == account.zulipVersion
46+
&& zulipMergeBase == account.zulipMergeBase
47+
&& zulipFeatureLevel == account.zulipFeatureLevel;
48+
49+
bool get isUnsupported => zulipFeatureLevel < kMinSupportedZulipFeatureLevel;
50+
}
51+
52+
class ServerVersionUnsupportedException implements Exception {
53+
final ZulipVersionData data;
54+
55+
ServerVersionUnsupportedException(this.data);
56+
}

lib/model/store.dart

Lines changed: 6 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import 'presence.dart';
2828
import 'realm.dart';
2929
import 'recent_dm_conversations.dart';
3030
import 'recent_senders.dart';
31+
import 'server_support.dart';
3132
import 'channel.dart';
3233
import 'saved_snippet.dart';
3334
import 'settings.dart';
@@ -208,7 +209,7 @@ abstract class GlobalStore extends ChangeNotifier {
208209
assert(account != null); // doLoadPerAccount would have thrown AccountNotFoundException
209210
final zulipLocalizations = GlobalLocalizations.zulipLocalizations;
210211
switch (e) {
211-
case _ServerVersionUnsupportedException():
212+
case ServerVersionUnsupportedException():
212213
reportErrorToUserModally(
213214
zulipLocalizations.errorCouldNotConnectTitle,
214215
message: zulipLocalizations.errorServerVersionUnsupportedMessage(
@@ -1026,9 +1027,9 @@ class UpdateMachine {
10261027
try {
10271028
initialSnapshot = await _registerQueueWithRetry(connection,
10281029
stopAndThrowIfNoAccount: stopAndThrowIfNoAccount);
1029-
} on _ServerVersionUnsupportedException catch (e) {
1030+
} on ServerVersionUnsupportedException catch (e) {
10301031
// `!` is OK because _registerQueueWithRetry would have thrown a
1031-
// not-_ServerVersionUnsupportedException if no account
1032+
// not-ServerVersionUnsupportedException if no account
10321033
final account = globalStore.getAccount(accountId)!;
10331034
if (!e.data.matchesAccount(account)) {
10341035
await globalStore.updateZulipVersionData(accountId, e.data);
@@ -1094,7 +1095,7 @@ class UpdateMachine {
10941095
case MalformedServerResponseException()
10951096
when (zulipVersionData = ZulipVersionData.fromMalformedServerResponseException(e))
10961097
?.isUnsupported == true:
1097-
throw _ServerVersionUnsupportedException(zulipVersionData!);
1098+
throw ServerVersionUnsupportedException(zulipVersionData!);
10981099
case HttpException(httpStatus: 401):
10991100
// We cannot recover from this error through retrying.
11001101
// Leave it to [GlobalStore.loadPerAccount].
@@ -1114,7 +1115,7 @@ class UpdateMachine {
11141115
stopAndThrowIfNoAccount();
11151116
final zulipVersionData = ZulipVersionData.fromInitialSnapshot(result);
11161117
if (zulipVersionData.isUnsupported) {
1117-
throw _ServerVersionUnsupportedException(zulipVersionData);
1118+
throw ServerVersionUnsupportedException(zulipVersionData);
11181119
}
11191120
return result;
11201121
}
@@ -1529,58 +1530,6 @@ class UpdateMachine {
15291530
String toString() => '${objectRuntimeType(this, 'UpdateMachine')}#${shortHash(this)}';
15301531
}
15311532

1532-
/// The fields 'zulip_version', 'zulip_merge_base', and 'zulip_feature_level'
1533-
/// from a /register response.
1534-
class ZulipVersionData {
1535-
const ZulipVersionData({
1536-
required this.zulipVersion,
1537-
required this.zulipMergeBase,
1538-
required this.zulipFeatureLevel,
1539-
});
1540-
1541-
factory ZulipVersionData.fromInitialSnapshot(InitialSnapshot initialSnapshot) =>
1542-
ZulipVersionData(
1543-
zulipVersion: initialSnapshot.zulipVersion,
1544-
zulipMergeBase: initialSnapshot.zulipMergeBase,
1545-
zulipFeatureLevel: initialSnapshot.zulipFeatureLevel);
1546-
1547-
/// Make a [ZulipVersionData] from a [MalformedServerResponseException],
1548-
/// if the body was readable/valid JSON and contained the data, else null.
1549-
///
1550-
/// If there's a zulip_version but no zulip_feature_level,
1551-
/// we infer it's indeed a Zulip server,
1552-
/// just an ancient one before feature levels were introduced in Zulip 3.0,
1553-
/// and we set 0 for zulipFeatureLevel.
1554-
static ZulipVersionData? fromMalformedServerResponseException(MalformedServerResponseException e) {
1555-
try {
1556-
final data = e.data!;
1557-
return ZulipVersionData(
1558-
zulipVersion: data['zulip_version'] as String,
1559-
zulipMergeBase: data['zulip_merge_base'] as String?,
1560-
zulipFeatureLevel: data['zulip_feature_level'] as int? ?? 0);
1561-
} catch (inner) {
1562-
return null;
1563-
}
1564-
}
1565-
1566-
final String zulipVersion;
1567-
final String? zulipMergeBase;
1568-
final int zulipFeatureLevel;
1569-
1570-
bool matchesAccount(Account account) =>
1571-
zulipVersion == account.zulipVersion
1572-
&& zulipMergeBase == account.zulipMergeBase
1573-
&& zulipFeatureLevel == account.zulipFeatureLevel;
1574-
1575-
bool get isUnsupported => zulipFeatureLevel < kMinSupportedZulipFeatureLevel;
1576-
}
1577-
1578-
class _ServerVersionUnsupportedException implements Exception {
1579-
final ZulipVersionData data;
1580-
1581-
_ServerVersionUnsupportedException(this.data);
1582-
}
1583-
15841533
class _EventHandlingException implements Exception {
15851534
final Object cause;
15861535
final Event event;

test/model/store_checks.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:zulip/model/autocomplete.dart';
66
import 'package:zulip/model/binding.dart';
77
import 'package:zulip/model/database.dart';
88
import 'package:zulip/model/recent_dm_conversations.dart';
9+
import 'package:zulip/model/server_support.dart';
910
import 'package:zulip/model/settings.dart';
1011
import 'package:zulip/model/store.dart';
1112
import 'package:zulip/model/unreads.dart';

test/model/store_test.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import 'package:zulip/api/route/realm.dart';
1717
import 'package:zulip/log.dart';
1818
import 'package:zulip/model/actions.dart';
1919
import 'package:zulip/model/presence.dart';
20+
import 'package:zulip/model/server_support.dart';
2021
import 'package:zulip/model/store.dart';
2122
import 'package:zulip/notifications/receive.dart';
2223

0 commit comments

Comments
 (0)