Initial flame_lua_runtime package
This commit is contained in:
86
lib/runtime/packages/stable_package_store.dart
Normal file
86
lib/runtime/packages/stable_package_store.dart
Normal file
@@ -0,0 +1,86 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:path/path.dart' as p;
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
|
||||
import '../game/runtime_options.dart';
|
||||
import 'game_package.dart';
|
||||
import 'game_package_manifest.dart';
|
||||
|
||||
class StablePackageStore {
|
||||
const StablePackageStore({
|
||||
RuntimeOptions runtimeOptions = const RuntimeOptions(),
|
||||
}) : _runtimeOptions = runtimeOptions;
|
||||
|
||||
final RuntimeOptions _runtimeOptions;
|
||||
|
||||
Future<Directory> cacheRoot() async {
|
||||
final support = await getApplicationSupportDirectory();
|
||||
final root = Directory(p.join(support.path, 'flame_lua_packages'));
|
||||
root.createSync(recursive: true);
|
||||
return root;
|
||||
}
|
||||
|
||||
Future<Directory> versionDirectory(String gameId, String version) async {
|
||||
final root = await cacheRoot();
|
||||
return Directory(p.join(root.path, gameId, version));
|
||||
}
|
||||
|
||||
Future<void> markStable(GamePackage package) async {
|
||||
if (package.source != GamePackageSource.file) {
|
||||
return;
|
||||
}
|
||||
final marker = await _markerFile(package.manifest.gameId);
|
||||
marker.createSync(recursive: true);
|
||||
final previous = await stablePackage(package.manifest.gameId);
|
||||
final data = {
|
||||
'current': package.rootPath,
|
||||
if (previous != null && previous.rootPath != package.rootPath)
|
||||
'previous': previous.rootPath,
|
||||
};
|
||||
marker.writeAsStringSync(const JsonEncoder.withIndent(' ').convert(data));
|
||||
}
|
||||
|
||||
Future<GamePackage?> stablePackage(String gameId) async {
|
||||
final marker = await _markerFile(gameId);
|
||||
if (!marker.existsSync()) {
|
||||
return null;
|
||||
}
|
||||
final data =
|
||||
jsonDecode(await marker.readAsString()) as Map<String, Object?>;
|
||||
return _packageFromPath(data['current']);
|
||||
}
|
||||
|
||||
Future<GamePackage?> previousStablePackage(String gameId) async {
|
||||
final marker = await _markerFile(gameId);
|
||||
if (!marker.existsSync()) {
|
||||
return null;
|
||||
}
|
||||
final data =
|
||||
jsonDecode(await marker.readAsString()) as Map<String, Object?>;
|
||||
return _packageFromPath(data['previous']);
|
||||
}
|
||||
|
||||
Future<File> _markerFile(String gameId) async {
|
||||
final root = await cacheRoot();
|
||||
return File(p.join(root.path, gameId, 'stable.json'));
|
||||
}
|
||||
|
||||
GamePackage? _packageFromPath(Object? pathValue) {
|
||||
if (pathValue is! String || pathValue.isEmpty) {
|
||||
return null;
|
||||
}
|
||||
final manifestFile = File(p.join(pathValue, 'manifest.json'));
|
||||
if (!manifestFile.existsSync()) {
|
||||
return null;
|
||||
}
|
||||
return GamePackage.file(
|
||||
rootPath: pathValue,
|
||||
manifest: GamePackageManifest.fromJsonString(
|
||||
manifestFile.readAsStringSync(),
|
||||
),
|
||||
runtimeLuaRoot: _runtimeOptions.runtimeLuaRoot,
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user