Refactor app update

This commit is contained in:
problematicconsumer
2023-09-20 22:38:38 +03:30
parent 59365653b8
commit 8958c72fe6
11 changed files with 210 additions and 23 deletions

View File

@@ -0,0 +1,74 @@
import 'dart:async';
import 'package:dartx/dartx.dart';
import 'package:hiddify/utils/custom_loggers.dart';
import 'package:neat_periodic_task/neat_periodic_task.dart';
import 'package:shared_preferences/shared_preferences.dart';
const _cronKeyPrefix = "cron_";
typedef Job<T> = (
String key,
Duration duration,
FutureOr<T?> Function() callback,
);
class CronService with InfraLogger {
CronService(this.prefs);
final SharedPreferences prefs;
NeatPeriodicTaskScheduler? _scheduler;
Map<String, Job> jobs = {};
void schedule<T>({
required String key,
required Duration duration,
required FutureOr<T?> Function() callback,
}) {
loggy.debug("scheduling [$key]");
jobs[key] = (key, duration, callback);
_scheduler?.trigger();
}
Future<void> run(Job job) async {
final key = job.$1;
final prefKey = "$_cronKeyPrefix$key";
final previousRunTime = DateTime.tryParse(prefs.getString(prefKey) ?? "");
loggy.debug(
"[$key] > ${previousRunTime == null ? "first run" : "previous run on [$previousRunTime]"}",
);
if (previousRunTime != null &&
previousRunTime.add(job.$2) > DateTime.now()) {
loggy.debug("[$key] > didn't meet criteria");
return;
}
final result = await job.$3();
await prefs.setString(prefKey, DateTime.now().toIso8601String());
return result;
}
Future<void> startScheduler() async {
loggy.debug("starting job scheduler");
await _scheduler?.stop();
int runCount = 0;
_scheduler = NeatPeriodicTaskScheduler(
name: "cron job scheduler",
interval: const Duration(minutes: 5),
timeout: const Duration(seconds: 15),
minCycle: const Duration(minutes: 1),
task: () {
loggy.debug("in run ${runCount++}");
return Future.wait(jobs.values.map(run));
},
);
_scheduler!.start();
}
Future<void> stopScheduler() async {
loggy.debug("stopping job scheduler");
return _scheduler?.stop();
}
}

View File

@@ -1,3 +1,5 @@
import 'package:hiddify/data/data_providers.dart';
import 'package:hiddify/services/cron_service.dart';
import 'package:hiddify/services/files_editor_service.dart';
import 'package:hiddify/services/platform_settings.dart';
import 'package:hiddify/services/singbox/singbox_service.dart';
@@ -15,3 +17,10 @@ SingboxService singboxService(SingboxServiceRef ref) => SingboxService();
@riverpod
PlatformSettings platformSettings(PlatformSettingsRef ref) =>
PlatformSettings();
@Riverpod(keepAlive: true)
CronService cronService(CronServiceRef ref) {
final service = CronService(ref.watch(sharedPreferencesProvider));
ref.onDispose(() => service.stopScheduler());
return service;
}