From 1bda44ba7f1901f5da6dc12856b5104712bb79ab Mon Sep 17 00:00:00 2001 From: Lucas Birkert Date: Sun, 1 Sep 2024 15:45:54 +0200 Subject: [PATCH] Make ring default provider, add tmp tcp-client --- Cargo.lock | 1 + qb-app-daemon/Cargo.toml | 2 +- qb-daemon/src/daemon.rs | 11 + qb-ext-tcp/Cargo.toml | 3 +- qb-ext/src/control.rs | 8 + qb-mobile/lib/service.dart | 5 + qb-mobile/lib/src/rust/api/daemon.dart | 37 ++- qb-mobile/lib/src/rust/frb_generated.dart | 253 +++++++++++++--- qb-mobile/lib/src/rust/frb_generated.io.dart | 33 ++- qb-mobile/lib/src/rust/frb_generated.web.dart | 33 ++- qb-mobile/rust/Cargo.toml | 1 + qb-mobile/rust/src/api/daemon.rs | 73 ++++- qb-mobile/rust/src/api/log.rs | 2 +- qb-mobile/rust/src/frb_generated.rs | 278 +++++++++++++++++- 14 files changed, 648 insertions(+), 92 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 900a5b3..0f2321f 100755 --- a/Cargo.lock +++ b/Cargo.lock @@ -1524,6 +1524,7 @@ dependencies = [ "qb-daemon", "qb-ext", "qb-ext-tcp", + "qb-proto", "serde", "tokio", "tracing", diff --git a/qb-app-daemon/Cargo.toml b/qb-app-daemon/Cargo.toml index 57a9288..c1c2aa5 100644 --- a/qb-app-daemon/Cargo.toml +++ b/qb-app-daemon/Cargo.toml @@ -21,7 +21,7 @@ qb-ext-local = { path = "../qb-ext-local" } qb-ext-tcp = { path = "../qb-ext-tcp", default-features = false } [features] -default = ["ipc", "aws_lc_rs"] +default = ["ipc", "ring"] ipc = ["dep:interprocess"] aws_lc_rs = ["qb-ext-tcp/aws_lc_rs"] aws-lc-rs = ["aws_lc_rs"] diff --git a/qb-daemon/src/daemon.rs b/qb-daemon/src/daemon.rs index d6358bc..3287fe5 100644 --- a/qb-daemon/src/daemon.rs +++ b/qb-daemon/src/daemon.rs @@ -197,10 +197,21 @@ impl QBDaemon { Ok(val) => { // success: add the descriptor to this daemon self.add_already_setup(val).await.unwrap(); + + if id.is_root() { + return; + } + let handle = self.handles.get(&id).unwrap(); handle.send(QBCResponse::Success).await; } Err(err) => { + warn!("error while setting up extension: {err}"); + + if id.is_root() { + return; + } + // error: forward error to the QBCHandle which issued setup let handle = self.handles.get(&id).unwrap(); handle diff --git a/qb-ext-tcp/Cargo.toml b/qb-ext-tcp/Cargo.toml index cc6cc85..ecfb558 100644 --- a/qb-ext-tcp/Cargo.toml +++ b/qb-ext-tcp/Cargo.toml @@ -12,13 +12,14 @@ tracing = "0.1.40" qb-core = { path = "../qb-core" } qb-proto = { path = "../qb-proto" } qb-ext = { path = "../qb-ext" } -tokio-rustls = { version = "0.26.0", default-features = false, features = [] } +tokio-rustls = { version = "0.26.0", default-features = false } rcgen = "0.13.1" rustls-cert-gen = "0.1.0" rustls-pemfile = "2.1.3" webpki-roots = "0.26.3" [features] +default = ["ring"] aws_lc_rs = ["tokio-rustls/aws_lc_rs"] aws-lc-rs = ["aws_lc_rs"] ring = ["tokio-rustls/ring"] diff --git a/qb-ext/src/control.rs b/qb-ext/src/control.rs index 8568eba..4d94c5e 100644 --- a/qb-ext/src/control.rs +++ b/qb-ext/src/control.rs @@ -40,6 +40,10 @@ impl QBCId { Self(rng.gen::()) } + pub fn root() -> Self { + Self(0) + } + /// Get the string representation of this id in hex format pub fn to_hex(&self) -> String { let id_bytes = self.0.to_be_bytes(); @@ -52,6 +56,10 @@ impl QBCId { hex::decode_to_slice(hex.as_ref(), &mut id_bytes)?; Ok(Self(u64::from_be_bytes(id_bytes))) } + + pub fn is_root(&self) -> bool { + self.0 == 0 + } } /// A request comming from a controlling task. diff --git a/qb-mobile/lib/service.dart b/qb-mobile/lib/service.dart index e38ad44..0960dc9 100644 --- a/qb-mobile/lib/service.dart +++ b/qb-mobile/lib/service.dart @@ -61,6 +61,11 @@ void onStart(ServiceInstance service) async { final dir = await getApplicationDocumentsDirectory(); print("directory: $dir"); final daemon = await DaemonWrapper.init(path: dir.path); + await daemon.add( + name: "tcp-client", + contentType: "application/json", + content: utf8.encode('{"addr":"192.168.178.84:6969","auth":[]}'), + ); service.on("stop").listen((event) { service.stopSelf(); diff --git a/qb-mobile/lib/src/rust/api/daemon.dart b/qb-mobile/lib/src/rust/api/daemon.dart index 2bbee4d..dcdb47a 100644 --- a/qb-mobile/lib/src/rust/api/daemon.dart +++ b/qb-mobile/lib/src/rust/api/daemon.dart @@ -10,14 +10,45 @@ import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; // Rust type: RustOpaqueMoi> abstract class DaemonWrapper implements RustOpaqueInterface { - /// Cancel processing the daemon. + /// Add an extension to this daemon + /// + /// This will cancel cancelable tasks, which block execution, + /// as they require mutable access to the daemon. + Future add( + {required String name, + required String contentType, + required List content}); + + /// Cancel cancelable tasks. Future cancel(); /// Initialize a new daemon process. static Future init({required String path}) => RustLib.instance.api.crateApiDaemonDaemonWrapperInit(path: path); - /// Process the daemon. This can be canceled using the cancel method. - /// If called twice, this will cancel the previous execution. + /// Process the daemon. + /// + /// This will cancel cancelable tasks, which block execution, + /// as they require mutable access to the daemon. + /// + /// This task is cancelable using the cancel method. Future process(); + + /// Remove an extension to this daemon. + /// + /// This will cancel cancelable tasks, which block execution, + /// as they require mutable access to the daemon. + Future remove({required BigInt id}); + + /// Start an extension for this daemon. + /// + /// This will cancel cancelable tasks, which block execution, + /// as they require mutable access to the daemon. + Future start({required BigInt id}); + + /// Stop an extension for this daemon. + /// + /// This will cancel cancelable tasks, which block execution, + /// as they require mutable access to the daemon. + Future stop({required BigInt id}); } diff --git a/qb-mobile/lib/src/rust/frb_generated.dart b/qb-mobile/lib/src/rust/frb_generated.dart index 40550a7..a0cb02e 100644 --- a/qb-mobile/lib/src/rust/frb_generated.dart +++ b/qb-mobile/lib/src/rust/frb_generated.dart @@ -67,7 +67,7 @@ class RustLib extends BaseEntrypoint { String get codegenVersion => '2.3.0'; @override - int get rustContentHash => 174884596; + int get rustContentHash => 2081444312; static const kDefaultExternalLibraryLoaderConfig = ExternalLibraryLoaderConfig( @@ -78,6 +78,12 @@ class RustLib extends BaseEntrypoint { } abstract class RustLibApi extends BaseApi { + Future crateApiDaemonDaemonWrapperAdd( + {required DaemonWrapper that, + required String name, + required String contentType, + required List content}); + Future crateApiDaemonDaemonWrapperCancel({required DaemonWrapper that}); Future crateApiDaemonDaemonWrapperInit({required String path}); @@ -85,6 +91,15 @@ abstract class RustLibApi extends BaseApi { Future crateApiDaemonDaemonWrapperProcess( {required DaemonWrapper that}); + Future crateApiDaemonDaemonWrapperRemove( + {required DaemonWrapper that, required BigInt id}); + + Future crateApiDaemonDaemonWrapperStart( + {required DaemonWrapper that, required BigInt id}); + + Future crateApiDaemonDaemonWrapperStop( + {required DaemonWrapper that, required BigInt id}); + Stream crateApiLogInitLog(); RustArcIncrementStrongCountFnType @@ -105,6 +120,39 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { required super.portManager, }); + @override + Future crateApiDaemonDaemonWrapperAdd( + {required DaemonWrapper that, + required String name, + required String contentType, + required List content}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( + that, serializer); + sse_encode_String(name, serializer); + sse_encode_String(contentType, serializer); + sse_encode_list_prim_u_8_loose(content, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 1, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiDaemonDaemonWrapperAddConstMeta, + argValues: [that, name, contentType, content], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiDaemonDaemonWrapperAddConstMeta => + const TaskConstMeta( + debugName: "DaemonWrapper_add", + argNames: ["that", "name", "contentType", "content"], + ); + @override Future crateApiDaemonDaemonWrapperCancel( {required DaemonWrapper that}) { @@ -114,7 +162,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( that, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 1, port: port_); + funcId: 2, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -140,7 +188,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_String(path, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 2, port: port_); + funcId: 3, port: port_); }, codec: SseCodec( decodeSuccessData: @@ -165,10 +213,10 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return handler.executeNormal(NormalTask( callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( that, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 3, port: port_); + funcId: 4, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -186,6 +234,90 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { argNames: ["that"], ); + @override + Future crateApiDaemonDaemonWrapperRemove( + {required DaemonWrapper that, required BigInt id}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( + that, serializer); + sse_encode_u_64(id, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 5, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiDaemonDaemonWrapperRemoveConstMeta, + argValues: [that, id], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiDaemonDaemonWrapperRemoveConstMeta => + const TaskConstMeta( + debugName: "DaemonWrapper_remove", + argNames: ["that", "id"], + ); + + @override + Future crateApiDaemonDaemonWrapperStart( + {required DaemonWrapper that, required BigInt id}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( + that, serializer); + sse_encode_u_64(id, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 6, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiDaemonDaemonWrapperStartConstMeta, + argValues: [that, id], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiDaemonDaemonWrapperStartConstMeta => + const TaskConstMeta( + debugName: "DaemonWrapper_start", + argNames: ["that", "id"], + ); + + @override + Future crateApiDaemonDaemonWrapperStop( + {required DaemonWrapper that, required BigInt id}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( + that, serializer); + sse_encode_u_64(id, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 7, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiDaemonDaemonWrapperStopConstMeta, + argValues: [that, id], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiDaemonDaemonWrapperStopConstMeta => + const TaskConstMeta( + debugName: "DaemonWrapper_stop", + argNames: ["that", "id"], + ); + @override Stream crateApiLogInitLog() { final logSink = RustStreamSink(); @@ -194,7 +326,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_StreamSink_list_prim_u_8_strict_Sse(logSink, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 4, port: port_); + funcId: 8, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -234,14 +366,6 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return DaemonWrapperImpl.frbInternalDcoDecode(raw as List); } - @protected - DaemonWrapper - dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( - dynamic raw) { - // Codec=Dco (DartCObject based), see doc to use other codecs - return DaemonWrapperImpl.frbInternalDcoDecode(raw as List); - } - @protected DaemonWrapper dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( @@ -271,12 +395,24 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return raw as String; } + @protected + List dco_decode_list_prim_u_8_loose(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw as List; + } + @protected Uint8List dco_decode_list_prim_u_8_strict(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs return raw as Uint8List; } + @protected + BigInt dco_decode_u_64(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dcoDecodeU64(raw); + } + @protected int dco_decode_u_8(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs @@ -311,15 +447,6 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); } - @protected - DaemonWrapper - sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( - SseDeserializer deserializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - return DaemonWrapperImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); - } - @protected DaemonWrapper sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( @@ -352,6 +479,13 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return utf8.decoder.convert(inner); } + @protected + List sse_decode_list_prim_u_8_loose(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var len_ = sse_decode_i_32(deserializer); + return deserializer.buffer.getUint8List(len_); + } + @protected Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -359,6 +493,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return deserializer.buffer.getUint8List(len_); } + @protected + BigInt sse_decode_u_64(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return deserializer.buffer.getBigUint64(); + } + @protected int sse_decode_u_8(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -405,16 +545,6 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { serializer); } - @protected - void - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( - DaemonWrapper self, SseSerializer serializer) { - // Codec=Sse (Serialization based), see doc to use other codecs - sse_encode_usize( - (self as DaemonWrapperImpl).frbInternalSseEncode(move: false), - serializer); - } - @protected void sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( @@ -454,6 +584,15 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_list_prim_u_8_strict(utf8.encoder.convert(self), serializer); } + @protected + void sse_encode_list_prim_u_8_loose( + List self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + serializer.buffer + .putUint8List(self is Uint8List ? self : Uint8List.fromList(self)); + } + @protected void sse_encode_list_prim_u_8_strict( Uint8List self, SseSerializer serializer) { @@ -462,6 +601,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { serializer.buffer.putUint8List(self); } + @protected + void sse_encode_u_64(BigInt self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + serializer.buffer.putBigUint64(self); + } + @protected void sse_encode_u_8(int self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -511,16 +656,52 @@ class DaemonWrapperImpl extends RustOpaque implements DaemonWrapper { RustLib.instance.api.rust_arc_decrement_strong_count_DaemonWrapperPtr, ); - /// Cancel processing the daemon. + /// Add an extension to this daemon + /// + /// This will cancel cancelable tasks, which block execution, + /// as they require mutable access to the daemon. + Future add( + {required String name, + required String contentType, + required List content}) => + RustLib.instance.api.crateApiDaemonDaemonWrapperAdd( + that: this, name: name, contentType: contentType, content: content); + + /// Cancel cancelable tasks. Future cancel() => RustLib.instance.api.crateApiDaemonDaemonWrapperCancel( that: this, ); - /// Process the daemon. This can be canceled using the cancel method. - /// If called twice, this will cancel the previous execution. + /// Process the daemon. + /// + /// This will cancel cancelable tasks, which block execution, + /// as they require mutable access to the daemon. + /// + /// This task is cancelable using the cancel method. Future process() => RustLib.instance.api.crateApiDaemonDaemonWrapperProcess( that: this, ); + + /// Remove an extension to this daemon. + /// + /// This will cancel cancelable tasks, which block execution, + /// as they require mutable access to the daemon. + Future remove({required BigInt id}) => RustLib.instance.api + .crateApiDaemonDaemonWrapperRemove(that: this, id: id); + + /// Start an extension for this daemon. + /// + /// This will cancel cancelable tasks, which block execution, + /// as they require mutable access to the daemon. + Future start({required BigInt id}) => + RustLib.instance.api.crateApiDaemonDaemonWrapperStart(that: this, id: id); + + /// Stop an extension for this daemon. + /// + /// This will cancel cancelable tasks, which block execution, + /// as they require mutable access to the daemon. + Future stop({required BigInt id}) => + RustLib.instance.api.crateApiDaemonDaemonWrapperStop(that: this, id: id); } diff --git a/qb-mobile/lib/src/rust/frb_generated.io.dart b/qb-mobile/lib/src/rust/frb_generated.io.dart index a6832b9..6e22553 100644 --- a/qb-mobile/lib/src/rust/frb_generated.io.dart +++ b/qb-mobile/lib/src/rust/frb_generated.io.dart @@ -31,11 +31,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( dynamic raw); - @protected - DaemonWrapper - dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( - dynamic raw); - @protected DaemonWrapper dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( @@ -53,9 +48,15 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected String dco_decode_String(dynamic raw); + @protected + List dco_decode_list_prim_u_8_loose(dynamic raw); + @protected Uint8List dco_decode_list_prim_u_8_strict(dynamic raw); + @protected + BigInt dco_decode_u_64(dynamic raw); + @protected int dco_decode_u_8(dynamic raw); @@ -73,11 +74,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( SseDeserializer deserializer); - @protected - DaemonWrapper - sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( - SseDeserializer deserializer); - @protected DaemonWrapper sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( @@ -95,9 +91,15 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected String sse_decode_String(SseDeserializer deserializer); + @protected + List sse_decode_list_prim_u_8_loose(SseDeserializer deserializer); + @protected Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer); + @protected + BigInt sse_decode_u_64(SseDeserializer deserializer); + @protected int sse_decode_u_8(SseDeserializer deserializer); @@ -122,11 +124,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( DaemonWrapper self, SseSerializer serializer); - @protected - void - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( - DaemonWrapper self, SseSerializer serializer); - @protected void sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( @@ -144,10 +141,16 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_String(String self, SseSerializer serializer); + @protected + void sse_encode_list_prim_u_8_loose(List self, SseSerializer serializer); + @protected void sse_encode_list_prim_u_8_strict( Uint8List self, SseSerializer serializer); + @protected + void sse_encode_u_64(BigInt self, SseSerializer serializer); + @protected void sse_encode_u_8(int self, SseSerializer serializer); diff --git a/qb-mobile/lib/src/rust/frb_generated.web.dart b/qb-mobile/lib/src/rust/frb_generated.web.dart index a3d32e9..a93c964 100644 --- a/qb-mobile/lib/src/rust/frb_generated.web.dart +++ b/qb-mobile/lib/src/rust/frb_generated.web.dart @@ -33,11 +33,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( dynamic raw); - @protected - DaemonWrapper - dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( - dynamic raw); - @protected DaemonWrapper dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( @@ -55,9 +50,15 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected String dco_decode_String(dynamic raw); + @protected + List dco_decode_list_prim_u_8_loose(dynamic raw); + @protected Uint8List dco_decode_list_prim_u_8_strict(dynamic raw); + @protected + BigInt dco_decode_u_64(dynamic raw); + @protected int dco_decode_u_8(dynamic raw); @@ -75,11 +76,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( SseDeserializer deserializer); - @protected - DaemonWrapper - sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( - SseDeserializer deserializer); - @protected DaemonWrapper sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( @@ -97,9 +93,15 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected String sse_decode_String(SseDeserializer deserializer); + @protected + List sse_decode_list_prim_u_8_loose(SseDeserializer deserializer); + @protected Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer); + @protected + BigInt sse_decode_u_64(SseDeserializer deserializer); + @protected int sse_decode_u_8(SseDeserializer deserializer); @@ -124,11 +126,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( DaemonWrapper self, SseSerializer serializer); - @protected - void - sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( - DaemonWrapper self, SseSerializer serializer); - @protected void sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerDaemonWrapper( @@ -146,10 +143,16 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_String(String self, SseSerializer serializer); + @protected + void sse_encode_list_prim_u_8_loose(List self, SseSerializer serializer); + @protected void sse_encode_list_prim_u_8_strict( Uint8List self, SseSerializer serializer); + @protected + void sse_encode_u_64(BigInt self, SseSerializer serializer); + @protected void sse_encode_u_8(int self, SseSerializer serializer); diff --git a/qb-mobile/rust/Cargo.toml b/qb-mobile/rust/Cargo.toml index bb46716..b591f65 100644 --- a/qb-mobile/rust/Cargo.toml +++ b/qb-mobile/rust/Cargo.toml @@ -10,6 +10,7 @@ crate-type = ["cdylib", "staticlib"] flutter_rust_bridge = "=2.3.0" qb-daemon = { path = "../../qb-daemon" } qb-core = { path = "../../qb-core" } +qb-proto = { path = "../../qb-proto" } qb-ext = { path = "../../qb-ext" } qb-ext-tcp = { path = "../../qb-ext-tcp" } lazy_static = "1.5.0" diff --git a/qb-mobile/rust/src/api/daemon.rs b/qb-mobile/rust/src/api/daemon.rs index ea0d836..21776cd 100644 --- a/qb-mobile/rust/src/api/daemon.rs +++ b/qb-mobile/rust/src/api/daemon.rs @@ -3,16 +3,19 @@ use std::path::PathBuf; use flutter_rust_bridge::frb; use qb_core::fs::wrapper::QBFSWrapper; use qb_daemon::{daemon::QBDaemon, master::QBMaster}; -use qb_ext::QBExtId; +use qb_ext::{control::QBCId, QBExtId}; use qb_ext_tcp::client::QBITCPClientSetup; +use qb_proto::QBPBlob; use tokio::sync::{mpsc, Mutex}; use crate::android::QBIAndroid; +pub use qb_ext::control::{QBCRequest, QBCResponse}; + #[frb(opaque)] pub struct DaemonWrapper { daemon: Mutex, - cancel_rx: Option>, + cancel_rx: Mutex>>, cancel_tx: mpsc::Sender<()>, } @@ -25,7 +28,7 @@ impl DaemonWrapper { let master = QBMaster::init(wrapper.clone()).await; let mut daemon = QBDaemon::init(master, wrapper).await; - daemon.register_qbi::("tcp"); + daemon.register_qbi::("tcp-client"); daemon.autostart().await; daemon .master @@ -36,24 +39,72 @@ impl DaemonWrapper { Self { daemon: Mutex::new(daemon), cancel_tx, - cancel_rx: Some(cancel_rx), + cancel_rx: Mutex::new(Some(cancel_rx)), } } - /// Cancel processing the daemon. + /// Add an extension to this daemon + /// + /// This will cancel cancelable tasks, which block execution, + /// as they require mutable access to the daemon. + pub async fn add(&self, name: String, content_type: String, content: Vec) { + self.cancel().await; + let daemon = &mut self.daemon.lock().await; + let blob = QBPBlob { + content_type, + content, + }; + daemon.add(QBCId::root(), name, blob).unwrap(); + } + + /// Remove an extension to this daemon. + /// + /// This will cancel cancelable tasks, which block execution, + /// as they require mutable access to the daemon. + pub async fn remove(&self, id: u64) { + self.cancel().await; + let daemon = &mut self.daemon.lock().await; + daemon.remove(QBExtId(id)).await.unwrap(); + } + + /// Start an extension for this daemon. + /// + /// This will cancel cancelable tasks, which block execution, + /// as they require mutable access to the daemon. + pub async fn start(&self, id: u64) { + self.cancel().await; + let daemon = &mut self.daemon.lock().await; + daemon.start(QBExtId(id)).await.unwrap(); + } + + /// Stop an extension for this daemon. + /// + /// This will cancel cancelable tasks, which block execution, + /// as they require mutable access to the daemon. + pub async fn stop(&self, id: u64) { + self.cancel().await; + let daemon = &mut self.daemon.lock().await; + daemon.stop(QBExtId(id)).await.unwrap(); + } + + /// Cancel cancelable tasks. pub async fn cancel(&self) { - if self.cancel_rx.is_none() { + if self.cancel_rx.lock().await.is_none() { self.cancel_tx.send(()).await.unwrap(); } } - /// Process the daemon. This can be canceled using the cancel method. - /// If called twice, this will cancel the previous execution. - pub async fn process(&mut self) { + /// Process the daemon. + /// + /// This will cancel cancelable tasks, which block execution, + /// as they require mutable access to the daemon. + /// + /// This task is cancelable using the cancel method. + pub async fn process(&self) { self.cancel().await; let daemon = &mut self.daemon.lock().await; - let cancel_rx = self.cancel_rx.take().unwrap(); - self.cancel_rx = Some(Self::_process(cancel_rx, daemon).await); + let cancel_rx = self.cancel_rx.lock().await.take().unwrap(); + *self.cancel_rx.lock().await = Some(Self::_process(cancel_rx, daemon).await); } async fn _process( diff --git a/qb-mobile/rust/src/api/log.rs b/qb-mobile/rust/src/api/log.rs index 24f2280..10b4585 100644 --- a/qb-mobile/rust/src/api/log.rs +++ b/qb-mobile/rust/src/api/log.rs @@ -41,7 +41,7 @@ pub fn init_log(log_sink: StreamSink>) { .pretty() .with_writer(make_writer); tracing_subscriber::registry() - .with(stdout_log.with_filter(LevelFilter::DEBUG)) + .with(stdout_log.with_filter(LevelFilter::TRACE)) .init(); info!("logging initialized..."); diff --git a/qb-mobile/rust/src/frb_generated.rs b/qb-mobile/rust/src/frb_generated.rs index 9171cb8..d292d77 100644 --- a/qb-mobile/rust/src/frb_generated.rs +++ b/qb-mobile/rust/src/frb_generated.rs @@ -38,7 +38,7 @@ flutter_rust_bridge::frb_generated_boilerplate!( default_rust_auto_opaque = RustAutoOpaqueMoi, ); pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_VERSION: &str = "2.3.0"; -pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = 174884596; +pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = 2081444312; // Section: executor @@ -46,6 +46,72 @@ flutter_rust_bridge::frb_generated_default_handler!(); // Section: wire_funcs +fn wire__crate__api__daemon__DaemonWrapper_add_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "DaemonWrapper_add", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_name = ::sse_decode(&mut deserializer); + let api_content_type = ::sse_decode(&mut deserializer); + let api_content = >::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, ()>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok({ + crate::api::daemon::DaemonWrapper::add( + &*api_that_guard, + api_name, + api_content_type, + api_content, + ) + .await; + })?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} fn wire__crate__api__daemon__DaemonWrapper_cancel_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, @@ -174,21 +240,197 @@ fn wire__crate__api__daemon__DaemonWrapper_process_impl( let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order( vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( - &api_that, 0, true, + &api_that, 0, false, )], ); for i in decode_indices_ { match i { 0 => { api_that_guard = - Some(api_that.lockable_decode_async_ref_mut().await) + Some(api_that.lockable_decode_async_ref().await) } _ => unreachable!(), } } - let mut api_that_guard = api_that_guard.unwrap(); + let api_that_guard = api_that_guard.unwrap(); let output_ok = Result::<_, ()>::Ok({ - crate::api::daemon::DaemonWrapper::process(&mut *api_that_guard).await; + crate::api::daemon::DaemonWrapper::process(&*api_that_guard).await; + })?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__daemon__DaemonWrapper_remove_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "DaemonWrapper_remove", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_id = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, ()>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok({ + crate::api::daemon::DaemonWrapper::remove(&*api_that_guard, api_id) + .await; + })?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__daemon__DaemonWrapper_start_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "DaemonWrapper_start", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_id = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, ()>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok({ + crate::api::daemon::DaemonWrapper::start(&*api_that_guard, api_id) + .await; + })?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__daemon__DaemonWrapper_stop_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "DaemonWrapper_stop", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_id = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, ()>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok({ + crate::api::daemon::DaemonWrapper::stop(&*api_that_guard, api_id).await; })?; Ok(output_ok) })() @@ -301,6 +543,13 @@ impl SseDecode for Vec { } } +impl SseDecode for u64 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + deserializer.cursor.read_u64::().unwrap() + } +} + impl SseDecode for u8 { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { @@ -343,12 +592,16 @@ fn pde_ffi_dispatcher_primary_impl( ) { // Codec=Pde (Serialization + dispatch), see doc to use other codecs match func_id { - 1 => wire__crate__api__daemon__DaemonWrapper_cancel_impl(port, ptr, rust_vec_len, data_len), - 2 => wire__crate__api__daemon__DaemonWrapper_init_impl(port, ptr, rust_vec_len, data_len), - 3 => { + 1 => wire__crate__api__daemon__DaemonWrapper_add_impl(port, ptr, rust_vec_len, data_len), + 2 => wire__crate__api__daemon__DaemonWrapper_cancel_impl(port, ptr, rust_vec_len, data_len), + 3 => wire__crate__api__daemon__DaemonWrapper_init_impl(port, ptr, rust_vec_len, data_len), + 4 => { wire__crate__api__daemon__DaemonWrapper_process_impl(port, ptr, rust_vec_len, data_len) } - 4 => wire__crate__api__log__init_log_impl(port, ptr, rust_vec_len, data_len), + 5 => wire__crate__api__daemon__DaemonWrapper_remove_impl(port, ptr, rust_vec_len, data_len), + 6 => wire__crate__api__daemon__DaemonWrapper_start_impl(port, ptr, rust_vec_len, data_len), + 7 => wire__crate__api__daemon__DaemonWrapper_stop_impl(port, ptr, rust_vec_len, data_len), + 8 => wire__crate__api__log__init_log_impl(port, ptr, rust_vec_len, data_len), _ => unreachable!(), } } @@ -431,6 +684,13 @@ impl SseEncode for Vec { } } +impl SseEncode for u64 { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + serializer.cursor.write_u64::(self).unwrap(); + } +} + impl SseEncode for u8 { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {