From 5c5ae4a6ecac10222dc7cef2bce2f76801f29b2b Mon Sep 17 00:00:00 2001 From: ZhuchkaTriplesix Date: Wed, 29 Jul 2026 11:42:17 +0300 Subject: [PATCH] perf: offload heavy JSON decoding to isolate Resolves #538 --- lib/core/market/http_marketplace_repository.dart | 7 +++++-- lib/core/updater/github_releases_client.dart | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/core/market/http_marketplace_repository.dart b/lib/core/market/http_marketplace_repository.dart index e49694fb..0321021e 100644 --- a/lib/core/market/http_marketplace_repository.dart +++ b/lib/core/market/http_marketplace_repository.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; +import 'dart:isolate'; import 'package:archive/archive.dart'; import 'package:flutter/foundation.dart'; import 'package:http/http.dart' as http; @@ -72,7 +73,8 @@ class HttpMarketplaceRepository implements MarketplaceRepository { if (response.statusCode != 200) { throw MarketplaceException('Failed to load trending extensions (HTTP ${response.statusCode})'); } - final List data = jsonDecode(response.body) as List; + final body = response.body; + final List data = await Isolate.run(() => jsonDecode(body)) as List; return data.map((json) => ExtensionManifest.fromJson(json as Map)).toList(); } @@ -89,7 +91,8 @@ class HttpMarketplaceRepository implements MarketplaceRepository { if (response.statusCode != 200) { throw MarketplaceException('Search failed (HTTP ${response.statusCode})'); } - final List data = jsonDecode(response.body) as List; + final body = response.body; + final List data = await Isolate.run(() => jsonDecode(body)) as List; return data.map((json) => ExtensionManifest.fromJson(json as Map)).toList(); } diff --git a/lib/core/updater/github_releases_client.dart b/lib/core/updater/github_releases_client.dart index a22fed25..d262040e 100644 --- a/lib/core/updater/github_releases_client.dart +++ b/lib/core/updater/github_releases_client.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:isolate'; import 'package:http/http.dart' as http; @@ -28,7 +29,8 @@ class GitHubReleasesClient { 'GitHub Releases API returned HTTP ${response.statusCode}', ); } - final decoded = jsonDecode(response.body); + final body = response.body; + final decoded = await Isolate.run(() => jsonDecode(body)); if (decoded is! Map) { throw const GitHubReleasesException('Unexpected GitHub Releases payload'); } @@ -41,7 +43,8 @@ class GitHubReleasesClient { 'GitHub Releases API returned HTTP ${response.statusCode}', ); } - final decoded = jsonDecode(response.body); + final body = response.body; + final decoded = await Isolate.run(() => jsonDecode(body)); if (decoded is! List) { throw const GitHubReleasesException('Unexpected GitHub Releases list payload'); }