Files
umbrix/lib/features/log/data/log_repository.dart

71 lines
2.2 KiB
Dart
Raw Normal View History

2023-11-28 18:24:31 +03:30
import 'package:fpdart/fpdart.dart';
2023-12-01 12:56:24 +03:30
import 'package:hiddify/core/utils/exception_handler.dart';
2023-11-28 18:24:31 +03:30
import 'package:hiddify/features/log/data/log_parser.dart';
import 'package:hiddify/features/log/data/log_path_resolver.dart';
import 'package:hiddify/features/log/model/log_entity.dart';
import 'package:hiddify/features/log/model/log_failure.dart';
2023-12-01 12:56:24 +03:30
import 'package:hiddify/singbox/service/singbox_service.dart';
2023-11-28 18:24:31 +03:30
import 'package:hiddify/utils/custom_loggers.dart';
abstract interface class LogRepository {
TaskEither<LogFailure, Unit> init();
Stream<Either<LogFailure, List<LogEntity>>> watchLogs();
TaskEither<LogFailure, Unit> clearLogs();
}
class LogRepositoryImpl
with ExceptionHandler, InfraLogger
implements LogRepository {
LogRepositoryImpl({
required this.singbox,
required this.logPathResolver,
});
final SingboxService singbox;
final LogPathResolver logPathResolver;
@override
TaskEither<LogFailure, Unit> init() {
return exceptionHandler(
() async {
if (!await logPathResolver.directory.exists()) {
await logPathResolver.directory.create(recursive: true);
}
if (await logPathResolver.coreFile().exists()) {
await logPathResolver.coreFile().writeAsString("");
} else {
await logPathResolver.coreFile().create(recursive: true);
}
if (await logPathResolver.appFile().exists()) {
await logPathResolver.appFile().writeAsString("");
} else {
await logPathResolver.appFile().create(recursive: true);
}
return right(unit);
},
LogUnexpectedFailure.new,
);
}
@override
Stream<Either<LogFailure, List<LogEntity>>> watchLogs() {
return singbox
.watchLogs(logPathResolver.coreFile().path)
.map((event) => event.map(LogParser.parseSingbox).toList())
.handleExceptions(
(error, stackTrace) {
loggy.warning("error watching logs", error, stackTrace);
return LogFailure.unexpected(error, stackTrace);
},
);
}
@override
TaskEither<LogFailure, Unit> clearLogs() {
return exceptionHandler(
() => singbox.clearLogs().mapLeft(LogFailure.unexpected).run(),
LogFailure.unexpected,
);
}
}