progress
This commit is contained in:
		| @@ -1514,6 +1514,7 @@ impl NetworkManager { | ||||
|                 bps_down: 0.into(), | ||||
|                 bps_up: 0.into(), | ||||
|                 peers: Vec::new(), | ||||
|                  | ||||
|             }; | ||||
|         } | ||||
|         let routing_table = self.routing_table(); | ||||
|   | ||||
| @@ -59,6 +59,10 @@ pub struct RoutingTableHealth { | ||||
|     pub unreliable_entry_count: usize, | ||||
|     /// Number of dead (always unresponsive) entries in the routing table | ||||
|     pub dead_entry_count: usize, | ||||
|     /// If PublicInternet network class is valid yet | ||||
|     pub public_internet_network_class_valid: bool, xxx do this and add to attachment calculation | ||||
|     /// If LocalNetwork network class is valid yet | ||||
|     pub local_network_network_class_valid: bool, | ||||
| } | ||||
|  | ||||
| pub(super) struct RoutingTableUnlockedInner { | ||||
|   | ||||
| @@ -7,7 +7,6 @@ import 'package:loggy/loggy.dart'; | ||||
| import 'package:veilid_example/veilid_theme.dart'; | ||||
|  | ||||
| import 'log_terminal.dart'; | ||||
| import 'config.dart'; | ||||
| import 'log.dart'; | ||||
| import 'history_wrapper.dart'; | ||||
|  | ||||
| @@ -110,8 +109,8 @@ class _MyAppState extends State<MyApp> with UiLoggy { | ||||
|  | ||||
|   Future<void> toggleStartup(bool startup) async { | ||||
|     if (startup && !_startedUp) { | ||||
|       var updateStream = await Veilid.instance | ||||
|           .startupVeilidCore(await getDefaultVeilidConfig()); | ||||
|       var updateStream = await Veilid.instance.startupVeilidCore( | ||||
|           await getDefaultVeilidConfig("Veilid Plugin Example")); | ||||
|       setState(() { | ||||
|         _updateStream = updateStream; | ||||
|         _updateProcessor = processUpdates(); | ||||
|   | ||||
| @@ -1,140 +0,0 @@ | ||||
| import 'package:veilid/veilid.dart'; | ||||
| import 'package:flutter/foundation.dart' show kIsWeb; | ||||
| import 'package:path_provider/path_provider.dart'; | ||||
| import 'package:path/path.dart' as p; | ||||
|  | ||||
| Future<VeilidConfig> getDefaultVeilidConfig() async { | ||||
|   return VeilidConfig( | ||||
|     programName: "Veilid Plugin Test", | ||||
|     namespace: "", | ||||
|     capabilities: VeilidConfigCapabilities( | ||||
|       protocolUDP: !kIsWeb, | ||||
|       protocolConnectTCP: !kIsWeb, | ||||
|       protocolAcceptTCP: !kIsWeb, | ||||
|       protocolConnectWS: true, | ||||
|       protocolAcceptWS: !kIsWeb, | ||||
|       protocolConnectWSS: true, | ||||
|       protocolAcceptWSS: false, | ||||
|     ), | ||||
|     protectedStore: VeilidConfigProtectedStore( | ||||
|       allowInsecureFallback: false, | ||||
|       alwaysUseInsecureStorage: false, | ||||
|       insecureFallbackDirectory: "", | ||||
|       delete: false, | ||||
|     ), | ||||
|     tableStore: VeilidConfigTableStore( | ||||
|       directory: kIsWeb | ||||
|           ? "" | ||||
|           : p.join((await getApplicationSupportDirectory()).absolute.path, | ||||
|               "table_store"), | ||||
|       delete: false, | ||||
|     ), | ||||
|     blockStore: VeilidConfigBlockStore( | ||||
|       directory: kIsWeb | ||||
|           ? "" | ||||
|           : p.join((await getApplicationSupportDirectory()).absolute.path, | ||||
|               "block_store"), | ||||
|       delete: false, | ||||
|     ), | ||||
|     network: VeilidConfigNetwork( | ||||
|       connectionInitialTimeoutMs: 2000, | ||||
|       connectionInactivityTimeoutMs: 60000, | ||||
|       maxConnectionsPerIp4: 32, | ||||
|       maxConnectionsPerIp6Prefix: 32, | ||||
|       maxConnectionsPerIp6PrefixSize: 56, | ||||
|       maxConnectionFrequencyPerMin: 128, | ||||
|       clientWhitelistTimeoutMs: 300000, | ||||
|       reverseConnectionReceiptTimeMs: 5000, | ||||
|       holePunchReceiptTimeMs: 5000, | ||||
|       nodeId: null, | ||||
|       nodeIdSecret: null, | ||||
|       bootstrap: kIsWeb | ||||
|           ? ["ws://bootstrap.dev.veilid.net:5150/ws"] | ||||
|           : ["bootstrap.dev.veilid.net"], | ||||
|       bootstrapNodes: [], | ||||
|       routingTable: VeilidConfigRoutingTable( | ||||
|         limitOverAttached: 64, | ||||
|         limitFullyAttached: 32, | ||||
|         limitAttachedStrong: 16, | ||||
|         limitAttachedGood: 8, | ||||
|         limitAttachedWeak: 4, | ||||
|       ), | ||||
|       rpc: VeilidConfigRPC( | ||||
|         concurrency: 0, | ||||
|         queueSize: 1024, | ||||
|         maxTimestampBehindMs: 10000, | ||||
|         maxTimestampAheadMs: 10000, | ||||
|         timeoutMs: 10000, | ||||
|         maxRouteHopCount: 4, | ||||
|         defaultRouteHopCount: 1, | ||||
|       ), | ||||
|       dht: VeilidConfigDHT( | ||||
|         resolveNodeTimeoutMs: null, | ||||
|         resolveNodeCount: 20, | ||||
|         resolveNodeFanout: 3, | ||||
|         maxFindNodeCount: 20, | ||||
|         getValueTimeoutMs: null, | ||||
|         getValueCount: 20, | ||||
|         getValueFanout: 3, | ||||
|         setValueTimeoutMs: null, | ||||
|         setValueCount: 20, | ||||
|         setValueFanout: 5, | ||||
|         minPeerCount: 20, | ||||
|         minPeerRefreshTimeMs: 2000, | ||||
|         validateDialInfoReceiptTimeMs: 2000, | ||||
|       ), | ||||
|       upnp: true, | ||||
|       detectAddressChanges: true, | ||||
|       restrictedNatRetries: 0, | ||||
|       tls: VeilidConfigTLS( | ||||
|         certificatePath: "", | ||||
|         privateKeyPath: "", | ||||
|         connectionInitialTimeoutMs: 2000, | ||||
|       ), | ||||
|       application: VeilidConfigApplication( | ||||
|           https: VeilidConfigHTTPS( | ||||
|             enabled: false, | ||||
|             listenAddress: "", | ||||
|             path: "", | ||||
|             url: null, | ||||
|           ), | ||||
|           http: VeilidConfigHTTP( | ||||
|             enabled: false, | ||||
|             listenAddress: "", | ||||
|             path: "", | ||||
|             url: null, | ||||
|           )), | ||||
|       protocol: VeilidConfigProtocol( | ||||
|         udp: VeilidConfigUDP( | ||||
|           enabled: !kIsWeb, | ||||
|           socketPoolSize: 0, | ||||
|           listenAddress: "", | ||||
|           publicAddress: null, | ||||
|         ), | ||||
|         tcp: VeilidConfigTCP( | ||||
|           connect: !kIsWeb, | ||||
|           listen: !kIsWeb, | ||||
|           maxConnections: 32, | ||||
|           listenAddress: "", | ||||
|           publicAddress: null, | ||||
|         ), | ||||
|         ws: VeilidConfigWS( | ||||
|           connect: true, | ||||
|           listen: !kIsWeb, | ||||
|           maxConnections: 16, | ||||
|           listenAddress: "", | ||||
|           path: "ws", | ||||
|           url: null, | ||||
|         ), | ||||
|         wss: VeilidConfigWSS( | ||||
|           connect: true, | ||||
|           listen: false, | ||||
|           maxConnections: 16, | ||||
|           listenAddress: "", | ||||
|           path: "ws", | ||||
|           url: null, | ||||
|         ), | ||||
|       ), | ||||
|     ), | ||||
|   ); | ||||
| } | ||||
| @@ -1,149 +0,0 @@ | ||||
| import 'package:flutter/foundation.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter/services.dart'; | ||||
| import 'package:flutter/widgets.dart'; | ||||
|  | ||||
| class AppPlatformMenu extends StatefulWidget { | ||||
|   const AppPlatformMenu({super.key, required this.child}); | ||||
|  | ||||
|   final Widget child; | ||||
|  | ||||
|   @override | ||||
|   State<AppPlatformMenu> createState() => _AppPlatformMenuState(); | ||||
| } | ||||
|  | ||||
| class _AppPlatformMenuState extends State<AppPlatformMenu> { | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     if (defaultTargetPlatform != TargetPlatform.macOS) { | ||||
|       return widget.child; | ||||
|     } | ||||
|  | ||||
|     return PlatformMenuBar( | ||||
|       menus: <MenuItem>[ | ||||
|         PlatformMenu( | ||||
|           label: 'TerminalStudio', | ||||
|           menus: [ | ||||
|             if (PlatformProvidedMenuItem.hasMenu( | ||||
|               PlatformProvidedMenuItemType.about, | ||||
|             )) | ||||
|               const PlatformProvidedMenuItem( | ||||
|                 type: PlatformProvidedMenuItemType.about, | ||||
|               ), | ||||
|             PlatformMenuItemGroup( | ||||
|               members: [ | ||||
|                 if (PlatformProvidedMenuItem.hasMenu( | ||||
|                   PlatformProvidedMenuItemType.servicesSubmenu, | ||||
|                 )) | ||||
|                   const PlatformProvidedMenuItem( | ||||
|                     type: PlatformProvidedMenuItemType.servicesSubmenu, | ||||
|                   ), | ||||
|               ], | ||||
|             ), | ||||
|             PlatformMenuItemGroup( | ||||
|               members: [ | ||||
|                 if (PlatformProvidedMenuItem.hasMenu( | ||||
|                   PlatformProvidedMenuItemType.hide, | ||||
|                 )) | ||||
|                   const PlatformProvidedMenuItem( | ||||
|                     type: PlatformProvidedMenuItemType.hide, | ||||
|                   ), | ||||
|                 if (PlatformProvidedMenuItem.hasMenu( | ||||
|                   PlatformProvidedMenuItemType.hideOtherApplications, | ||||
|                 )) | ||||
|                   const PlatformProvidedMenuItem( | ||||
|                     type: PlatformProvidedMenuItemType.hideOtherApplications, | ||||
|                   ), | ||||
|               ], | ||||
|             ), | ||||
|             if (PlatformProvidedMenuItem.hasMenu( | ||||
|               PlatformProvidedMenuItemType.quit, | ||||
|             )) | ||||
|               const PlatformProvidedMenuItem( | ||||
|                 type: PlatformProvidedMenuItemType.quit, | ||||
|               ), | ||||
|           ], | ||||
|         ), | ||||
|         PlatformMenu( | ||||
|           label: 'Edit', | ||||
|           menus: [ | ||||
|             PlatformMenuItemGroup( | ||||
|               members: [ | ||||
|                 PlatformMenuItem( | ||||
|                   label: 'Copy', | ||||
|                   shortcut: const SingleActivator( | ||||
|                     LogicalKeyboardKey.keyC, | ||||
|                     meta: true, | ||||
|                   ), | ||||
|                   onSelected: () { | ||||
|                     final primaryContext = primaryFocus?.context; | ||||
|                     if (primaryContext == null) { | ||||
|                       return; | ||||
|                     } | ||||
|                     Actions.invoke( | ||||
|                       primaryContext, | ||||
|                       CopySelectionTextIntent.copy, | ||||
|                     ); | ||||
|                   }, | ||||
|                 ), | ||||
|                 PlatformMenuItem( | ||||
|                   label: 'Paste', | ||||
|                   shortcut: const SingleActivator( | ||||
|                     LogicalKeyboardKey.keyV, | ||||
|                     meta: true, | ||||
|                   ), | ||||
|                   onSelected: () { | ||||
|                     final primaryContext = primaryFocus?.context; | ||||
|                     if (primaryContext == null) { | ||||
|                       return; | ||||
|                     } | ||||
|                     Actions.invoke( | ||||
|                       primaryContext, | ||||
|                       const PasteTextIntent(SelectionChangedCause.keyboard), | ||||
|                     ); | ||||
|                   }, | ||||
|                 ), | ||||
|                 PlatformMenuItem( | ||||
|                   label: 'Select All', | ||||
|                   shortcut: const SingleActivator( | ||||
|                     LogicalKeyboardKey.keyA, | ||||
|                     meta: true, | ||||
|                   ), | ||||
|                   onSelected: () { | ||||
|                     final primaryContext = primaryFocus?.context; | ||||
|                     if (primaryContext == null) { | ||||
|                       return; | ||||
|                     } | ||||
|                     print(primaryContext); | ||||
|                     try { | ||||
|                       final action = Actions.maybeFind<Intent>( | ||||
|                         primaryContext, | ||||
|                         intent: const SelectAllTextIntent( | ||||
|                           SelectionChangedCause.keyboard, | ||||
|                         ), | ||||
|                       ); | ||||
|                       print('action: $action'); | ||||
|                     } catch (e) { | ||||
|                       print(e); | ||||
|                     } | ||||
|                     Actions.invoke<Intent>( | ||||
|                       primaryContext, | ||||
|                       const SelectAllTextIntent(SelectionChangedCause.keyboard), | ||||
|                     ); | ||||
|                   }, | ||||
|                 ), | ||||
|               ], | ||||
|             ), | ||||
|             if (PlatformProvidedMenuItem.hasMenu( | ||||
|               PlatformProvidedMenuItemType.quit, | ||||
|             )) | ||||
|               const PlatformProvidedMenuItem( | ||||
|                 type: PlatformProvidedMenuItemType.quit, | ||||
|               ), | ||||
|           ], | ||||
|         ), | ||||
|       ], | ||||
|       child: widget.child, | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| @@ -1,80 +0,0 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:xterm/xterm.dart'; | ||||
|  | ||||
| class VirtualKeyboardView extends StatelessWidget { | ||||
|   const VirtualKeyboardView(this.keyboard, {super.key}); | ||||
|  | ||||
|   final VirtualKeyboard keyboard; | ||||
|  | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return AnimatedBuilder( | ||||
|       animation: keyboard, | ||||
|       builder: (context, child) => ToggleButtons( | ||||
|         isSelected: [keyboard.ctrl, keyboard.alt, keyboard.shift], | ||||
|         onPressed: (index) { | ||||
|           switch (index) { | ||||
|             case 0: | ||||
|               keyboard.ctrl = !keyboard.ctrl; | ||||
|               break; | ||||
|             case 1: | ||||
|               keyboard.alt = !keyboard.alt; | ||||
|               break; | ||||
|             case 2: | ||||
|               keyboard.shift = !keyboard.shift; | ||||
|               break; | ||||
|           } | ||||
|         }, | ||||
|         children: const [Text('Ctrl'), Text('Alt'), Text('Shift')], | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
|  | ||||
| class VirtualKeyboard extends TerminalInputHandler with ChangeNotifier { | ||||
|   final TerminalInputHandler _inputHandler; | ||||
|  | ||||
|   VirtualKeyboard(this._inputHandler); | ||||
|  | ||||
|   bool _ctrl = false; | ||||
|  | ||||
|   bool get ctrl => _ctrl; | ||||
|  | ||||
|   set ctrl(bool value) { | ||||
|     if (_ctrl != value) { | ||||
|       _ctrl = value; | ||||
|       notifyListeners(); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   bool _shift = false; | ||||
|  | ||||
|   bool get shift => _shift; | ||||
|  | ||||
|   set shift(bool value) { | ||||
|     if (_shift != value) { | ||||
|       _shift = value; | ||||
|       notifyListeners(); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   bool _alt = false; | ||||
|  | ||||
|   bool get alt => _alt; | ||||
|  | ||||
|   set alt(bool value) { | ||||
|     if (_alt != value) { | ||||
|       _alt = value; | ||||
|       notifyListeners(); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String? call(TerminalKeyboardEvent event) { | ||||
|     return _inputHandler.call(event.copyWith( | ||||
|       ctrl: event.ctrl || _ctrl, | ||||
|       shift: event.shift || _shift, | ||||
|       alt: event.alt || _alt, | ||||
|     )); | ||||
|   } | ||||
| } | ||||
| @@ -1,5 +1,4 @@ | ||||
| import 'dart:async'; | ||||
| import 'dart:html'; | ||||
| import 'dart:typed_data'; | ||||
| import 'dart:convert'; | ||||
|  | ||||
| @@ -11,6 +10,8 @@ import 'veilid_stub.dart' | ||||
|  | ||||
| ////////////////////////////////////////////////////////// | ||||
|  | ||||
| export 'default_config.dart'; | ||||
|  | ||||
| ////////////////////////////////////////////////////////// | ||||
| // FFI Platform-specific config | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user