config change

This commit is contained in:
John Smith
2022-02-09 09:47:36 -05:00
parent 70960fa592
commit b9862b0016
22 changed files with 880 additions and 1235 deletions

View File

@@ -1,955 +0,0 @@
// AUTO GENERATED FILE, DO NOT EDIT.
// Generated by `flutter_rust_bridge`.
// ignore_for_file: non_constant_identifier_names, unused_element, duplicate_ignore, directives_ordering, curly_braces_in_flow_control_structures, unnecessary_lambdas, slash_for_doc_comments, prefer_const_literals_to_create_immutables, implicit_dynamic_list_literal, duplicate_import, unused_import
import 'dart:convert';
import 'dart:typed_data';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter_rust_bridge/flutter_rust_bridge.dart';
import 'dart:ffi' as ffi;
part 'bridge_generated.freezed.dart';
abstract class VeilidFlutter {
Stream<VeilidUpdate> startupVeilidCore(
{required VeilidConfig config, dynamic hint});
Future<VeilidState> getVeilidState({dynamic hint});
Future<void> changeApiLogLevel(
{required VeilidLogLevel logLevel, dynamic hint});
Future<void> shutdownVeilidCore({dynamic hint});
Future<String> veilidVersionString({dynamic hint});
Future<VeilidVersion> veilidVersion({dynamic hint});
}
enum AttachmentState {
Detached,
Attaching,
AttachedWeak,
AttachedGood,
AttachedStrong,
FullyAttached,
OverAttached,
Detaching,
}
class VeilidConfig {
final String programName;
final String veilidNamespace;
final VeilidLogLevel apiLogLevel;
final bool capabilitiesProtocolUdp;
final bool capabilitiesProtocolConnectTcp;
final bool capabilitiesProtocolAcceptTcp;
final bool capabilitiesProtocolConnectWs;
final bool capabilitiesProtocolAcceptWs;
final bool capabilitiesProtocolConnectWss;
final bool capabilitiesProtocolAcceptWss;
final bool protectedStoreAllowInsecureFallback;
final bool protectedStoreAlwaysUseInsecureStorage;
final String protectedStoreInsecureFallbackDirectory;
final bool protectedStoreDelete;
final String tableStoreDirectory;
final bool tableStoreDelete;
final String blockStoreDirectory;
final bool blockStoreDelete;
final int networkMaxConnections;
final int networkConnectionInitialTimeoutMs;
final String networkNodeId;
final String networkNodeIdSecret;
final List<String> networkBootstrap;
final bool networkUpnp;
final bool networkNatpmp;
final bool networkEnableLocalPeerScope;
final int networkRestrictedNatRetries;
final int networkRpcConcurrency;
final int networkRpcQueueSize;
final int? networkRpcMaxTimestampBehindMs;
final int? networkRpcMaxTimestampAheadMs;
final int networkRpcTimeoutMs;
final int networkRpcMaxRouteHopCount;
final int? networkDhtResolveNodeTimeoutMs;
final int networkDhtResolveNodeCount;
final int networkDhtResolveNodeFanout;
final int networkDhtMaxFindNodeCount;
final int? networkDhtGetValueTimeoutMs;
final int networkDhtGetValueCount;
final int networkDhtGetValueFanout;
final int? networkDhtSetValueTimeoutMs;
final int networkDhtSetValueCount;
final int networkDhtSetValueFanout;
final int networkDhtMinPeerCount;
final int networkDhtMinPeerRefreshTimeMs;
final int networkDhtValidateDialInfoReceiptTimeMs;
final bool networkProtocolUdpEnabled;
final int networkProtocolUdpSocketPoolSize;
final String networkProtocolUdpListenAddress;
final String? networkProtocolUdpPublicAddress;
final bool networkProtocolTcpConnect;
final bool networkProtocolTcpListen;
final int networkProtocolTcpMaxConnections;
final String networkProtocolTcpListenAddress;
final String? networkProtocolTcpPublicAddress;
final bool networkProtocolWsConnect;
final bool networkProtocolWsListen;
final int networkProtocolWsMaxConnections;
final String networkProtocolWsListenAddress;
final String networkProtocolWsPath;
final String? networkProtocolWsUrl;
final bool networkProtocolWssConnect;
final int networkProtocolWssMaxConnections;
final int networkLeasesMaxServerSignalLeases;
final int networkLeasesMaxServerRelayLeases;
final int networkLeasesMaxClientSignalLeases;
final int networkLeasesMaxClientRelayLeases;
VeilidConfig({
required this.programName,
required this.veilidNamespace,
required this.apiLogLevel,
required this.capabilitiesProtocolUdp,
required this.capabilitiesProtocolConnectTcp,
required this.capabilitiesProtocolAcceptTcp,
required this.capabilitiesProtocolConnectWs,
required this.capabilitiesProtocolAcceptWs,
required this.capabilitiesProtocolConnectWss,
required this.capabilitiesProtocolAcceptWss,
required this.protectedStoreAllowInsecureFallback,
required this.protectedStoreAlwaysUseInsecureStorage,
required this.protectedStoreInsecureFallbackDirectory,
required this.protectedStoreDelete,
required this.tableStoreDirectory,
required this.tableStoreDelete,
required this.blockStoreDirectory,
required this.blockStoreDelete,
required this.networkMaxConnections,
required this.networkConnectionInitialTimeoutMs,
required this.networkNodeId,
required this.networkNodeIdSecret,
required this.networkBootstrap,
required this.networkUpnp,
required this.networkNatpmp,
required this.networkEnableLocalPeerScope,
required this.networkRestrictedNatRetries,
required this.networkRpcConcurrency,
required this.networkRpcQueueSize,
this.networkRpcMaxTimestampBehindMs,
this.networkRpcMaxTimestampAheadMs,
required this.networkRpcTimeoutMs,
required this.networkRpcMaxRouteHopCount,
this.networkDhtResolveNodeTimeoutMs,
required this.networkDhtResolveNodeCount,
required this.networkDhtResolveNodeFanout,
required this.networkDhtMaxFindNodeCount,
this.networkDhtGetValueTimeoutMs,
required this.networkDhtGetValueCount,
required this.networkDhtGetValueFanout,
this.networkDhtSetValueTimeoutMs,
required this.networkDhtSetValueCount,
required this.networkDhtSetValueFanout,
required this.networkDhtMinPeerCount,
required this.networkDhtMinPeerRefreshTimeMs,
required this.networkDhtValidateDialInfoReceiptTimeMs,
required this.networkProtocolUdpEnabled,
required this.networkProtocolUdpSocketPoolSize,
required this.networkProtocolUdpListenAddress,
this.networkProtocolUdpPublicAddress,
required this.networkProtocolTcpConnect,
required this.networkProtocolTcpListen,
required this.networkProtocolTcpMaxConnections,
required this.networkProtocolTcpListenAddress,
this.networkProtocolTcpPublicAddress,
required this.networkProtocolWsConnect,
required this.networkProtocolWsListen,
required this.networkProtocolWsMaxConnections,
required this.networkProtocolWsListenAddress,
required this.networkProtocolWsPath,
this.networkProtocolWsUrl,
required this.networkProtocolWssConnect,
required this.networkProtocolWssMaxConnections,
required this.networkLeasesMaxServerSignalLeases,
required this.networkLeasesMaxServerRelayLeases,
required this.networkLeasesMaxClientSignalLeases,
required this.networkLeasesMaxClientRelayLeases,
});
}
enum VeilidLogLevel {
Error,
Warn,
Info,
Debug,
Trace,
}
class VeilidState {
final AttachmentState attachment;
VeilidState({
required this.attachment,
});
}
@freezed
class VeilidUpdate with _$VeilidUpdate {
const factory VeilidUpdate.log({
required VeilidLogLevel logLevel,
required String message,
}) = Log;
const factory VeilidUpdate.attachment(
AttachmentState field0,
) = Attachment;
}
class VeilidVersion {
final int major;
final int minor;
final int patch;
VeilidVersion({
required this.major,
required this.minor,
required this.patch,
});
}
class VeilidFlutterImpl extends FlutterRustBridgeBase<VeilidFlutterWire>
implements VeilidFlutter {
factory VeilidFlutterImpl(ffi.DynamicLibrary dylib) =>
VeilidFlutterImpl.raw(VeilidFlutterWire(dylib));
VeilidFlutterImpl.raw(VeilidFlutterWire inner) : super(inner);
Stream<VeilidUpdate> startupVeilidCore(
{required VeilidConfig config, dynamic hint}) =>
executeStream(FlutterRustBridgeTask(
callFfi: (port_) => inner.wire_startup_veilid_core(
port_, _api2wire_box_autoadd_veilid_config(config)),
parseSuccessData: _wire2api_veilid_update,
constMeta: const FlutterRustBridgeTaskConstMeta(
debugName: "startup_veilid_core",
argNames: ["config"],
),
argValues: [config],
hint: hint,
));
Future<VeilidState> getVeilidState({dynamic hint}) =>
executeNormal(FlutterRustBridgeTask(
callFfi: (port_) => inner.wire_get_veilid_state(port_),
parseSuccessData: _wire2api_veilid_state,
constMeta: const FlutterRustBridgeTaskConstMeta(
debugName: "get_veilid_state",
argNames: [],
),
argValues: [],
hint: hint,
));
Future<void> changeApiLogLevel(
{required VeilidLogLevel logLevel, dynamic hint}) =>
executeNormal(FlutterRustBridgeTask(
callFfi: (port_) => inner.wire_change_api_log_level(
port_, _api2wire_veilid_log_level(logLevel)),
parseSuccessData: _wire2api_unit,
constMeta: const FlutterRustBridgeTaskConstMeta(
debugName: "change_api_log_level",
argNames: ["logLevel"],
),
argValues: [logLevel],
hint: hint,
));
Future<void> shutdownVeilidCore({dynamic hint}) =>
executeNormal(FlutterRustBridgeTask(
callFfi: (port_) => inner.wire_shutdown_veilid_core(port_),
parseSuccessData: _wire2api_unit,
constMeta: const FlutterRustBridgeTaskConstMeta(
debugName: "shutdown_veilid_core",
argNames: [],
),
argValues: [],
hint: hint,
));
Future<String> veilidVersionString({dynamic hint}) =>
executeNormal(FlutterRustBridgeTask(
callFfi: (port_) => inner.wire_veilid_version_string(port_),
parseSuccessData: _wire2api_String,
constMeta: const FlutterRustBridgeTaskConstMeta(
debugName: "veilid_version_string",
argNames: [],
),
argValues: [],
hint: hint,
));
Future<VeilidVersion> veilidVersion({dynamic hint}) =>
executeNormal(FlutterRustBridgeTask(
callFfi: (port_) => inner.wire_veilid_version(port_),
parseSuccessData: _wire2api_veilid_version,
constMeta: const FlutterRustBridgeTaskConstMeta(
debugName: "veilid_version",
argNames: [],
),
argValues: [],
hint: hint,
));
// Section: api2wire
ffi.Pointer<wire_uint_8_list> _api2wire_String(String raw) {
return _api2wire_uint_8_list(utf8.encoder.convert(raw));
}
ffi.Pointer<wire_StringList> _api2wire_StringList(List<String> raw) {
final ans = inner.new_StringList(raw.length);
for (var i = 0; i < raw.length; i++) {
ans.ref.ptr[i] = _api2wire_String(raw[i]);
}
return ans;
}
int _api2wire_bool(bool raw) {
return raw ? 1 : 0;
}
ffi.Pointer<ffi.Uint32> _api2wire_box_autoadd_u32(int raw) {
return inner.new_box_autoadd_u32(raw);
}
ffi.Pointer<wire_VeilidConfig> _api2wire_box_autoadd_veilid_config(
VeilidConfig raw) {
final ptr = inner.new_box_autoadd_veilid_config();
_api_fill_to_wire_veilid_config(raw, ptr.ref);
return ptr;
}
ffi.Pointer<wire_uint_8_list> _api2wire_opt_String(String? raw) {
return raw == null ? ffi.nullptr : _api2wire_String(raw);
}
ffi.Pointer<ffi.Uint32> _api2wire_opt_box_autoadd_u32(int? raw) {
return raw == null ? ffi.nullptr : _api2wire_box_autoadd_u32(raw);
}
int _api2wire_u32(int raw) {
return raw;
}
int _api2wire_u8(int raw) {
return raw;
}
ffi.Pointer<wire_uint_8_list> _api2wire_uint_8_list(Uint8List raw) {
final ans = inner.new_uint_8_list(raw.length);
ans.ref.ptr.asTypedList(raw.length).setAll(0, raw);
return ans;
}
int _api2wire_veilid_log_level(VeilidLogLevel raw) {
return raw.index;
}
// Section: api_fill_to_wire
void _api_fill_to_wire_box_autoadd_veilid_config(
VeilidConfig apiObj, ffi.Pointer<wire_VeilidConfig> wireObj) {
_api_fill_to_wire_veilid_config(apiObj, wireObj.ref);
}
void _api_fill_to_wire_veilid_config(
VeilidConfig apiObj, wire_VeilidConfig wireObj) {
wireObj.program_name = _api2wire_String(apiObj.programName);
wireObj.veilid_namespace = _api2wire_String(apiObj.veilidNamespace);
wireObj.api_log_level = _api2wire_veilid_log_level(apiObj.apiLogLevel);
wireObj.capabilities__protocol_udp =
_api2wire_bool(apiObj.capabilitiesProtocolUdp);
wireObj.capabilities__protocol_connect_tcp =
_api2wire_bool(apiObj.capabilitiesProtocolConnectTcp);
wireObj.capabilities__protocol_accept_tcp =
_api2wire_bool(apiObj.capabilitiesProtocolAcceptTcp);
wireObj.capabilities__protocol_connect_ws =
_api2wire_bool(apiObj.capabilitiesProtocolConnectWs);
wireObj.capabilities__protocol_accept_ws =
_api2wire_bool(apiObj.capabilitiesProtocolAcceptWs);
wireObj.capabilities__protocol_connect_wss =
_api2wire_bool(apiObj.capabilitiesProtocolConnectWss);
wireObj.capabilities__protocol_accept_wss =
_api2wire_bool(apiObj.capabilitiesProtocolAcceptWss);
wireObj.protected_store__allow_insecure_fallback =
_api2wire_bool(apiObj.protectedStoreAllowInsecureFallback);
wireObj.protected_store__always_use_insecure_storage =
_api2wire_bool(apiObj.protectedStoreAlwaysUseInsecureStorage);
wireObj.protected_store__insecure_fallback_directory =
_api2wire_String(apiObj.protectedStoreInsecureFallbackDirectory);
wireObj.protected_store__delete =
_api2wire_bool(apiObj.protectedStoreDelete);
wireObj.table_store__directory =
_api2wire_String(apiObj.tableStoreDirectory);
wireObj.table_store__delete = _api2wire_bool(apiObj.tableStoreDelete);
wireObj.block_store__directory =
_api2wire_String(apiObj.blockStoreDirectory);
wireObj.block_store__delete = _api2wire_bool(apiObj.blockStoreDelete);
wireObj.network__max_connections =
_api2wire_u32(apiObj.networkMaxConnections);
wireObj.network__connection_initial_timeout_ms =
_api2wire_u32(apiObj.networkConnectionInitialTimeoutMs);
wireObj.network__node_id = _api2wire_String(apiObj.networkNodeId);
wireObj.network__node_id_secret =
_api2wire_String(apiObj.networkNodeIdSecret);
wireObj.network__bootstrap = _api2wire_StringList(apiObj.networkBootstrap);
wireObj.network__upnp = _api2wire_bool(apiObj.networkUpnp);
wireObj.network__natpmp = _api2wire_bool(apiObj.networkNatpmp);
wireObj.network__enable_local_peer_scope =
_api2wire_bool(apiObj.networkEnableLocalPeerScope);
wireObj.network__restricted_nat_retries =
_api2wire_u32(apiObj.networkRestrictedNatRetries);
wireObj.network__rpc__concurrency =
_api2wire_u32(apiObj.networkRpcConcurrency);
wireObj.network__rpc__queue_size =
_api2wire_u32(apiObj.networkRpcQueueSize);
wireObj.network__rpc__max_timestamp_behind_ms =
_api2wire_opt_box_autoadd_u32(apiObj.networkRpcMaxTimestampBehindMs);
wireObj.network__rpc__max_timestamp_ahead_ms =
_api2wire_opt_box_autoadd_u32(apiObj.networkRpcMaxTimestampAheadMs);
wireObj.network__rpc__timeout_ms =
_api2wire_u32(apiObj.networkRpcTimeoutMs);
wireObj.network__rpc__max_route_hop_count =
_api2wire_u8(apiObj.networkRpcMaxRouteHopCount);
wireObj.network__dht__resolve_node_timeout_ms =
_api2wire_opt_box_autoadd_u32(apiObj.networkDhtResolveNodeTimeoutMs);
wireObj.network__dht__resolve_node_count =
_api2wire_u32(apiObj.networkDhtResolveNodeCount);
wireObj.network__dht__resolve_node_fanout =
_api2wire_u32(apiObj.networkDhtResolveNodeFanout);
wireObj.network__dht__max_find_node_count =
_api2wire_u32(apiObj.networkDhtMaxFindNodeCount);
wireObj.network__dht__get_value_timeout_ms =
_api2wire_opt_box_autoadd_u32(apiObj.networkDhtGetValueTimeoutMs);
wireObj.network__dht__get_value_count =
_api2wire_u32(apiObj.networkDhtGetValueCount);
wireObj.network__dht__get_value_fanout =
_api2wire_u32(apiObj.networkDhtGetValueFanout);
wireObj.network__dht__set_value_timeout_ms =
_api2wire_opt_box_autoadd_u32(apiObj.networkDhtSetValueTimeoutMs);
wireObj.network__dht__set_value_count =
_api2wire_u32(apiObj.networkDhtSetValueCount);
wireObj.network__dht__set_value_fanout =
_api2wire_u32(apiObj.networkDhtSetValueFanout);
wireObj.network__dht__min_peer_count =
_api2wire_u32(apiObj.networkDhtMinPeerCount);
wireObj.network__dht__min_peer_refresh_time_ms =
_api2wire_u32(apiObj.networkDhtMinPeerRefreshTimeMs);
wireObj.network__dht__validate_dial_info_receipt_time_ms =
_api2wire_u32(apiObj.networkDhtValidateDialInfoReceiptTimeMs);
wireObj.network__protocol__udp__enabled =
_api2wire_bool(apiObj.networkProtocolUdpEnabled);
wireObj.network__protocol__udp__socket_pool_size =
_api2wire_u32(apiObj.networkProtocolUdpSocketPoolSize);
wireObj.network__protocol__udp__listen_address =
_api2wire_String(apiObj.networkProtocolUdpListenAddress);
wireObj.network__protocol__udp__public_address =
_api2wire_opt_String(apiObj.networkProtocolUdpPublicAddress);
wireObj.network__protocol__tcp__connect =
_api2wire_bool(apiObj.networkProtocolTcpConnect);
wireObj.network__protocol__tcp__listen =
_api2wire_bool(apiObj.networkProtocolTcpListen);
wireObj.network__protocol__tcp__max_connections =
_api2wire_u32(apiObj.networkProtocolTcpMaxConnections);
wireObj.network__protocol__tcp__listen_address =
_api2wire_String(apiObj.networkProtocolTcpListenAddress);
wireObj.network__protocol__tcp__public_address =
_api2wire_opt_String(apiObj.networkProtocolTcpPublicAddress);
wireObj.network__protocol__ws__connect =
_api2wire_bool(apiObj.networkProtocolWsConnect);
wireObj.network__protocol__ws__listen =
_api2wire_bool(apiObj.networkProtocolWsListen);
wireObj.network__protocol__ws__max_connections =
_api2wire_u32(apiObj.networkProtocolWsMaxConnections);
wireObj.network__protocol__ws__listen_address =
_api2wire_String(apiObj.networkProtocolWsListenAddress);
wireObj.network__protocol__ws__path =
_api2wire_String(apiObj.networkProtocolWsPath);
wireObj.network__protocol__ws__url =
_api2wire_opt_String(apiObj.networkProtocolWsUrl);
wireObj.network__protocol__wss__connect =
_api2wire_bool(apiObj.networkProtocolWssConnect);
wireObj.network__protocol__wss__max_connections =
_api2wire_u32(apiObj.networkProtocolWssMaxConnections);
wireObj.network__leases__max_server_signal_leases =
_api2wire_u32(apiObj.networkLeasesMaxServerSignalLeases);
wireObj.network__leases__max_server_relay_leases =
_api2wire_u32(apiObj.networkLeasesMaxServerRelayLeases);
wireObj.network__leases__max_client_signal_leases =
_api2wire_u32(apiObj.networkLeasesMaxClientSignalLeases);
wireObj.network__leases__max_client_relay_leases =
_api2wire_u32(apiObj.networkLeasesMaxClientRelayLeases);
}
}
// Section: wire2api
String _wire2api_String(dynamic raw) {
return raw as String;
}
AttachmentState _wire2api_attachment_state(dynamic raw) {
return AttachmentState.values[raw];
}
int _wire2api_u32(dynamic raw) {
return raw as int;
}
int _wire2api_u8(dynamic raw) {
return raw as int;
}
Uint8List _wire2api_uint_8_list(dynamic raw) {
return raw as Uint8List;
}
void _wire2api_unit(dynamic raw) {
return;
}
VeilidLogLevel _wire2api_veilid_log_level(dynamic raw) {
return VeilidLogLevel.values[raw];
}
VeilidState _wire2api_veilid_state(dynamic raw) {
final arr = raw as List<dynamic>;
if (arr.length != 1)
throw Exception('unexpected arr length: expect 1 but see ${arr.length}');
return VeilidState(
attachment: _wire2api_attachment_state(arr[0]),
);
}
VeilidUpdate _wire2api_veilid_update(dynamic raw) {
switch (raw[0]) {
case 0:
return Log(
logLevel: _wire2api_veilid_log_level(raw[1]),
message: _wire2api_String(raw[2]),
);
case 1:
return Attachment(
_wire2api_attachment_state(raw[1]),
);
default:
throw Exception("unreachable");
}
}
VeilidVersion _wire2api_veilid_version(dynamic raw) {
final arr = raw as List<dynamic>;
if (arr.length != 3)
throw Exception('unexpected arr length: expect 3 but see ${arr.length}');
return VeilidVersion(
major: _wire2api_u32(arr[0]),
minor: _wire2api_u32(arr[1]),
patch: _wire2api_u32(arr[2]),
);
}
// ignore_for_file: camel_case_types, non_constant_identifier_names, avoid_positional_boolean_parameters, annotate_overrides, constant_identifier_names
// AUTO GENERATED FILE, DO NOT EDIT.
//
// Generated by `package:ffigen`.
/// generated by flutter_rust_bridge
class VeilidFlutterWire implements FlutterRustBridgeWireBase {
/// Holds the symbol lookup function.
final ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
_lookup;
/// The symbols are looked up in [dynamicLibrary].
VeilidFlutterWire(ffi.DynamicLibrary dynamicLibrary)
: _lookup = dynamicLibrary.lookup;
/// The symbols are looked up with [lookup].
VeilidFlutterWire.fromLookup(
ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
lookup)
: _lookup = lookup;
void wire_startup_veilid_core(
int port_,
ffi.Pointer<wire_VeilidConfig> config,
) {
return _wire_startup_veilid_core(
port_,
config,
);
}
late final _wire_startup_veilid_corePtr = _lookup<
ffi.NativeFunction<
ffi.Void Function(ffi.Int64,
ffi.Pointer<wire_VeilidConfig>)>>('wire_startup_veilid_core');
late final _wire_startup_veilid_core = _wire_startup_veilid_corePtr
.asFunction<void Function(int, ffi.Pointer<wire_VeilidConfig>)>();
void wire_get_veilid_state(
int port_,
) {
return _wire_get_veilid_state(
port_,
);
}
late final _wire_get_veilid_statePtr =
_lookup<ffi.NativeFunction<ffi.Void Function(ffi.Int64)>>(
'wire_get_veilid_state');
late final _wire_get_veilid_state =
_wire_get_veilid_statePtr.asFunction<void Function(int)>();
void wire_change_api_log_level(
int port_,
int log_level,
) {
return _wire_change_api_log_level(
port_,
log_level,
);
}
late final _wire_change_api_log_levelPtr =
_lookup<ffi.NativeFunction<ffi.Void Function(ffi.Int64, ffi.Int32)>>(
'wire_change_api_log_level');
late final _wire_change_api_log_level =
_wire_change_api_log_levelPtr.asFunction<void Function(int, int)>();
void wire_shutdown_veilid_core(
int port_,
) {
return _wire_shutdown_veilid_core(
port_,
);
}
late final _wire_shutdown_veilid_corePtr =
_lookup<ffi.NativeFunction<ffi.Void Function(ffi.Int64)>>(
'wire_shutdown_veilid_core');
late final _wire_shutdown_veilid_core =
_wire_shutdown_veilid_corePtr.asFunction<void Function(int)>();
void wire_veilid_version_string(
int port_,
) {
return _wire_veilid_version_string(
port_,
);
}
late final _wire_veilid_version_stringPtr =
_lookup<ffi.NativeFunction<ffi.Void Function(ffi.Int64)>>(
'wire_veilid_version_string');
late final _wire_veilid_version_string =
_wire_veilid_version_stringPtr.asFunction<void Function(int)>();
void wire_veilid_version(
int port_,
) {
return _wire_veilid_version(
port_,
);
}
late final _wire_veilid_versionPtr =
_lookup<ffi.NativeFunction<ffi.Void Function(ffi.Int64)>>(
'wire_veilid_version');
late final _wire_veilid_version =
_wire_veilid_versionPtr.asFunction<void Function(int)>();
ffi.Pointer<wire_StringList> new_StringList(
int len,
) {
return _new_StringList(
len,
);
}
late final _new_StringListPtr = _lookup<
ffi.NativeFunction<ffi.Pointer<wire_StringList> Function(ffi.Int32)>>(
'new_StringList');
late final _new_StringList = _new_StringListPtr
.asFunction<ffi.Pointer<wire_StringList> Function(int)>();
ffi.Pointer<ffi.Uint32> new_box_autoadd_u32(
int value,
) {
return _new_box_autoadd_u32(
value,
);
}
late final _new_box_autoadd_u32Ptr =
_lookup<ffi.NativeFunction<ffi.Pointer<ffi.Uint32> Function(ffi.Uint32)>>(
'new_box_autoadd_u32');
late final _new_box_autoadd_u32 = _new_box_autoadd_u32Ptr
.asFunction<ffi.Pointer<ffi.Uint32> Function(int)>();
ffi.Pointer<wire_VeilidConfig> new_box_autoadd_veilid_config() {
return _new_box_autoadd_veilid_config();
}
late final _new_box_autoadd_veilid_configPtr =
_lookup<ffi.NativeFunction<ffi.Pointer<wire_VeilidConfig> Function()>>(
'new_box_autoadd_veilid_config');
late final _new_box_autoadd_veilid_config = _new_box_autoadd_veilid_configPtr
.asFunction<ffi.Pointer<wire_VeilidConfig> Function()>();
ffi.Pointer<wire_uint_8_list> new_uint_8_list(
int len,
) {
return _new_uint_8_list(
len,
);
}
late final _new_uint_8_listPtr = _lookup<
ffi.NativeFunction<
ffi.Pointer<wire_uint_8_list> Function(
ffi.Int32)>>('new_uint_8_list');
late final _new_uint_8_list = _new_uint_8_listPtr
.asFunction<ffi.Pointer<wire_uint_8_list> Function(int)>();
void free_WireSyncReturnStruct(
WireSyncReturnStruct val,
) {
return _free_WireSyncReturnStruct(
val,
);
}
late final _free_WireSyncReturnStructPtr =
_lookup<ffi.NativeFunction<ffi.Void Function(WireSyncReturnStruct)>>(
'free_WireSyncReturnStruct');
late final _free_WireSyncReturnStruct = _free_WireSyncReturnStructPtr
.asFunction<void Function(WireSyncReturnStruct)>();
void store_dart_post_cobject(
DartPostCObjectFnType ptr,
) {
return _store_dart_post_cobject(
ptr,
);
}
late final _store_dart_post_cobjectPtr =
_lookup<ffi.NativeFunction<ffi.Void Function(DartPostCObjectFnType)>>(
'store_dart_post_cobject');
late final _store_dart_post_cobject = _store_dart_post_cobjectPtr
.asFunction<void Function(DartPostCObjectFnType)>();
}
class wire_uint_8_list extends ffi.Struct {
external ffi.Pointer<ffi.Uint8> ptr;
@ffi.Int32()
external int len;
}
class wire_StringList extends ffi.Struct {
external ffi.Pointer<ffi.Pointer<wire_uint_8_list>> ptr;
@ffi.Int32()
external int len;
}
class wire_VeilidConfig extends ffi.Struct {
external ffi.Pointer<wire_uint_8_list> program_name;
external ffi.Pointer<wire_uint_8_list> veilid_namespace;
@ffi.Int32()
external int api_log_level;
@ffi.Uint8()
external int capabilities__protocol_udp;
@ffi.Uint8()
external int capabilities__protocol_connect_tcp;
@ffi.Uint8()
external int capabilities__protocol_accept_tcp;
@ffi.Uint8()
external int capabilities__protocol_connect_ws;
@ffi.Uint8()
external int capabilities__protocol_accept_ws;
@ffi.Uint8()
external int capabilities__protocol_connect_wss;
@ffi.Uint8()
external int capabilities__protocol_accept_wss;
@ffi.Uint8()
external int protected_store__allow_insecure_fallback;
@ffi.Uint8()
external int protected_store__always_use_insecure_storage;
external ffi.Pointer<wire_uint_8_list>
protected_store__insecure_fallback_directory;
@ffi.Uint8()
external int protected_store__delete;
external ffi.Pointer<wire_uint_8_list> table_store__directory;
@ffi.Uint8()
external int table_store__delete;
external ffi.Pointer<wire_uint_8_list> block_store__directory;
@ffi.Uint8()
external int block_store__delete;
@ffi.Uint32()
external int network__max_connections;
@ffi.Uint32()
external int network__connection_initial_timeout_ms;
external ffi.Pointer<wire_uint_8_list> network__node_id;
external ffi.Pointer<wire_uint_8_list> network__node_id_secret;
external ffi.Pointer<wire_StringList> network__bootstrap;
@ffi.Uint8()
external int network__upnp;
@ffi.Uint8()
external int network__natpmp;
@ffi.Uint8()
external int network__enable_local_peer_scope;
@ffi.Uint32()
external int network__restricted_nat_retries;
@ffi.Uint32()
external int network__rpc__concurrency;
@ffi.Uint32()
external int network__rpc__queue_size;
external ffi.Pointer<ffi.Uint32> network__rpc__max_timestamp_behind_ms;
external ffi.Pointer<ffi.Uint32> network__rpc__max_timestamp_ahead_ms;
@ffi.Uint32()
external int network__rpc__timeout_ms;
@ffi.Uint8()
external int network__rpc__max_route_hop_count;
external ffi.Pointer<ffi.Uint32> network__dht__resolve_node_timeout_ms;
@ffi.Uint32()
external int network__dht__resolve_node_count;
@ffi.Uint32()
external int network__dht__resolve_node_fanout;
@ffi.Uint32()
external int network__dht__max_find_node_count;
external ffi.Pointer<ffi.Uint32> network__dht__get_value_timeout_ms;
@ffi.Uint32()
external int network__dht__get_value_count;
@ffi.Uint32()
external int network__dht__get_value_fanout;
external ffi.Pointer<ffi.Uint32> network__dht__set_value_timeout_ms;
@ffi.Uint32()
external int network__dht__set_value_count;
@ffi.Uint32()
external int network__dht__set_value_fanout;
@ffi.Uint32()
external int network__dht__min_peer_count;
@ffi.Uint32()
external int network__dht__min_peer_refresh_time_ms;
@ffi.Uint32()
external int network__dht__validate_dial_info_receipt_time_ms;
@ffi.Uint8()
external int network__protocol__udp__enabled;
@ffi.Uint32()
external int network__protocol__udp__socket_pool_size;
external ffi.Pointer<wire_uint_8_list> network__protocol__udp__listen_address;
external ffi.Pointer<wire_uint_8_list> network__protocol__udp__public_address;
@ffi.Uint8()
external int network__protocol__tcp__connect;
@ffi.Uint8()
external int network__protocol__tcp__listen;
@ffi.Uint32()
external int network__protocol__tcp__max_connections;
external ffi.Pointer<wire_uint_8_list> network__protocol__tcp__listen_address;
external ffi.Pointer<wire_uint_8_list> network__protocol__tcp__public_address;
@ffi.Uint8()
external int network__protocol__ws__connect;
@ffi.Uint8()
external int network__protocol__ws__listen;
@ffi.Uint32()
external int network__protocol__ws__max_connections;
external ffi.Pointer<wire_uint_8_list> network__protocol__ws__listen_address;
external ffi.Pointer<wire_uint_8_list> network__protocol__ws__path;
external ffi.Pointer<wire_uint_8_list> network__protocol__ws__url;
@ffi.Uint8()
external int network__protocol__wss__connect;
@ffi.Uint32()
external int network__protocol__wss__max_connections;
@ffi.Uint32()
external int network__leases__max_server_signal_leases;
@ffi.Uint32()
external int network__leases__max_server_relay_leases;
@ffi.Uint32()
external int network__leases__max_client_signal_leases;
@ffi.Uint32()
external int network__leases__max_client_relay_leases;
}
typedef DartPostCObjectFnType = ffi.Pointer<
ffi.NativeFunction<ffi.Uint8 Function(DartPort, ffi.Pointer<ffi.Void>)>>;
typedef DartPort = ffi.Int64;

