progress
This commit is contained in:
		@@ -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