Skip to content

Commit f40ea11

Browse files
committed
Fix web issues
1 parent 5530971 commit f40ea11

File tree

4 files changed

+37
-25
lines changed

4 files changed

+37
-25
lines changed

app/lib/services/network.dart

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,26 +12,27 @@ const kBroadcastDelay = Duration(seconds: 1);
1212

1313
class NetworkService {
1414
final SettingsCubit settingsCubit;
15-
late final RawDatagramSocket _server;
15+
RawDatagramSocket? _server;
1616

1717
final BehaviorSubject<List<(GameServer, LanProperty?)>> _servers =
1818
BehaviorSubject.seeded([]);
1919

2020
NetworkService(this.settingsCubit);
2121

2222
Future<void> init() async {
23-
if (kIsWeb) return;
24-
_server =
25-
await RawDatagramSocket.bind(InternetAddress.anyIPv4, kBroadcastPort);
26-
_server.broadcastEnabled = true;
23+
if (!kIsWeb) {
24+
_server = (await RawDatagramSocket.bind(
25+
InternetAddress.anyIPv4, kBroadcastPort))
26+
..broadcastEnabled = true;
27+
}
2728
_fetchServers().listen((event) {
2829
_servers.add(event);
2930
});
3031
}
3132

3233
void dispose() {
3334
if (kIsWeb) return;
34-
_server.close();
35+
_server?.close();
3536
}
3637

3738
Stream<List<(GameServer, LanProperty?)>> _fetchServers({
@@ -56,12 +57,17 @@ class NetworkService {
5657
});
5758
}
5859

59-
if (kIsWeb) return;
60+
final settingsStream = settingsCubit.stream.map((event) => buildServers());
61+
62+
if (kIsWeb) {
63+
yield* settingsStream;
64+
return;
65+
}
6066
final serverStream = _server
61-
.where((event) => event == RawSocketEvent.read)
67+
?.where((event) => event == RawSocketEvent.read)
6268
.map((RawSocketEvent event) {
6369
removeOld();
64-
final datagram = _server.receive();
70+
final datagram = _server?.receive();
6571
if (datagram != null) {
6672
final message = String.fromCharCodes(datagram.data);
6773
final property = LanPropertyMapper.fromJson(message);
@@ -79,8 +85,7 @@ class NetworkService {
7985
.toList(),
8086
);
8187
});
82-
final settingsStream = settingsCubit.stream.map((event) => buildServers());
83-
yield* Rx.merge([serverStream, settingsStream]);
88+
yield* Rx.merge([if (serverStream != null) serverStream, settingsStream]);
8489
}
8590

8691
(Timer, RawDatagramSocket)? _broadcast;
@@ -109,12 +114,17 @@ class NetworkService {
109114
}
110115

111116
Future<GameProperty?> fetchInfo(Uri address) async {
112-
final response = await http.get(address, headers: {
113-
HttpHeaders.contentTypeHeader: 'application/json',
114-
'X-Quokka-Method': 'info',
115-
});
117+
try {
118+
final response = await http.get(address, headers: {
119+
HttpHeaders.contentTypeHeader: 'application/json',
120+
'X-Quokka-Method': 'info',
121+
});
122+
if (response.statusCode != HttpStatus.ok) return null;
116123

117-
return GamePropertyMapper.fromJson(response.body);
124+
return GamePropertyMapper.fromJson(response.body);
125+
} catch (_) {
126+
return null;
127+
}
118128
}
119129

120130
Stream<Map<GameServer, GameProperty?>> fetchServersWithProperties({
@@ -135,26 +145,27 @@ class NetworkService {
135145
}
136146

137147
final returned = <GameServer, GameProperty?>{};
148+
yield returned;
138149

139150
await for (final event in _servers) {
140151
returned.removeWhere((key, value) => !event.any((e) => e.$1 == key));
141152
for (final (server, _) in event) {
142153
returned[server] = const GameProperty();
143154
}
155+
yield returned;
144156

145157
if (event.isEmpty) {
146-
yield returned;
147158
continue;
148159
}
149160

150-
yield* Stream.fromFutures(event.map((e) async {
161+
for (final e in event) {
151162
try {
152163
returned[e.$1] = await fetch(e.$1, e.$2);
153164
} catch (_) {
154165
returned[e.$1] = null;
155166
}
156-
return returned;
157-
}));
167+
yield returned;
168+
}
158169
}
159170
}
160171
}

app/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ version: 0.1.0+1
1515
publish_to: none
1616

1717
environment:
18-
sdk: ">=3.0.0 <4.0.0"
18+
sdk: ">=3.5.0 <4.0.0"
1919
flutter: 3.24.3
2020

2121
dependencies:

app/scripts/build.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
FLUTTER_VERSION=$(grep -oP 'flutter:\s*\K\d+\.\d+\.\d+' pubspec.yaml)
22
QUOKKA_FLAVOR=$([[ "$QUOKKA_NIGHTLY" == "true" ]] && echo "nightly" || echo "stable")
3-
if [ "$QUOKKA_NIGHTLY" = "true" ]; then cp -r web_nightly/** web; fi && if cd flutter; then git pull && cd ..; else git clone https://github.com/flutter/flutter.git -b $FLUTTER_VERSION; fi && flutter/bin/flutter config --enable-web && cd ../tools && ../app/flutter/bin/dart pub get && cd .. && app/flutter/bin/dart run tools/generate.dart && cd app && flutter/bin/flutter pub get && flutter/bin/dart run build_runner build --delete-conflicting-outputs && flutter/bin/flutter build web --wasm --release --dart-define=FLUTTER_WEB_CANVASKIT_URL=/canvaskit/ --dart-define=flavor=$QUOKKA_FLAVOR
3+
if [ "$QUOKKA_NIGHTLY" = "true" ]; then cp -r web_nightly/** web; fi && if cd flutter; then git pull && cd ..; else git clone https://github.com/flutter/flutter.git -b $FLUTTER_VERSION; fi && flutter/bin/flutter config --enable-web && cd ../tools && ../app/flutter/bin/dart pub get && cd .. && app/flutter/bin/dart run tools/generate.dart && cd app && flutter/bin/flutter pub get && flutter/bin/dart run build_runner build --delete-conflicting-outputs && flutter/bin/flutter build web --wasm --release --no-web-resources-cdn --dart-define=flavor=$QUOKKA_FLAVOR

server/lib/src/server.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,8 @@ final class QuokkaServer extends Bloc<PlayableWorldEvent, WorldState> {
170170
await _server?.onClosed.first;
171171
}
172172

173-
void _onClientEvent(NetworkerPacket<WorldEvent?> packet) async {
173+
void _onClientEvent(NetworkerPacket<WorldEvent?> packet,
174+
[bool force = false]) async {
174175
final data = packet.data;
175176
(ServerWorldEvent, Channel)? process;
176177
try {
@@ -232,8 +233,8 @@ final class QuokkaServer extends Bloc<PlayableWorldEvent, WorldState> {
232233
consoler.dispose();
233234
}
234235

235-
void process(WorldEvent event) {
236-
_onClientEvent(NetworkerPacket(event, kAuthorityChannel));
236+
void process(WorldEvent event, [bool force = false]) {
237+
_onClientEvent(NetworkerPacket(event, kAuthorityChannel), force);
237238
}
238239

239240
bool kick(int id) {

0 commit comments

Comments
 (0)