Ivan Folgueira Bande 27de79bda4
First commit
2025-10-16 13:38:59 +02:00

103 lines
2.9 KiB
Dart

import 'dart:async';
import 'dart:ffi';
import 'package:ffi/ffi.dart';
import 'bindings.dart';
class Waku {
final Pointer<Void> _context;
Waku._(this._context);
static Future<Waku> newInstance(String configJson) async {
late final NativeCallable<WakuCallBackC> callback;
final completer = Completer<CallbackResult>();
void onCallCompleted(
int callerRet, Pointer<Utf8> msg, int len, Pointer<Void> userData) {
print("instance is created callback");
completer.complete(CallbackResult()
..callerRet = callerRet
..msg = msg.toDartString(length: len));
callback.close();
}
callback = NativeCallable<WakuCallBackC>.listener(onCallCompleted);
final configPtr = configJson.toNativeUtf8();
final context = waku_new(configPtr, callback.nativeFunction, nullptr);
final callResult = await completer.future;
malloc.free(configPtr);
final wakuCompleter = Completer<Waku>();
if (callResult.callerRet != 0) {
print("Could not create instance");
wakuCompleter
.completeError('Failed to create Waku instance: ${callResult.msg}');
} else {
wakuCompleter.complete(Waku._(context));
}
return wakuCompleter.future;
}
Future<CallbackResult> destroyInstance() async {
late final NativeCallable<WakuCallBackC> callback;
final completer = Completer<CallbackResult>();
void onCallCompleted(
int callerRet, Pointer<Utf8> msg, int len, Pointer<Void> userData) {
completer.complete(CallbackResult()
..callerRet = callerRet
..msg = msg.toDartString(length: len));
callback.close();
}
callback = NativeCallable<WakuCallBackC>.listener(onCallCompleted);
waku_destroy(_context, callback.nativeFunction, nullptr);
return completer.future;
}
Future<CallbackResult> start() async {
late final NativeCallable<WakuCallBackC> callback;
final completer = Completer<CallbackResult>();
void onCallCompleted(
int callerRet, Pointer<Utf8> msg, int len, Pointer<Void> userData) {
completer.complete(CallbackResult()
..callerRet = callerRet
..msg = msg.toDartString(length: len));
callback.close();
}
callback = NativeCallable<WakuCallBackC>.listener(onCallCompleted);
waku_start(_context, callback.nativeFunction, nullptr);
return completer.future;
}
Future<CallbackResult> stop() async {
late final NativeCallable<WakuCallBackC> callback;
final completer = Completer<CallbackResult>();
void onCallCompleted(
int callerRet, Pointer<Utf8> msg, int len, Pointer<Void> userData) {
completer.complete(CallbackResult()
..callerRet = callerRet
..msg = msg.toDartString(length: len));
callback.close();
}
callback = NativeCallable<WakuCallBackC>.listener(onCallCompleted);
waku_stop(_context, callback.nativeFunction, nullptr);
return completer.future;
}
}