Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Read logs in dart, make log level adjustable #150

Draft
wants to merge 7 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions packages/app/lib/io/p2panda/logs.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// SPDX-License-Identifier: AGPL-3.0-or-later

import 'package:app/io/p2panda/p2panda.dart';

class Logger {
Logger() {
p2panda.subscribeLogStream().listen((logEntry) {
print(logEntry.msg);
});
}
}
4 changes: 4 additions & 0 deletions packages/app/lib/io/p2panda/node.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ const List<String> relayAddresses = (bool.hasEnvironment("RELAY_ADDRESS") &&
? [String.fromEnvironment("RELAY_ADDRESS")]
: [];

const String logLevel =
String.fromEnvironment("LOG_LEVEL", defaultValue: "ERROR");

/// Start a p2panda node in the background.
Future<void> startNode() async {
// Determine folder where we can persist data
Expand All @@ -26,6 +29,7 @@ Future<void> startNode() async {

// Start node in background thread
p2panda.startNode(
logLevel: logLevel,
keyPair: key,
databaseUrl: databaseUrl,
blobsBasePath: basePath,
Expand Down
104 changes: 95 additions & 9 deletions packages/p2panda/lib/src/bridge_generated.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ import 'dart:ffi' as ffi;
part 'bridge_generated.freezed.dart';

abstract class P2Panda {
Stream<LogEntry> subscribeLogStream({dynamic hint});

FlutterRustBridgeTaskConstMeta get kSubscribeLogStreamConstMeta;

/// Create, sign and encode a p2panda entry.
///
/// Takes large u64 integers for log id and seq num as strings. If we would declare them as u64
Expand Down Expand Up @@ -60,7 +64,8 @@ abstract class P2Panda {
///
/// Supports Android logging for logs coming from the node.
Future<void> startNode(
{required KeyPair keyPair,
{required String logLevel,
required KeyPair keyPair,
required String databaseUrl,
required String blobsBasePath,
required List<String> relayAddresses,
Expand Down Expand Up @@ -149,6 +154,28 @@ class KeyPair {
);
}

class LogEntry {
final int timestamp;
final LogLevel level;
final String tag;
final String msg;

const LogEntry({
required this.timestamp,
required this.level,
required this.tag,
required this.msg,
});
}

enum LogLevel {
Trace,
Debug,
Info,
Warn,
Error,
}

/// Operations are categorised by their action type.
///
/// An action defines the operation format and if this operation creates, updates or deletes a data
Expand Down Expand Up @@ -225,6 +252,23 @@ class P2PandaImpl implements P2Panda {
factory P2PandaImpl.wasm(FutureOr<WasmModule> module) =>
P2PandaImpl(module as ExternalLibrary);
P2PandaImpl.raw(this._platform);
Stream<LogEntry> subscribeLogStream({dynamic hint}) {
return _platform.executeStream(FlutterRustBridgeTask(
callFfi: (port_) => _platform.inner.wire_subscribe_log_stream(port_),
parseSuccessData: _wire2api_log_entry,
parseErrorData: null,
constMeta: kSubscribeLogStreamConstMeta,
argValues: [],
hint: hint,
));
}

FlutterRustBridgeTaskConstMeta get kSubscribeLogStreamConstMeta =>
const FlutterRustBridgeTaskConstMeta(
debugName: "subscribe_log_stream",
argNames: [],
);

Future<Uint8List> signAndEncodeEntry(
{required String logId,
required String seqNum,
Expand Down Expand Up @@ -331,24 +375,27 @@ class P2PandaImpl implements P2Panda {
);

Future<void> startNode(
{required KeyPair keyPair,
{required String logLevel,
required KeyPair keyPair,
required String databaseUrl,
required String blobsBasePath,
required List<String> relayAddresses,
required List<String> allowSchemaIds,
dynamic hint}) {
var arg0 = _platform.api2wire_box_autoadd_key_pair(keyPair);
var arg1 = _platform.api2wire_String(databaseUrl);
var arg2 = _platform.api2wire_String(blobsBasePath);
var arg3 = _platform.api2wire_StringList(relayAddresses);
var arg4 = _platform.api2wire_StringList(allowSchemaIds);
var arg0 = _platform.api2wire_String(logLevel);
var arg1 = _platform.api2wire_box_autoadd_key_pair(keyPair);
var arg2 = _platform.api2wire_String(databaseUrl);
var arg3 = _platform.api2wire_String(blobsBasePath);
var arg4 = _platform.api2wire_StringList(relayAddresses);
var arg5 = _platform.api2wire_StringList(allowSchemaIds);
return _platform.executeNormal(FlutterRustBridgeTask(
callFfi: (port_) =>
_platform.inner.wire_start_node(port_, arg0, arg1, arg2, arg3, arg4),
callFfi: (port_) => _platform.inner
.wire_start_node(port_, arg0, arg1, arg2, arg3, arg4, arg5),
parseSuccessData: _wire2api_unit,
parseErrorData: _wire2api_FrbAnyhowException,
constMeta: kStartNodeConstMeta,
argValues: [
logLevel,
keyPair,
databaseUrl,
blobsBasePath,
Expand All @@ -363,6 +410,7 @@ class P2PandaImpl implements P2Panda {
const FlutterRustBridgeTaskConstMeta(
debugName: "start_node",
argNames: [
"logLevel",
"keyPair",
"databaseUrl",
"blobsBasePath",
Expand Down Expand Up @@ -533,6 +581,22 @@ class P2PandaImpl implements P2Panda {
);
}

LogEntry _wire2api_log_entry(dynamic raw) {
final arr = raw as List<dynamic>;
if (arr.length != 4)
throw Exception('unexpected arr length: expect 4 but see ${arr.length}');
return LogEntry(
timestamp: _wire2api_u64(arr[0]),
level: _wire2api_log_level(arr[1]),
tag: _wire2api_String(arr[2]),
msg: _wire2api_String(arr[3]),
);
}

LogLevel _wire2api_log_level(dynamic raw) {
return LogLevel.values[raw as int];
}

OperationAction _wire2api_operation_action(dynamic raw) {
return OperationAction.values[raw as int];
}
Expand All @@ -541,6 +605,10 @@ class P2PandaImpl implements P2Panda {
return raw == null ? null : _wire2api_String(raw);
}

int _wire2api_u64(dynamic raw) {
return castInt(raw);
}

int _wire2api_u8(dynamic raw) {
return raw as int;
}
Expand Down Expand Up @@ -845,6 +913,20 @@ class P2PandaWire implements FlutterRustBridgeWireBase {
late final _init_frb_dart_api_dl = _init_frb_dart_api_dlPtr
.asFunction<int Function(ffi.Pointer<ffi.Void>)>();

void wire_subscribe_log_stream(
int port_,
) {
return _wire_subscribe_log_stream(
port_,
);
}

late final _wire_subscribe_log_streamPtr =
_lookup<ffi.NativeFunction<ffi.Void Function(ffi.Int64)>>(
'wire_subscribe_log_stream');
late final _wire_subscribe_log_stream =
_wire_subscribe_log_streamPtr.asFunction<void Function(int)>();

void wire_sign_and_encode_entry(
int port_,
ffi.Pointer<wire_uint_8_list> log_id,
Expand Down Expand Up @@ -955,6 +1037,7 @@ class P2PandaWire implements FlutterRustBridgeWireBase {

void wire_start_node(
int port_,
ffi.Pointer<wire_uint_8_list> log_level,
ffi.Pointer<wire_KeyPair> key_pair,
ffi.Pointer<wire_uint_8_list> database_url,
ffi.Pointer<wire_uint_8_list> blobs_base_path,
Expand All @@ -963,6 +1046,7 @@ class P2PandaWire implements FlutterRustBridgeWireBase {
) {
return _wire_start_node(
port_,
log_level,
key_pair,
database_url,
blobs_base_path,
Expand All @@ -975,6 +1059,7 @@ class P2PandaWire implements FlutterRustBridgeWireBase {
ffi.NativeFunction<
ffi.Void Function(
ffi.Int64,
ffi.Pointer<wire_uint_8_list>,
ffi.Pointer<wire_KeyPair>,
ffi.Pointer<wire_uint_8_list>,
ffi.Pointer<wire_uint_8_list>,
Expand All @@ -983,6 +1068,7 @@ class P2PandaWire implements FlutterRustBridgeWireBase {
late final _wire_start_node = _wire_start_nodePtr.asFunction<
void Function(
int,
ffi.Pointer<wire_uint_8_list>,
ffi.Pointer<wire_KeyPair>,
ffi.Pointer<wire_uint_8_list>,
ffi.Pointer<wire_uint_8_list>,
Expand Down
2 changes: 1 addition & 1 deletion packages/p2panda/native/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,4 @@ ed25519-dalek = "1.0.1"
flutter_rust_bridge = "1.82.6"
log = "0.4.19"
p2panda-rs = "0.8.1"
tokio = { version = "1.28.2", features = ["rt", "rt-multi-thread", "sync", "parking_lot"] }
tokio = { version = "1.28.2", features = ["rt"] }
Loading