import 'dart:io'; import 'package:flutter/services.dart'; import 'package:path_provider/path_provider.dart'; final class SingBoxRuntime { static const String _linuxAssetPath = 'assets/sing-box/linux-amd64/sing-box'; String? _cachedBinaryPath; Future ensureBinary() async { if (_cachedBinaryPath != null) { final cachedFile = File(_cachedBinaryPath!); if (await cachedFile.exists()) { return _cachedBinaryPath!; } } if (!Platform.isLinux) { throw UnsupportedError('Sing-box runtime currently supports Linux only'); } final appDir = await getApplicationSupportDirectory(); final runtimeDir = Directory( '${appDir.path}${Platform.pathSeparator}sing-box-runtime', ); if (!await runtimeDir.exists()) { await runtimeDir.create(recursive: true); } final binaryPath = '${runtimeDir.path}${Platform.pathSeparator}sing-box'; final binaryFile = File(binaryPath); final ByteData byteData = await rootBundle.load(_linuxAssetPath); await binaryFile.writeAsBytes( byteData.buffer.asUint8List(), flush: true, ); await Process.run('chmod', ['755', binaryPath]); _cachedBinaryPath = binaryPath; return binaryPath; } Future configPath() async { final appDir = await getApplicationSupportDirectory(); final runtimeDir = Directory( '${appDir.path}${Platform.pathSeparator}sing-box-runtime', ); if (!await runtimeDir.exists()) { await runtimeDir.create(recursive: true); } return '${runtimeDir.path}${Platform.pathSeparator}config.json'; } }