chore: add proper error handling

This commit is contained in:
Kingkor Roy Tirtho 2025-05-01 23:51:22 +06:00
parent 7491175bb6
commit 9a861b9954

View File

@ -1,6 +1,8 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'package:flutter_js/extensions/fetch.dart';
import 'package:flutter_js/extensions/xhr.dart';
import 'package:flutter_js/flutter_js.dart'; import 'package:flutter_js/flutter_js.dart';
import 'package:spotube/models/metadata/metadata.dart'; import 'package:spotube/models/metadata/metadata.dart';
import 'package:spotube/services/logger/logger.dart'; import 'package:spotube/services/logger/logger.dart';
@ -11,11 +13,14 @@ const int defaultMetadataOffset = 0;
/// Signature for metadata and related methods that will return Spotube native /// Signature for metadata and related methods that will return Spotube native
/// objects e.g. SpotubeTrack, SpotubePlaylist, etc. /// objects e.g. SpotubeTrack, SpotubePlaylist, etc.
class MetadataApiSignature { class MetadataApiSignature {
late final JavascriptRuntime runtime; final JavascriptRuntime runtime;
MetadataApiSignature(String libraryCode) { MetadataApiSignature._(this.runtime);
runtime = getJavascriptRuntime(xhr: true);
static Future<MetadataApiSignature> init(String libraryCode) async {
final runtime = getJavascriptRuntime(xhr: true).enableXhr();
runtime.enableHandlePromises(); runtime.enableHandlePromises();
await runtime.enableFetch();
Timer.periodic( Timer.periodic(
const Duration(milliseconds: 100), const Duration(milliseconds: 100),
@ -24,12 +29,20 @@ class MetadataApiSignature {
}, },
); );
runtime.evaluate( final res = runtime.evaluate(
""" """
;$libraryCode; ;$libraryCode;
const metadataApi = new MetadataApi(); const metadataApi = new MetadataApi();
""", """,
); );
if (res.isError) {
AppLogger.reportError(
"Error evaluating code: $libraryCode\n${res.rawResult}",
);
}
return MetadataApiSignature._(runtime);
} }
void dispose() { void dispose() {
@ -40,8 +53,8 @@ class MetadataApiSignature {
final completer = Completer(); final completer = Completer();
runtime.onMessage(method, (result) { runtime.onMessage(method, (result) {
try { try {
if (result == null) { if (result is Map && result.containsKey("error")) {
completer.completeError("Result is null"); completer.completeError(result["error"]);
} else { } else {
completer.complete(result is String ? jsonDecode(result) : result); completer.complete(result is String ? jsonDecode(result) : result);
} }
@ -52,13 +65,19 @@ class MetadataApiSignature {
final code = """ final code = """
$method(...${args != null ? jsonEncode(args) : "[]"}) $method(...${args != null ? jsonEncode(args) : "[]"})
.then((res) => { .then((res) => {
try {
sendMessage("$method", JSON.stringify(res)); sendMessage("$method", JSON.stringify(res));
}).catch((err) => { } catch (e) {
sendMessage("$method", null); console.error("Failed to send message in $method.then: ", `\${e.toString()}\n\${e.stack.toString()}`);
async}){ }
} final res"metadataApi.=>", [limit, offset] ;= await invoke() }).catch((e) => {
try {
return res.map(es.fromJson).toList(); console.error("Error in $method: ", `\${e.toString()}\n\${e.stack.toString()}`);
sendMessage("$method", JSON.stringify({error: `\${e.toString()}\n\${e.stack.toString()}`}));
} catch (e) {
console.error("Failed to send message in $method.catch: ", `\${e.toString()}\n\${e.stack.toString()}`);
}
});
"""; """;
final res = await runtime.evaluateAsync(code); final res = await runtime.evaluateAsync(code);