import 'dart:convert'; import 'dart:io'; import 'package:PiliPlus/services/logger.dart'; import 'package:catcher_2/catcher_2.dart'; class JsonFileHandler extends ReportHandler { final bool enableDeviceParameters; final bool enableApplicationParameters; final bool enableStackTrace; final bool enableCustomParameters; final bool printLogs; final bool handleWhenRejected; static Future _future = LoggerUtils.getLogsPath() .then((file) => file.open(mode: FileMode.writeOnlyAppend)) .then((raf) => raf.writeFrom(const [])) .then(_flush); JsonFileHandler._({ this.enableDeviceParameters = true, this.enableApplicationParameters = true, this.enableStackTrace = true, this.enableCustomParameters = true, this.printLogs = false, this.handleWhenRejected = false, }); static Future init({ bool enableDeviceParameters = true, bool enableApplicationParameters = true, bool enableStackTrace = true, bool enableCustomParameters = true, bool printLogs = false, bool handleWhenRejected = false, }) async { try { await _future; return JsonFileHandler._( enableDeviceParameters: enableDeviceParameters, enableApplicationParameters: enableApplicationParameters, enableStackTrace: enableStackTrace, enableCustomParameters: enableCustomParameters, printLogs: printLogs, handleWhenRejected: handleWhenRejected, ); } catch (e, s) { logger.e('Init log file', error: e, stackTrace: s); return null; } } static Future _flush(RandomAccessFile raf) => raf.flush(); static Future add( Future Function(RandomAccessFile) onValue, ) { return _future = _future.then(onValue).then(_flush); } @override Future handle(Report report) async { try { await _processReport(report); return true; } catch (exc, stackTrace) { logger.e( 'Write Json Exception occurred', error: exc, stackTrace: stackTrace, ); return false; } } Future _processReport(Report report) { if (printLogs) { logger.d('Writing report to file'); } final json = report.toJson( enableDeviceParameters: enableDeviceParameters, enableApplicationParameters: enableApplicationParameters, enableStackTrace: enableStackTrace, enableCustomParameters: enableCustomParameters, ); return add((raf) => raf.writeString('${jsonEncode(json)}\n')); } }