View File

@@ -1,69 +1,336 @@
import 'dart:async';
import 'dart:typed_data';
import 'dart:convert';
import 'package:flutter/services.dart';
import 'package:flutter/material.dart';
import 'package:oxidized/oxidized.dart';
import 'package:change_case/change_case.dart';
import 'veilid_stub.dart'
if (dart.library.io) 'veilid_ffi.dart'
if (dart.library.js) 'veilid_js.dart';
if (dart.library.io) 'veilid_ffi.dart'
if (dart.library.js) 'veilid_js.dart';
//////////////////////////////////////////////////////////
enum AttachmentState {
Detached,
Attaching,
AttachedWeak,
AttachedGood,
AttachedStrong,
FullyAttached,
OverAttached,
Detaching,
//////////////////////////////////////
/// JSON Encode Helper
Object? veilidApiToEncodable(Object? value) {
if (value == null) {
return value;
}
switch (value.runtimeType) {
case AttachmentState:
return (value as AttachmentState).json;
case VeilidLogLevel:
return (value as VeilidLogLevel).json;
}
throw UnsupportedError('Cannot convert to JSON: $value');
}
//////////////////////////////////////
/// AttachmentState
enum AttachmentState {
detached,
attaching,
attachedWeak,
attachedGood,
attachedStrong,
fullyAttached,
overAttached,
detaching,
}
extension AttachmentStateExt on AttachmentState {
String get json {
return name.toPascalCase();
}
}
AttachmentState attachmentStateFromJson(String j) {
return AttachmentState.values.byName(j.toCamelCase());
}
//////////////////////////////////////
/// VeilidLogLevel
enum VeilidLogLevel {
Error,
Warn,
Info,
Debug,
Trace,
error,
warn,
info,
debug,
trace,
}
// VeilidVersion
extension VeilidLogLevelExt on VeilidLogLevel {
String get json {
return name.toPascalCase();
}
}
class VeilidVersion {
final int major;
final int minor;
final int patch;
VeilidLogLevel veilidLogLevelFromJson(String j) {
return VeilidLogLevel.values.byName(j.toCamelCase());
}
VeilidVersion({
required this.major,
required this.minor,
required this.patch,
//////////////////////////////////////
/// VeilidConfig
class VeilidConfig {
String programName;
String veilidNamespace;
VeilidLogLevel apiLogLevel;
bool capabilitiesProtocolUdp;
bool capabilitiesProtocolConnectTcp;
bool capabilitiesProtocolAcceptTcp;
bool capabilitiesProtocolConnectWs;
bool capabilitiesProtocolAcceptWs;
bool capabilitiesProtocolConnectWss;
bool capabilitiesProtocolAcceptWss;
bool protectedStoreAllowInsecureFallback;
bool protectedStoreAlwaysUseInsecureStorage;
String protectedStoreInsecureFallbackDirectory;
bool protectedStoreDelete;
String tableStoreDirectory;
bool tableStoreDelete;
String blockStoreDirectory;
bool blockStoreDelete;
int networkMaxConnections;
int networkConnectionInitialTimeoutMs;
String networkNodeId;
String networkNodeIdSecret;
List<String> networkBootstrap;
bool networkUpnp;
bool networkNatpmp;
bool networkEnableLocalPeerScope;
int networkRestrictedNatRetries;
int networkRpcConcurrency;
int networkRpcQueueSize;
int? networkRpcMaxTimestampBehindMs;
int? networkRpcMaxTimestampAheadMs;
int networkRpcTimeoutMs;
int networkRpcMaxRouteHopCount;
int? networkDhtResolveNodeTimeoutMs;
int networkDhtResolveNodeCount;
int networkDhtResolveNodeFanout;
int networkDhtMaxFindNodeCount;
int? networkDhtGetValueTimeoutMs;
int networkDhtGetValueCount;
int networkDhtGetValueFanout;
int? networkDhtSetValueTimeoutMs;
int networkDhtSetValueCount;
int networkDhtSetValueFanout;
int networkDhtMinPeerCount;
int networkDhtMinPeerRefreshTimeMs;
int networkDhtValidateDialInfoReceiptTimeMs;
bool networkProtocolUdpEnabled;
int networkProtocolUdpSocketPoolSize;
String networkProtocolUdpListenAddress;
String? networkProtocolUdpPublicAddress;
bool networkProtocolTcpConnect;
bool networkProtocolTcpListen;
int networkProtocolTcpMaxConnections;
String networkProtocolTcpListenAddress;
String? networkProtocolTcpPublicAddress;
bool networkProtocolWsConnect;
bool networkProtocolWsListen;
int networkProtocolWsMaxConnections;
String networkProtocolWsListenAddress;
String networkProtocolWsPath;
String? networkProtocolWsUrl;
bool networkProtocolWssConnect;
int networkProtocolWssMaxConnections;
int networkLeasesMaxServerSignalLeases;
int networkLeasesMaxServerRelayLeases;
int networkLeasesMaxClientSignalLeases;
int networkLeasesMaxClientRelayLeases;
VeilidConfig({
required this.programName,
required this.veilidNamespace,
required this.apiLogLevel,
required this.capabilitiesProtocolUdp,
required this.capabilitiesProtocolConnectTcp,
required this.capabilitiesProtocolAcceptTcp,
required this.capabilitiesProtocolConnectWs,
required this.capabilitiesProtocolAcceptWs,
required this.capabilitiesProtocolConnectWss,
required this.capabilitiesProtocolAcceptWss,
required this.protectedStoreAllowInsecureFallback,
required this.protectedStoreAlwaysUseInsecureStorage,
required this.protectedStoreInsecureFallbackDirectory,
required this.protectedStoreDelete,
required this.tableStoreDirectory,
required this.tableStoreDelete,
required this.blockStoreDirectory,
required this.blockStoreDelete,
required this.networkMaxConnections,
required this.networkConnectionInitialTimeoutMs,
required this.networkNodeId,
required this.networkNodeIdSecret,
required this.networkBootstrap,
required this.networkUpnp,
required this.networkNatpmp,
required this.networkEnableLocalPeerScope,
required this.networkRestrictedNatRetries,
required this.networkRpcConcurrency,
required this.networkRpcQueueSize,
this.networkRpcMaxTimestampBehindMs,
this.networkRpcMaxTimestampAheadMs,
required this.networkRpcTimeoutMs,
required this.networkRpcMaxRouteHopCount,
this.networkDhtResolveNodeTimeoutMs,
required this.networkDhtResolveNodeCount,
required this.networkDhtResolveNodeFanout,
required this.networkDhtMaxFindNodeCount,
this.networkDhtGetValueTimeoutMs,
required this.networkDhtGetValueCount,
required this.networkDhtGetValueFanout,
this.networkDhtSetValueTimeoutMs,
required this.networkDhtSetValueCount,
required this.networkDhtSetValueFanout,
required this.networkDhtMinPeerCount,
required this.networkDhtMinPeerRefreshTimeMs,
required this.networkDhtValidateDialInfoReceiptTimeMs,
required this.networkProtocolUdpEnabled,
required this.networkProtocolUdpSocketPoolSize,
required this.networkProtocolUdpListenAddress,
this.networkProtocolUdpPublicAddress,
required this.networkProtocolTcpConnect,
required this.networkProtocolTcpListen,
required this.networkProtocolTcpMaxConnections,
required this.networkProtocolTcpListenAddress,
this.networkProtocolTcpPublicAddress,
required this.networkProtocolWsConnect,
required this.networkProtocolWsListen,
required this.networkProtocolWsMaxConnections,
required this.networkProtocolWsListenAddress,
required this.networkProtocolWsPath,
this.networkProtocolWsUrl,
required this.networkProtocolWssConnect,
required this.networkProtocolWssMaxConnections,
required this.networkLeasesMaxServerSignalLeases,
required this.networkLeasesMaxServerRelayLeases,
required this.networkLeasesMaxClientSignalLeases,
required this.networkLeasesMaxClientRelayLeases,
});
String get json {
return "";
}
factory VeilidConfig.fromJson(String json) {
var parsed = jsonDecode(json);
VeilidConfig({
programName: parsed["program_name"],
veilidNamespace: parsed["veilid_namespace"],
apiLogLevel: veilidLogLevelFromJson(parsed["api_log_level"]),
capabilitiesProtocolUdp: parsed["capabilities__protocol_udp"],
capabilitiesProtocolConnectTcp: parsed["capabilities__protocol_connect_tcp"],
capabilitiesProtocolAcceptTcp: parsed["capabilities__protocol_accept_tcp"],
capabilitiesProtocolConnectWs: parsed["capabilities__protocol_connect_ws"],
capabilitiesProtocolAcceptWs: parsed["capabilities__protocol_accept_ws"],
capabilitiesProtocolConnectWss: parsed["capabilities__protocol_connect_wss"]
// required this.capabilitiesProtocolAcceptWss,
// required this.protectedStoreAllowInsecureFallback,
// required this.protectedStoreAlwaysUseInsecureStorage,
// required this.protectedStoreInsecureFallbackDirectory,
// required this.protectedStoreDelete,
// required this.tableStoreDirectory,
// required this.tableStoreDelete,
// required this.blockStoreDirectory,
// required this.blockStoreDelete,
// required this.networkMaxConnections,
// required this.networkConnectionInitialTimeoutMs,
// required this.networkNodeId,
// required this.networkNodeIdSecret,
// required this.networkBootstrap,
// required this.networkUpnp,
// required this.networkNatpmp,
// required this.networkEnableLocalPeerScope,
// required this.networkRestrictedNatRetries,
// required this.networkRpcConcurrency,
// required this.networkRpcQueueSize,
// this.networkRpcMaxTimestampBehindMs,
// this.networkRpcMaxTimestampAheadMs,
// required this.networkRpcTimeoutMs,
// required this.networkRpcMaxRouteHopCount,
// this.networkDhtResolveNodeTimeoutMs,
// required this.networkDhtResolveNodeCount,
// required this.networkDhtResolveNodeFanout,
// required this.networkDhtMaxFindNodeCount,
// this.networkDhtGetValueTimeoutMs,
// required this.networkDhtGetValueCount,
// required this.networkDhtGetValueFanout,
// this.networkDhtSetValueTimeoutMs,
// required this.networkDhtSetValueCount,
// required this.networkDhtSetValueFanout,
// required this.networkDhtMinPeerCount,
// required this.networkDhtMinPeerRefreshTimeMs,
// required this.networkDhtValidateDialInfoReceiptTimeMs,
// required this.networkProtocolUdpEnabled,
// required this.networkProtocolUdpSocketPoolSize,
// required this.networkProtocolUdpListenAddress,
// this.networkProtocolUdpPublicAddress,
// required this.networkProtocolTcpConnect,
// required this.networkProtocolTcpListen,
// required this.networkProtocolTcpMaxConnections,
// required this.networkProtocolTcpListenAddress,
// this.networkProtocolTcpPublicAddress,
// required this.networkProtocolWsConnect,
// required this.networkProtocolWsListen,
// required this.networkProtocolWsMaxConnections,
// required this.networkProtocolWsListenAddress,
// required this.networkProtocolWsPath,
// this.networkProtocolWsUrl,
// required this.networkProtocolWssConnect,
// required this.networkProtocolWssMaxConnections,
// required this.networkLeasesMaxServerSignalLeases,
// required this.networkLeasesMaxServerRelayLeases,
// required this.networkLeasesMaxClientSignalLeases,
// required this.networkLeasesMaxClientRelayLeases,
})
}
}
// VeilidUpdate
//////////////////////////////////////
/// VeilidUpdate
abstract class VeilidUpdate {
VeilidUpdateKind get kind;
factory VeilidUpdate.fromJson(String json) {
var parsed = jsonDecode(json);
switch (parsed["kind"]) {
case "Log":
{
return VeilidUpdateLog(
veilidLogLevelFromJson(parsed["log_level"]), parsed["message"]);
}
case "Attachment":
{
return VeilidUpdateAttachment(
attachmentStateFromJson(parsed["state"]));
}
default:
{
throw VeilidAPIExceptionInternal(
"Invalid VeilidAPIException type: ${parsed['kind']}");
}
}
}
}
class VeilidUpdateLog implements VeilidUpdate {
final VeilidLogLevel logLevel;
final String message;
//
VeilidUpdateLog(this.logLevel, this.message);
}
class VeilidUpdateAttachment implements VeilidUpdate {
final AttachmentState state;
//
VeilidUpdateAttachment(this.state);
}
// VeilidState
//////////////////////////////////////
/// VeilidState
class VeilidState {
final AttachmentState attachment;
@@ -71,22 +338,206 @@ class VeilidState {
VeilidState(this.attachment);
}
//////////////////////////////////////
/// VeilidAPIException
abstract class VeilidAPIException implements Exception {
factory VeilidAPIException.fromJson(String json) {
var parsed = jsonDecode(json);
switch (parsed["kind"]) {
case "NotInitialized":
{
return VeilidAPIExceptionNotInitialized();
}
case "AlreadyInitialized":
{
return VeilidAPIExceptionAlreadyInitialized();
}
case "Timeout":
{
return VeilidAPIExceptionTimeout();
}
case "Shutdown":
{
return VeilidAPIExceptionShutdown();
}
case "NodeNotFound":
{
return VeilidAPIExceptionNodeNotFound(parsed["node_id"]);
}
case "NoDialInfo":
{
return VeilidAPIExceptionNoDialInfo(parsed["node_id"]);
}
case "Internal":
{
return VeilidAPIExceptionInternal(parsed["message"]);
}
case "Unimplemented":
{
return VeilidAPIExceptionUnimplemented(parsed["unimplemented"]);
}
case "ParseError":
{
return VeilidAPIExceptionParseError(
parsed["message"], parsed["value"]);
}
case "InvalidArgument":
{
return VeilidAPIExceptionInvalidArgument(
parsed["context"], parsed["argument"], parsed["value"]);
}
case "MissingArgument":
{
return VeilidAPIExceptionMissingArgument(
parsed["context"], parsed["argument"]);
}
default:
{
throw VeilidAPIExceptionInternal(
"Invalid VeilidAPIException type: ${parsed['kind']}");
}
}
}
}
// Veilid singleton factory
class VeilidAPIExceptionNotInitialized implements VeilidAPIException {
@override
String toString() {
return "VeilidAPIException: NotInitialized";
}
}
abstract class Veilid {
static Veilid _instance;
class VeilidAPIExceptionAlreadyInitialized implements VeilidAPIException {
@override
String toString() {
return "VeilidAPIException: AlreadyInitialized";
}
}
static Veilid get instance {
_instance ??= getVeilid();
return _instance;
class VeilidAPIExceptionTimeout implements VeilidAPIException {
@override
String toString() {
return "VeilidAPIException: Timeout";
}
}
class VeilidAPIExceptionShutdown implements VeilidAPIException {
@override
String toString() {
return "VeilidAPIException: Shutdown";
}
}
class VeilidAPIExceptionNodeNotFound implements VeilidAPIException {
final String nodeId;
@override
String toString() {
return "VeilidAPIException: NodeNotFound (nodeId: $nodeId)";
}
Stream<VeilidUpdate> startupVeilidCore(String config);
Future<Result<VeilidState, VeilidAPIError>> getVeilidState();
Future<Result<Unit, VeilidAPIError>> changeApiLogLevel(VeilidLogLevel logLevel);
Future<Result<Unit, VeilidAPIError>> shutdownVeilidCore();
//
VeilidAPIExceptionNodeNotFound(this.nodeId);
}
class VeilidAPIExceptionNoDialInfo implements VeilidAPIException {
final String nodeId;
@override
String toString() {
return "VeilidAPIException: NoDialInfo (nodeId: $nodeId)";
}
//
VeilidAPIExceptionNoDialInfo(this.nodeId);
}
class VeilidAPIExceptionInternal implements VeilidAPIException {
final String message;
@override
String toString() {
return "VeilidAPIException: Internal ($message)";
}
//
VeilidAPIExceptionInternal(this.message);
}
class VeilidAPIExceptionUnimplemented implements VeilidAPIException {
final String message;
@override
String toString() {
return "VeilidAPIException: Unimplemented ($message)";
}
//
VeilidAPIExceptionUnimplemented(this.message);
}
class VeilidAPIExceptionParseError implements VeilidAPIException {
final String message;
final String value;
@override
String toString() {
return "VeilidAPIException: ParseError ($message)\n value: $value";
}
//
VeilidAPIExceptionParseError(this.message, this.value);
}
class VeilidAPIExceptionInvalidArgument implements VeilidAPIException {
final String context;
final String argument;
final String value;
@override
String toString() {
return "VeilidAPIException: InvalidArgument ($context:$argument)\n value: $value";
}
//
VeilidAPIExceptionInvalidArgument(this.context, this.argument, this.value);
}
class VeilidAPIExceptionMissingArgument implements VeilidAPIException {
final String context;
final String argument;
@override
String toString() {
return "VeilidAPIException: MissingArgument ($context:$argument)";
}
//
VeilidAPIExceptionMissingArgument(this.context, this.argument);
}
//////////////////////////////////////
/// VeilidVersion
class VeilidVersion {
final int major;
final int minor;
final int patch;
VeilidVersion(this.major, this.minor, this.patch);
}
//////////////////////////////////////
/// Veilid singleton factory
abstract class Veilid {
static late Veilid instance = getVeilid();
Stream<VeilidUpdate> startupVeilidCore(VeilidConfig config);
Future<VeilidState> getVeilidState();
Future<void> changeApiLogLevel(VeilidLogLevel logLevel);
Future<void> shutdownVeilidCore();
String veilidVersionString();
VeilidVersion veilidVersion();
}

View File

@@ -1,12 +1,12 @@
import 'dart:async';
import 'dart:ffi' as ffi;
import 'dart:ffi';
import 'dart:io';
import 'dart:typed_data';
import 'dart:isolate';
import 'dart:convert';
import 'package:ffi/ffi.dart';
import 'package:flutter/services.dart';
import 'package:flutter/material.dart';
import 'package:oxidized/oxidized.dart';
import 'veilid.dart';
//////////////////////////////////////////////////////////
@@ -17,16 +17,19 @@ final _path = Platform.isWindows
: Platform.isMacOS
? 'lib$_base.dylib'
: 'lib$_base.so';
late final _dylib = Platform.isIOS ? DynamicLibrary.process() : DynamicLibrary.open(_path);
late final _dylib =
Platform.isIOS ? DynamicLibrary.process() : DynamicLibrary.open(_path);
// Linkage for initialization
typedef _dart_postCObject = NativeFunction<Int8 Function(Int64, Pointer<Dart_CObject>)>;
typedef _dart_postCObject
= NativeFunction<Int8 Function(Int64, Pointer<Dart_CObject>)>;
// fn free_string(s: *mut std::os::raw::c_char)
typedef _free_string_C = Void Function(Pointer<Utf8>);
typedef _free_string_Dart = void Function(Pointer<Utf8>);
// fn initialize_veilid_flutter(dart_post_c_object_ptr: ffi::DartPostCObjectFnType)
typedef _initializeVeilidFlutter_C = Void Function(Pointer<_dart_postCObject>);
typedef _initializeVeilidFlutter_Dart = void Function(Pointer<_dart_postCObject>);
typedef _initializeVeilidFlutter_Dart = void Function(
Pointer<_dart_postCObject>);
// fn startup_veilid_core(port: i64, config: FfiStr)
typedef _startup_veilid_core_C = Void Function(Int64, Pointer<Utf8>);
typedef _startup_veilid_core_Dart = void Function(int, Pointer<Utf8>);
@@ -42,8 +45,9 @@ typedef _shutdown_veilid_core_Dart = void Function(int);
// fn veilid_version_string() -> *mut c_char
typedef _veilid_version_string_C = Pointer<Utf8> Function();
typedef _veilid_version_string_Dart = Pointer<Utf8> Function();
// fn veilid_version() -> VeilidVersion
class VeilidVersion extends Struct {
class VeilidVersionFFI extends Struct {
@Uint32()
external int major;
@Uint32()
@@ -51,14 +55,115 @@ class VeilidVersion extends Struct {
@Uint32()
external int patch;
}
typedef _veilid_version_C = VeilidVersion Function();
typedef _veilid_version_Dart = VeilidVersion Function();
typedef _veilid_version_C = VeilidVersionFFI Function();
typedef _veilid_version_Dart = VeilidVersionFFI Function();
// Async message types
const int MESSAGE_OK = 0;
const int MESSAGE_ERR = 1;
const int MESSAGE_OK_JSON = 2;
const int MESSAGE_ERR_JSON = 3;
const int MESSAGE_STREAM_ITEM = 4;
const int MESSAGE_STREAM_ITEM_JSON = 5;
const int MESSAGE_STREAM_ABORT = 6;
const int MESSAGE_STREAM_ABORT_JSON = 7;
const int MESSAGE_STREAM_CLOSE = 8;
// Interface factory for high level Veilid API
Veilid getVeilid() => VeilidFFI(_dylib);
// Parse handle async returns
Future<T> processSingleAsyncReturn<T>(Future<dynamic> future) async {
return future.then((value) {
final list = value as List<dynamic>;
switch (list[0] as int) {
case MESSAGE_OK:
{
if (list[1] != null) {
throw VeilidAPIExceptionInternal(
"Unexpected MESSAGE_OK value '${list[1]}' where null expected");
}
return list[1] as T;
}
case MESSAGE_ERR:
{
throw VeilidAPIExceptionInternal("Internal API Error: ${value[1]}");
}
case MESSAGE_OK_JSON:
{
var ret = jsonDecode(list[1] as String);
if (ret != null) {
throw VeilidAPIExceptionInternal(
"Unexpected MESSAGE_OK_JSON value '$ret' where null expected");
}
return ret as T;
}
case MESSAGE_ERR_JSON:
{
throw VeilidAPIException.fromJson(value[1] as String);
}
default:
{
throw VeilidAPIExceptionInternal(
"Unexpected async return message type: ${value[0]}");
}
}
}).catchError((e) {
// Wrap all other errors in VeilidAPIExceptionInternal
throw VeilidAPIExceptionInternal(e.toString());
}, test: (e) {
// Pass errors that are already VeilidAPIException through without wrapping
return e is! VeilidAPIException;
});
}
Future<void> processSingleAsyncVoid(Future<dynamic> future) async {
return future.then((value) {
final list = value as List<dynamic>;
switch (list[0] as int) {
case MESSAGE_OK:
{
if (list[1] != null) {
throw VeilidAPIExceptionInternal(
"Unexpected MESSAGE_OK value '${list[1]}' where null expected");
}
return;
}
case MESSAGE_ERR:
{
throw VeilidAPIExceptionInternal("Internal API Error: ${value[1]}");
}
case MESSAGE_OK_JSON:
{
var ret = jsonDecode(list[1] as String);
if (ret != null) {
throw VeilidAPIExceptionInternal(
"Unexpected MESSAGE_OK_JSON value '$ret' where null expected");
}
return;
}
case MESSAGE_ERR_JSON:
{
throw VeilidAPIException.fromJson(value[1] as String);
}
default:
{
throw VeilidAPIExceptionInternal(
"Unexpected async return message type: ${value[0]}");
}
}
}).catchError((e) {
// Wrap all other errors in VeilidAPIExceptionInternal
throw VeilidAPIExceptionInternal(e.toString());
}, test: (e) {
// Pass errors that are already VeilidAPIException through without wrapping
return e is! VeilidAPIException;
});
}
// FFI implementation of high level Veilid API
class VeilidFFI {
class VeilidFFI implements Veilid {
// veilid_core shared library
final DynamicLibrary _dylib;
@@ -69,38 +174,77 @@ class VeilidFFI {
final _change_api_log_level_Dart _changeApiLogLevel;
final _shutdown_veilid_core_Dart _shutdownVeilidCore;
final _veilid_version_string_Dart _veilidVersionString;
final _veilid_version_Dat _veilidVersion;
final _veilid_version_Dart _veilidVersion;
VeilidFFI(DynamicLibrary dylib): _dylib = dylib {
var initializeVeilidFlutter = _dylib.lookupFunction<_initializeVeilidFlutter_C, _initializeVeilidFlutter_Dart>('initialize_veilid_flutter');
VeilidFFI(DynamicLibrary dylib)
: _dylib = dylib,
_freeString = dylib
.lookupFunction<_free_string_C, _free_string_Dart>('free_string'),
_startupVeilidCore = dylib.lookupFunction<_startup_veilid_core_C,
_startup_veilid_core_Dart>('startup_veilid_core'),
_getVeilidState =
dylib.lookupFunction<_get_veilid_state_C, _get_veilid_state_Dart>(
'get_veilid_state'),
_changeApiLogLevel = dylib.lookupFunction<_change_api_log_level_C,
_change_api_log_level_Dart>('change_api_log_level'),
_shutdownVeilidCore = dylib.lookupFunction<_shutdown_veilid_core_C,
_shutdown_veilid_core_Dart>('shutdown_veilid_core'),
_veilidVersionString = dylib.lookupFunction<_veilid_version_string_C,
_veilid_version_string_Dart>('veilid_version_string'),
_veilidVersion =
dylib.lookupFunction<_veilid_version_C, _veilid_version_Dart>(
'veilid_version') {
// Get veilid_flutter initializer
var initializeVeilidFlutter = _dylib.lookupFunction<
_initializeVeilidFlutter_C,
_initializeVeilidFlutter_Dart>('initialize_veilid_flutter');
initializeVeilidFlutter(NativeApi.postCObject);
// Look up shared library functions
_freeString = dylib.lookupFunction<_free_string_C, _free_string_Dart>('free_string');
_startupVeilidCore = dylib.lookupFunction<_startup_veilid_core_C, _startup_veilid_core_Dart>('startup_veilid_core');
_getveilidState = dylib.lookupFunction<_get_veilid_state_C, _get_veilid_state_Dart>('get_veilid_state');
_changeApiLogLevel = dylib.lookupFunction<_change_api_log_level_C, _change_api_log_level_Dart>('change_api_log_level');
_shutdownVeilidCore = dylib.lookupFunction<_shutdown_veilid_core_C, _shutdown_veilid_core_Dart>('shutdown_veilid_core');
_veilidVersionString = dylib.lookupFunction<_veilid_version_string_C, _veilid_version_string_Dart>('veilid_version_string');
_veilidVersion = dylib.lookupFunction<_veilid_version_C, _veilid_version_Dart>('veilid_version');
}
Stream<VeilidUpdate> startupVeilidCore(String config);
Future<Result<VeilidState, VeilidAPIError>> getVeilidState();
Future<Result<Unit, VeilidAPIError>> changeApiLogLevel(VeilidLogLevel logLevel);
Future<Result<Unit, VeilidAPIError>> shutdownVeilidCore() async {
// xxx continue here
@override
Stream<VeilidUpdate> startupVeilidCore(VeilidConfig config) async* {}
@override
Future<VeilidState> getVeilidState() async {
final recv_port = ReceivePort("shutdown_veilid_core");
final send_port = recv_port.sendPort;
_shutdownVeilidCore(send_port.nativePort);
processSingleAsyncReturn(recv_port.single);
}
@override
Future<void> changeApiLogLevel(VeilidLogLevel logLevel) async {
var nativeLogLevel = jsonEncode(logLevel).toNativeUtf8();
final recv_port = ReceivePort("change_api_log_level");
final send_port = recv_port.sendPort;
_changeApiLogLevel(send_port.nativePort, nativeLogLevel);
malloc.free(nativeLogLevel);
processSingleAsyncVoid(recv_port.single);
}
@override
Future<void> shutdownVeilidCore() async {
final recv_port = ReceivePort("shutdown_veilid_core");
final send_port = recv_port.sendPort;
_shutdownVeilidCore(send_port.nativePort);
processSingleAsyncVoid(recv_port.single);
}
@override
String veilidVersionString() {
final version_string = _veilidVersionString();
String ret = version_string.toDartString();
_freeString(version_string);
return version_string;
final versionString = _veilidVersionString();
String ret = versionString.toDartString();
_freeString(versionString);
return ret;
}
@override
VeilidVersion veilidVersion() {
return _veilidVersion();
final version = _veilidVersion();
return VeilidVersion(
version.major,
version.minor,
version.patch,
);
}
}

View File

@@ -6,14 +6,12 @@ import 'dart:typed_data';
import 'package:flutter/services.dart';
import 'package:flutter/material.dart';
import 'package:oxidized/oxidized.dart';
//////////////////////////////////////////////////////////
Veilid getVeilid() => VeilidJS();
class VeilidJS {
Stream<VeilidUpdate> startupVeilidCore(Object? configCallback(String key)) {
throw UnimplementedError();
}
@@ -25,7 +23,7 @@ class VeilidJS {
Future<void> changeApiLogLevel(VeilidLogLevel logLevel) {
throw UnimplementedError();
}
Future<void> shutdownVeilidCore() {
throw UnimplementedError();
}
@@ -37,5 +35,4 @@ class VeilidJS {
Future<VeilidVersion> veilidVersion() {
throw UnimplementedError();
}
}

View File

@@ -1,3 +1,3 @@
import 'veilid.dart'
import 'veilid.dart';
Veilid getVeilid() => throw UnsupportedError('Cannot create Veilid object');