From f40ea11070063c5c82f265919b6d07da5763ca98 Mon Sep 17 00:00:00 2001 From: CodeDoctorDE Date: Mon, 7 Oct 2024 12:52:20 +0200 Subject: [PATCH] Fix web issues --- app/lib/services/network.dart | 51 +++++++++++++++++++++-------------- app/pubspec.yaml | 2 +- app/scripts/build.sh | 2 +- server/lib/src/server.dart | 7 ++--- 4 files changed, 37 insertions(+), 25 deletions(-) diff --git a/app/lib/services/network.dart b/app/lib/services/network.dart index 82a4479..1e2021f 100644 --- a/app/lib/services/network.dart +++ b/app/lib/services/network.dart @@ -12,7 +12,7 @@ const kBroadcastDelay = Duration(seconds: 1); class NetworkService { final SettingsCubit settingsCubit; - late final RawDatagramSocket _server; + RawDatagramSocket? _server; final BehaviorSubject> _servers = BehaviorSubject.seeded([]); @@ -20,10 +20,11 @@ class NetworkService { NetworkService(this.settingsCubit); Future init() async { - if (kIsWeb) return; - _server = - await RawDatagramSocket.bind(InternetAddress.anyIPv4, kBroadcastPort); - _server.broadcastEnabled = true; + if (!kIsWeb) { + _server = (await RawDatagramSocket.bind( + InternetAddress.anyIPv4, kBroadcastPort)) + ..broadcastEnabled = true; + } _fetchServers().listen((event) { _servers.add(event); }); @@ -31,7 +32,7 @@ class NetworkService { void dispose() { if (kIsWeb) return; - _server.close(); + _server?.close(); } Stream> _fetchServers({ @@ -56,12 +57,17 @@ class NetworkService { }); } - if (kIsWeb) return; + final settingsStream = settingsCubit.stream.map((event) => buildServers()); + + if (kIsWeb) { + yield* settingsStream; + return; + } final serverStream = _server - .where((event) => event == RawSocketEvent.read) + ?.where((event) => event == RawSocketEvent.read) .map((RawSocketEvent event) { removeOld(); - final datagram = _server.receive(); + final datagram = _server?.receive(); if (datagram != null) { final message = String.fromCharCodes(datagram.data); final property = LanPropertyMapper.fromJson(message); @@ -79,8 +85,7 @@ class NetworkService { .toList(), ); }); - final settingsStream = settingsCubit.stream.map((event) => buildServers()); - yield* Rx.merge([serverStream, settingsStream]); + yield* Rx.merge([if (serverStream != null) serverStream, settingsStream]); } (Timer, RawDatagramSocket)? _broadcast; @@ -109,12 +114,17 @@ class NetworkService { } Future fetchInfo(Uri address) async { - final response = await http.get(address, headers: { - HttpHeaders.contentTypeHeader: 'application/json', - 'X-Quokka-Method': 'info', - }); + try { + final response = await http.get(address, headers: { + HttpHeaders.contentTypeHeader: 'application/json', + 'X-Quokka-Method': 'info', + }); + if (response.statusCode != HttpStatus.ok) return null; - return GamePropertyMapper.fromJson(response.body); + return GamePropertyMapper.fromJson(response.body); + } catch (_) { + return null; + } } Stream> fetchServersWithProperties({ @@ -135,26 +145,27 @@ class NetworkService { } final returned = {}; + yield returned; await for (final event in _servers) { returned.removeWhere((key, value) => !event.any((e) => e.$1 == key)); for (final (server, _) in event) { returned[server] = const GameProperty(); } + yield returned; if (event.isEmpty) { - yield returned; continue; } - yield* Stream.fromFutures(event.map((e) async { + for (final e in event) { try { returned[e.$1] = await fetch(e.$1, e.$2); } catch (_) { returned[e.$1] = null; } - return returned; - })); + yield returned; + } } } } diff --git a/app/pubspec.yaml b/app/pubspec.yaml index 00682fc..33b1fb5 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -15,7 +15,7 @@ version: 0.1.0+1 publish_to: none environment: - sdk: ">=3.0.0 <4.0.0" + sdk: ">=3.5.0 <4.0.0" flutter: 3.24.3 dependencies: diff --git a/app/scripts/build.sh b/app/scripts/build.sh index 0eb0adb..9552e6e 100644 --- a/app/scripts/build.sh +++ b/app/scripts/build.sh @@ -1,3 +1,3 @@ FLUTTER_VERSION=$(grep -oP 'flutter:\s*\K\d+\.\d+\.\d+' pubspec.yaml) QUOKKA_FLAVOR=$([[ "$QUOKKA_NIGHTLY" == "true" ]] && echo "nightly" || echo "stable") -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/server/lib/src/server.dart b/server/lib/src/server.dart index 7a073cb..01309ab 100644 --- a/server/lib/src/server.dart +++ b/server/lib/src/server.dart @@ -170,7 +170,8 @@ final class QuokkaServer extends Bloc { await _server?.onClosed.first; } - void _onClientEvent(NetworkerPacket packet) async { + void _onClientEvent(NetworkerPacket packet, + [bool force = false]) async { final data = packet.data; (ServerWorldEvent, Channel)? process; try { @@ -232,8 +233,8 @@ final class QuokkaServer extends Bloc { consoler.dispose(); } - void process(WorldEvent event) { - _onClientEvent(NetworkerPacket(event, kAuthorityChannel)); + void process(WorldEvent event, [bool force = false]) { + _onClientEvent(NetworkerPacket(event, kAuthorityChannel), force); } bool kick(int id) {