Files
umbrix/lib/singbox/service/singbox_service.dart

96 lines
3.0 KiB
Dart
Raw Normal View History

2023-12-01 12:56:24 +03:30
import 'dart:io';
import 'package:fpdart/fpdart.dart';
import 'package:umbrix/core/model/directories.dart';
import 'package:umbrix/singbox/model/singbox_config_option.dart';
import 'package:umbrix/singbox/model/singbox_outbound.dart';
import 'package:umbrix/singbox/model/singbox_stats.dart';
import 'package:umbrix/singbox/model/singbox_status.dart';
import 'package:umbrix/singbox/model/warp_account.dart';
import 'package:umbrix/singbox/service/ffi_singbox_service.dart';
import 'package:umbrix/singbox/service/platform_singbox_service.dart';
2023-12-01 12:56:24 +03:30
abstract interface class SingboxService {
factory SingboxService() {
if (Platform.isAndroid || Platform.isIOS) {
return PlatformSingboxService();
} else if (Platform.isLinux || Platform.isWindows || Platform.isMacOS) {
return FFISingboxService();
}
throw Exception("unsupported platform");
}
Future<void> init();
2024-02-13 17:02:10 +03:30
/// setup directories and other initial platform services
2023-12-01 12:56:24 +03:30
TaskEither<String, Unit> setup(
Directories directories,
bool debug,
);
2024-02-13 17:02:10 +03:30
/// validates config by path and save it
///
/// [path] is used to save validated config
/// [tempPath] includes base config, possibly invalid
/// [debug] indicates if debug mode (avoid in prod)
2023-12-01 12:56:24 +03:30
TaskEither<String, Unit> validateConfigByPath(
String path,
String tempPath,
bool debug,
);
TaskEither<String, Unit> changeOptions(SingboxConfigOption options);
2024-02-13 17:02:10 +03:30
/// generates full sing-box configuration
///
/// [path] is the path to the base config file
/// returns full patched json config file as string
TaskEither<String, String> generateFullConfigByPath(String path);
/// start sing-box service
///
/// [path] is the path to the base config file (to be patched by previously set [SingboxConfigOption])
/// [name] is the name of the active profile (not unique, used for presentation in platform specific ui)
/// [disableMemoryLimit] is used to disable service memory limit (mostly used in mobile platforms i.e. iOS)
2023-12-14 14:50:10 +03:30
TaskEither<String, Unit> start(
String path,
String name,
bool disableMemoryLimit,
);
2023-12-01 12:56:24 +03:30
TaskEither<String, Unit> stop();
2024-02-13 17:02:10 +03:30
/// similar to [start], but uses platform dependent behavior to restart the service
2023-12-14 14:50:10 +03:30
TaskEither<String, Unit> restart(
String path,
String name,
bool disableMemoryLimit,
);
2023-12-01 12:56:24 +03:30
2024-01-18 22:53:17 +03:30
TaskEither<String, Unit> resetTunnel();
2024-02-13 17:02:10 +03:30
Stream<List<SingboxOutboundGroup>> watchGroups();
2023-12-01 12:56:24 +03:30
2024-02-13 17:02:10 +03:30
Stream<List<SingboxOutboundGroup>> watchActiveGroups();
2024-02-09 12:02:52 +03:30
2023-12-01 12:56:24 +03:30
TaskEither<String, Unit> selectOutbound(String groupTag, String outboundTag);
TaskEither<String, Unit> urlTest(String groupTag);
2024-02-13 17:02:10 +03:30
/// watch status of sing-box service (started, starting, etc.)
2023-12-01 12:56:24 +03:30
Stream<SingboxStatus> watchStatus();
2024-02-13 17:02:10 +03:30
/// watch stats of sing-box service (uplink, downlink, etc.)
2023-12-01 12:56:24 +03:30
Stream<SingboxStats> watchStats();
Stream<List<String>> watchLogs(String path);
TaskEither<String, Unit> clearLogs();
2024-02-18 12:35:11 +03:30
2024-02-20 22:16:47 +03:30
TaskEither<String, WarpResponse> generateWarpConfig({
2024-02-18 12:35:11 +03:30
required String licenseKey,
required String previousAccountId,
required String previousAccessToken,
});
2023-12-01 12:56:24 +03:30
}