route fixes

This commit is contained in:
John Smith 2022-12-10 19:11:58 -05:00
parent 36b6e7446f
commit 2e1920b626
13 changed files with 89 additions and 98 deletions

View File

@ -11,12 +11,20 @@ struct WebsocketNetworkConnectionInner {
fn to_io(err: WsErr) -> io::Error { fn to_io(err: WsErr) -> io::Error {
match err { match err {
WsErr::InvalidWsState { supplied: _ } => io::Error::new(io::ErrorKind::InvalidInput, err.to_string()), WsErr::InvalidWsState { supplied: _ } => {
io::Error::new(io::ErrorKind::InvalidInput, err.to_string())
}
WsErr::ConnectionNotOpen => io::Error::new(io::ErrorKind::NotConnected, err.to_string()), WsErr::ConnectionNotOpen => io::Error::new(io::ErrorKind::NotConnected, err.to_string()),
WsErr::InvalidUrl { supplied: _ } => io::Error::new(io::ErrorKind::InvalidInput, err.to_string()), WsErr::InvalidUrl { supplied: _ } => {
WsErr::InvalidCloseCode { supplied: _ } => io::Error::new(io::ErrorKind::InvalidInput, err.to_string()), io::Error::new(io::ErrorKind::InvalidInput, err.to_string())
}
WsErr::InvalidCloseCode { supplied: _ } => {
io::Error::new(io::ErrorKind::InvalidInput, err.to_string())
}
WsErr::ReasonStringToLong => io::Error::new(io::ErrorKind::InvalidInput, err.to_string()), WsErr::ReasonStringToLong => io::Error::new(io::ErrorKind::InvalidInput, err.to_string()),
WsErr::ConnectionFailed { event: _ } => io::Error::new(io::ErrorKind::ConnectionRefused, err.to_string()), WsErr::ConnectionFailed { event: _ } => {
io::Error::new(io::ErrorKind::ConnectionRefused, err.to_string())
}
WsErr::InvalidEncoding => io::Error::new(io::ErrorKind::InvalidInput, err.to_string()), WsErr::InvalidEncoding => io::Error::new(io::ErrorKind::InvalidInput, err.to_string()),
WsErr::CantDecodeBlob => io::Error::new(io::ErrorKind::InvalidInput, err.to_string()), WsErr::CantDecodeBlob => io::Error::new(io::ErrorKind::InvalidInput, err.to_string()),
WsErr::UnknownDataType => io::Error::new(io::ErrorKind::InvalidInput, err.to_string()), WsErr::UnknownDataType => io::Error::new(io::ErrorKind::InvalidInput, err.to_string()),
@ -80,19 +88,19 @@ impl WebsocketNetworkConnection {
let out = match SendWrapper::new(self.inner.ws_stream.clone().next()).await { let out = match SendWrapper::new(self.inner.ws_stream.clone().next()).await {
Some(WsMessage::Binary(v)) => { Some(WsMessage::Binary(v)) => {
if v.len() > MAX_MESSAGE_SIZE { if v.len() > MAX_MESSAGE_SIZE {
return Err(io::Error::new( return Ok(NetworkResult::invalid_message("too large ws message"));
io::ErrorKind::InvalidData,
"too large ws message",
));
} }
NetworkResult::Value(v) NetworkResult::Value(v)
} }
Some(_) => NetworkResult::NoConnection(io::Error::new( Some(_) => NetworkResult::no_connection_other(io::Error::new(
io::ErrorKind::ConnectionReset, io::ErrorKind::ConnectionReset,
"Unexpected WS message type", "Unexpected WS message type",
)), )),
None => { None => {
bail_io_error_other!("WS stream closed"); return Ok(NetworkResult::no_connection(io::Error::new(
io::ErrorKind::ConnectionReset,
"WS stream closed",
)));
} }
}; };
// tracing::Span::current().record("network_result", &tracing::field::display(&out)); // tracing::Span::current().record("network_result", &tracing::field::display(&out));
@ -126,7 +134,7 @@ impl WebsocketProtocolHandler {
let fut = SendWrapper::new(timeout(timeout_ms, async move { let fut = SendWrapper::new(timeout(timeout_ms, async move {
WsMeta::connect(request, None).await.map_err(to_io) WsMeta::connect(request, None).await.map_err(to_io)
})); }));
let (wsmeta, wsio) = network_result_try!(network_result_try!(fut let (wsmeta, wsio) = network_result_try!(network_result_try!(fut
.await .await
.into_network_result()) .into_network_result())

View File

@ -1087,7 +1087,7 @@ impl RouteSpecStore {
&& detail.1.sequencing >= sequencing && detail.1.sequencing >= sequencing
&& detail.1.hops.len() >= min_hop_count && detail.1.hops.len() >= min_hop_count
&& detail.1.hops.len() <= max_hop_count && detail.1.hops.len() <= max_hop_count
&& detail.1.directions.is_subset(directions) && detail.1.directions.is_superset(directions)
&& !detail.1.published && !detail.1.published
&& !detail.1.stats.needs_testing(cur_ts) && !detail.1.stats.needs_testing(cur_ts)
{ {
@ -1742,6 +1742,11 @@ impl RouteSpecStore {
F: FnOnce(&mut RouteStats) -> R, F: FnOnce(&mut RouteStats) -> R,
{ {
let inner = &mut *self.inner.lock(); let inner = &mut *self.inner.lock();
// Check for stub route
if *key == self.unlocked_inner.routing_table.node_id() {
return None;
}
// Check for local route // Check for local route
if let Some(rsd) = Self::detail_mut(inner, key) { if let Some(rsd) = Self::detail_mut(inner, key) {
return Some(f(&mut rsd.stats)); return Some(f(&mut rsd.stats));

View File

@ -701,10 +701,17 @@ impl VeilidAPI {
let rss = routing_table.route_spec_store(); let rss = routing_table.route_spec_store();
let routes = rss.list_allocated_routes(|k, _| Some(*k)); let routes = rss.list_allocated_routes(|k, _| Some(*k));
let mut out = format!("Routes: (count = {}):\n", routes.len()); let mut out = format!("Allocated Routes: (count = {}):\n", routes.len());
for r in routes { for r in routes {
out.push_str(&format!("{}\n", r.encode())); out.push_str(&format!("{}\n", r.encode()));
} }
let remote_routes = rss.list_remote_routes(|k, _| Some(*k));
let mut out = format!("Remote Routes: (count = {}):\n", remote_routes.len());
for r in remote_routes {
out.push_str(&format!("{}\n", r.encode()));
}
Ok(out) Ok(out)
} }
async fn debug_route_import(&self, args: Vec<String>) -> Result<String, VeilidAPIError> { async fn debug_route_import(&self, args: Vec<String>) -> Result<String, VeilidAPIError> {
@ -858,9 +865,9 @@ impl VeilidAPI {
Ok(">>> Unknown command\n".to_owned()) Ok(">>> Unknown command\n".to_owned())
} }
}; };
if let Ok(res) = &res { // if let Ok(res) = &res {
debug!("{}", res); // debug!("{}", res);
} // }
res res
} }
} }

Binary file not shown.

View File

@ -42,7 +42,7 @@ class _LogTerminalState extends State<LogTerminal> {
textStyle: kDefaultTerminalStyle, textStyle: kDefaultTerminalStyle,
controller: terminalController, controller: terminalController,
autofocus: true, autofocus: true,
backgroundOpacity: 0.7, backgroundOpacity: 0.9,
onSecondaryTapDown: (details, offset) async { onSecondaryTapDown: (details, offset) async {
final selection = terminalController.selection; final selection = terminalController.selection;
if (selection != null) { if (selection != null) {

View File

@ -11,7 +11,7 @@ void veilidInit() {
enabled: true, enabled: true,
level: VeilidConfigLogLevel.debug, level: VeilidConfigLogLevel.debug,
logsInTimings: true, logsInTimings: true,
logsInConsole: true), logsInConsole: false),
api: VeilidWASMConfigLoggingApi( api: VeilidWASMConfigLoggingApi(
enabled: true, level: VeilidConfigLogLevel.info))); enabled: true, level: VeilidConfigLogLevel.info)));
Veilid.instance.initializeVeilidCore(platformConfig.json); Veilid.instance.initializeVeilidCore(platformConfig.json);

View File

@ -241,7 +241,7 @@ const MaterialColor materialPopComplementaryColor =
const kDefaultSpacingFactor = 4.0; const kDefaultSpacingFactor = 4.0;
const kDefaultMonoTerminalFontFamily = "CascadiaMonoPL.ttf"; const kDefaultMonoTerminalFontFamily = "Fira Code";
const kDefaultMonoTerminalFontHeight = 1.2; const kDefaultMonoTerminalFontHeight = 1.2;
const kDefaultMonoTerminalFontSize = 12.0; const kDefaultMonoTerminalFontSize = 12.0;

View File

@ -94,3 +94,11 @@ flutter:
- family: Cascadia Mono - family: Cascadia Mono
fonts: fonts:
- asset: fonts/CascadiaMonoPL.ttf - asset: fonts/CascadiaMonoPL.ttf
- family: Fira Code
fonts:
- asset: fonts/FiraCode-VF.ttf
- family: Fraunces
fonts:
- asset: fonts/Fraunces-VariableFont_SOFT,WONK,opsz,wght.ttf
- asset: fonts/Fraunces-Italic-VariableFont_SOFT,WONK,opsz,wght.ttf
style: italic

View File

@ -1,5 +1,6 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<!-- <!--
If you are serving your web app in a path other than the root, change the If you are serving your web app in a path other than the root, change the
@ -27,94 +28,51 @@
<link rel="apple-touch-icon" href="icons/Icon-192.png"> <link rel="apple-touch-icon" href="icons/Icon-192.png">
<!-- Favicon --> <!-- Favicon -->
<link rel="icon" type="image/png" href="favicon.png"/> <link rel="icon" type="image/png" href="favicon.png" />
<title>veilid_example</title> <title>Veilid Example</title>
<link rel="manifest" href="manifest.json"> <link rel="manifest" href="manifest.json">
<script>
// The value below is injected by flutter build, do not touch.
var serviceWorkerVersion = null;
</script>
<!-- This script adds the flutter initialization JS code -->
<script src="flutter.js" defer></script>
</head> </head>
<body> <body>
<!-- Load WASM modules --> <!-- Load WASM modules -->
<script type="module"> <script type="module">
import * as veilid_wasm_module from './wasm/veilid_wasm.js'; import * as veilid_wasm_module from './wasm/veilid_wasm.js';
async function run() { async function run() {
// save the wasm exports // save the wasm exports
window.veilid_wasm = veilid_wasm_module; window.veilid_wasm = veilid_wasm_module;
// init the js module // init the js module
await veilid_wasm_module.default(); await veilid_wasm_module.default();
// init the wasm library // init the wasm library
await veilid_wasm_module.initialize_veilid_wasm(); await veilid_wasm_module.initialize_veilid_wasm();
} }
run(); run();
</script> </script>
<!-- This script installs service_worker.js to provide PWA functionality to
application. For more information, see:
https://developers.google.com/web/fundamentals/primers/service-workers -->
<script> <script>
var serviceWorkerVersion = null; window.addEventListener('load', function (ev) {
var scriptLoaded = false; // Download main.dart.js
function loadMainDartJs() { _flutter.loader.loadEntrypoint({
if (scriptLoaded) { serviceWorker: {
return; serviceWorkerVersion: serviceWorkerVersion,
} }
scriptLoaded = true; }).then(function (engineInitializer) {
var scriptTag = document.createElement('script'); return engineInitializer.initializeEngine();
scriptTag.src = 'main.dart.js'; }).then(function (appRunner) {
scriptTag.type = 'application/javascript'; return appRunner.runApp();
document.body.append(scriptTag);
}
if ('serviceWorker' in navigator) {
// Service workers are supported. Use them.
window.addEventListener('load', function () {
// Wait for registration to finish before dropping the <script> tag.
// Otherwise, the browser will load the script multiple times,
// potentially different versions.
var serviceWorkerUrl = 'flutter_service_worker.js?v=' + serviceWorkerVersion;
navigator.serviceWorker.register(serviceWorkerUrl)
.then((reg) => {
function waitForActivation(serviceWorker) {
serviceWorker.addEventListener('statechange', () => {
if (serviceWorker.state == 'activated') {
console.log('Installed new service worker.');
loadMainDartJs();
}
});
}
if (!reg.active && (reg.installing || reg.waiting)) {
// No active web worker and we have installed or are installing
// one for the first time. Simply wait for it to activate.
waitForActivation(reg.installing || reg.waiting);
} else if (!reg.active.scriptURL.endsWith(serviceWorkerVersion)) {
// When the app updates the serviceWorkerVersion changes, so we
// need to ask the service worker to update.
console.log('New service worker available.');
reg.update();
waitForActivation(reg.installing);
} else {
// Existing service worker is still good.
console.log('Loading app from service worker.');
loadMainDartJs();
}
});
// If service worker doesn't succeed in a reasonable amount of time,
// fallback to plaint <script> tag.
setTimeout(() => {
if (!scriptLoaded) {
console.warn(
'Failed to load app from service worker. Falling back to plain <script> tag.',
);
loadMainDartJs();
}
}, 4000);
}); });
} else { });
// Service workers not supported. Just drop the <script> tag.
loadMainDartJs();
}
</script> </script>
</body> </body>
</html>
</html>

View File

@ -1474,11 +1474,15 @@ class VeilidStateRoute {
}); });
VeilidStateRoute.fromJson(Map<String, dynamic> json) VeilidStateRoute.fromJson(Map<String, dynamic> json)
: deadRoutes = json['dead_routes'], : deadRoutes = List<String>.from(json['dead_routes'].map((j) => j)),
deadRemoteRoutes = json['dead_remote_routes']; deadRemoteRoutes =
List<String>.from(json['dead_remote_routes'].map((j) => j));
Map<String, dynamic> get json { Map<String, dynamic> get json {
return {'dead_routes': deadRoutes, 'dead_remote_routes': deadRemoteRoutes}; return {
'dead_routes': deadRoutes.map((p) => p).toList(),
'dead_remote_routes': deadRemoteRoutes.map((p) => p).toList()
};
} }
} }

View File

@ -185,8 +185,9 @@ class VeilidJS implements Veilid {
} }
@override @override
Future<String> debug(String command) { Future<String> debug(String command) async {
return _wrapApiPromise(js_util.callMethod(wasm, "debug", [command])); return jsonDecode(
await _wrapApiPromise(js_util.callMethod(wasm, "debug", [command])));
} }
@override @override