Files
firka/firka/lib/core/firka_bundle.dart
2026-02-28 07:47:33 +01:00

63 lines
1.7 KiB
Dart

import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:brotli/brotli.dart';
import 'package:firka/app/app_state.dart';
import 'package:flutter/services.dart';
class FirkaBundle extends CachingAssetBundle {
// final bool _compressedBundle = !kDebugMode && Platform.isAndroid;
final bool _compressedBundle = false;
Map<String, dynamic>? index;
Future<Map<String, dynamic>> loadIndex() async {
var indexBrotli = await rootBundle.load("assets/firka.i");
var indexStr = brotli.decodeToString(indexBrotli.buffer.asInt8List());
return Future.value(jsonDecode(indexStr));
}
ByteData decode(Codec<List<int>, List<int>> codec, ByteData data) {
var dec = codec.decode(data.buffer.asInt8List());
var b = ByteData(dec.length);
var l = b.buffer.asInt8List();
for (var i = 0; i < dec.length; i++) {
l[i] = dec[i];
}
return b;
}
@override
Future<ByteData> load(String key) async {
if (!_compressedBundle) {
logger.finest(
"Loading asset from root bundle: assets/flutter_assets/$key",
);
return rootBundle.load(key);
} else {
index ??= await loadIndex();
final gzip = GZipCodec();
logger.finest(
"Loading asset from firka bundle: assets/flutter_assets/$key",
);
switch (index!["assets/flutter_assets/$key"]!) {
case "b": // brotli
return decode(brotli, await rootBundle.load(key));
case "g": // gzip
return decode(gzip, await rootBundle.load(key));
case "r": // raw
return rootBundle.load(key);
default:
logger.shout("Unknown file format: ${index![key]!}");
throw "Unknown file format: ${index![key]!}";
}
}
}
}