veilid/veilid-flutter/lib/veilid_js.dart

106 lines
3.0 KiB
Dart
Raw Normal View History

2022-02-07 02:18:42 +00:00
import 'veilid.dart';
2022-03-17 14:31:10 +00:00
import 'dart:html' as html;
import 'dart:js' as js;
import 'dart:js_util' as js_util;
2022-02-07 02:18:42 +00:00
import 'dart:async';
2022-03-16 03:02:24 +00:00
import 'dart:convert';
2022-10-01 02:37:55 +00:00
import 'dart:typed_data';
2022-02-07 02:18:42 +00:00
//////////////////////////////////////////////////////////
Veilid getVeilid() => VeilidJS();
2022-03-17 14:31:10 +00:00
Object wasm = js_util.getProperty(html.window, "veilid_wasm");
2022-03-16 03:02:24 +00:00
2022-03-17 14:31:10 +00:00
Future<T> _wrapApiPromise<T>(Object p) {
return js_util.promiseToFuture(p).then((value) => value as T).catchError(
(error) => Future<T>.error(
VeilidAPIException.fromJson(jsonDecode(error as String))));
2022-03-16 03:02:24 +00:00
}
2022-02-14 02:09:43 +00:00
class VeilidJS implements Veilid {
2022-06-16 01:51:38 +00:00
@override
2022-07-01 20:20:43 +00:00
void initializeVeilidCore(Map<String, dynamic> platformConfigJson) {
2022-06-16 01:51:38 +00:00
var platformConfigJsonString =
jsonEncode(platformConfigJson, toEncodable: veilidApiToEncodable);
2022-07-01 20:20:43 +00:00
js_util
.callMethod(wasm, "initialize_veilid_core", [platformConfigJsonString]);
2022-06-16 01:51:38 +00:00
}
2022-07-01 16:13:52 +00:00
@override
void changeLogLevel(String layer, VeilidConfigLogLevel logLevel) {
var logLevelJsonString =
jsonEncode(logLevel.json, toEncodable: veilidApiToEncodable);
js_util.callMethod(wasm, "change_log_level", [layer, logLevelJsonString]);
}
2022-03-04 01:45:39 +00:00
@override
2022-09-09 20:27:13 +00:00
Future<Stream<VeilidUpdate>> startupVeilidCore(VeilidConfig config) async {
2022-03-16 03:02:24 +00:00
var streamController = StreamController<VeilidUpdate>();
2022-03-17 14:31:10 +00:00
updateCallback(String update) {
var updateJson = jsonDecode(update);
if (updateJson["kind"] == "Shutdown") {
streamController.close();
} else {
var update = VeilidUpdate.fromJson(updateJson);
streamController.add(update);
}
}
await _wrapApiPromise(js_util.callMethod(wasm, "startup_veilid_core", [
js.allowInterop(updateCallback),
jsonEncode(config.json, toEncodable: veilidApiToEncodable)
]));
2022-09-09 20:27:13 +00:00
return streamController.stream;
2022-02-07 02:18:42 +00:00
}
2022-03-04 01:45:39 +00:00
@override
2022-03-16 03:02:24 +00:00
Future<VeilidState> getVeilidState() async {
2022-03-17 14:31:10 +00:00
return VeilidState.fromJson(jsonDecode(await _wrapApiPromise(
js_util.callMethod(wasm, "get_veilid_state", []))));
2022-02-07 02:18:42 +00:00
}
2022-09-06 22:59:41 +00:00
@override
Future<void> attach() async {
return _wrapApiPromise(js_util.callMethod(wasm, "attach", []));
}
@override
Future<void> detach() async {
return _wrapApiPromise(js_util.callMethod(wasm, "detach", []));
}
2022-03-04 01:45:39 +00:00
@override
2022-03-17 14:31:10 +00:00
Future<void> shutdownVeilidCore() {
return _wrapApiPromise(
js_util.callMethod(wasm, "shutdown_veilid_core", []));
2022-02-07 02:18:42 +00:00
}
2022-03-04 01:45:39 +00:00
@override
2022-03-17 14:31:10 +00:00
Future<String> debug(String command) {
return _wrapApiPromise(js_util.callMethod(wasm, "debug", [command]));
2022-03-04 01:45:39 +00:00
}
2022-10-01 02:37:55 +00:00
@override
Future<void> appCallReply(String id, Uint8List message) {
var encodedMessage = base64UrlEncode(message);
return _wrapApiPromise(
js_util.callMethod(wasm, "app_call_reply", [id, encodedMessage]));
}
2022-03-04 01:45:39 +00:00
@override
2022-03-17 14:31:10 +00:00
String veilidVersionString() {
return js_util.callMethod(wasm, "veilid_version_string", []);
2022-02-07 02:18:42 +00:00
}
2022-03-04 01:45:39 +00:00
@override
2022-03-17 14:31:10 +00:00
VeilidVersion veilidVersion() {
var jsonVersion =
jsonDecode(js_util.callMethod(wasm, "veilid_version", []));
2022-03-16 03:02:24 +00:00
return VeilidVersion(
jsonVersion["major"], jsonVersion["minor"], jsonVersion["patch"]);
2022-02-07 02:18:42 +00:00
}
}