Update config server, allows multi version support
This commit is contained in:
parent
d909cf1aa3
commit
3c9e3dc907
11 changed files with 195 additions and 88 deletions
82
Cargo.lock
generated
82
Cargo.lock
generated
|
@ -825,6 +825,12 @@ dependencies = [
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "http-range-header"
|
||||||
|
version = "0.4.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "08a397c49fec283e3d6211adbe480be95aae5f304cfb923e9970e08956d5168a"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "httparse"
|
name = "httparse"
|
||||||
version = "1.9.4"
|
version = "1.9.4"
|
||||||
|
@ -1006,6 +1012,15 @@ dependencies = [
|
||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "matchers"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
|
||||||
|
dependencies = [
|
||||||
|
"regex-automata 0.1.10",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "matchit"
|
name = "matchit"
|
||||||
version = "0.7.3"
|
version = "0.7.3"
|
||||||
|
@ -1043,6 +1058,16 @@ version = "0.3.17"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
|
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "mime_guess"
|
||||||
|
version = "2.0.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e"
|
||||||
|
dependencies = [
|
||||||
|
"mime",
|
||||||
|
"unicase",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "minimal-lexical"
|
name = "minimal-lexical"
|
||||||
version = "0.2.1"
|
version = "0.2.1"
|
||||||
|
@ -1462,8 +1487,17 @@ checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aho-corasick",
|
"aho-corasick",
|
||||||
"memchr",
|
"memchr",
|
||||||
"regex-automata",
|
"regex-automata 0.4.7",
|
||||||
"regex-syntax",
|
"regex-syntax 0.8.4",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex-automata"
|
||||||
|
version = "0.1.10"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
|
||||||
|
dependencies = [
|
||||||
|
"regex-syntax 0.6.29",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1474,9 +1508,15 @@ checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aho-corasick",
|
"aho-corasick",
|
||||||
"memchr",
|
"memchr",
|
||||||
"regex-syntax",
|
"regex-syntax 0.8.4",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex-syntax"
|
||||||
|
version = "0.6.29"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex-syntax"
|
name = "regex-syntax"
|
||||||
version = "0.8.4"
|
version = "0.8.4"
|
||||||
|
@ -1725,6 +1765,7 @@ dependencies = [
|
||||||
"rbase64",
|
"rbase64",
|
||||||
"serde",
|
"serde",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
|
"tower-http",
|
||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -2273,6 +2314,31 @@ dependencies = [
|
||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tower-http"
|
||||||
|
version = "0.6.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8437150ab6bbc8c5f0f519e3d5ed4aa883a83dd4cdd3d1b21f9482936046cb97"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags",
|
||||||
|
"bytes",
|
||||||
|
"futures-util",
|
||||||
|
"http",
|
||||||
|
"http-body",
|
||||||
|
"http-body-util",
|
||||||
|
"http-range-header",
|
||||||
|
"httpdate",
|
||||||
|
"mime",
|
||||||
|
"mime_guess",
|
||||||
|
"percent-encoding",
|
||||||
|
"pin-project-lite",
|
||||||
|
"tokio",
|
||||||
|
"tokio-util",
|
||||||
|
"tower-layer",
|
||||||
|
"tower-service",
|
||||||
|
"tracing",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tower-layer"
|
name = "tower-layer"
|
||||||
version = "0.3.3"
|
version = "0.3.3"
|
||||||
|
@ -2335,10 +2401,14 @@ version = "0.3.18"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
|
checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"matchers",
|
||||||
"nu-ansi-term",
|
"nu-ansi-term",
|
||||||
|
"once_cell",
|
||||||
|
"regex",
|
||||||
"sharded-slab",
|
"sharded-slab",
|
||||||
"smallvec",
|
"smallvec",
|
||||||
"thread_local",
|
"thread_local",
|
||||||
|
"tracing",
|
||||||
"tracing-core",
|
"tracing-core",
|
||||||
"tracing-log",
|
"tracing-log",
|
||||||
]
|
]
|
||||||
|
@ -2349,6 +2419,12 @@ version = "1.17.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
|
checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicase"
|
||||||
|
version = "2.8.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-bidi"
|
name = "unicode-bidi"
|
||||||
version = "0.3.15"
|
version = "0.3.15"
|
||||||
|
|
17
Cargo.toml
17
Cargo.toml
|
@ -8,6 +8,7 @@ version = "0.1.0"
|
||||||
[workspace.dependencies]
|
[workspace.dependencies]
|
||||||
# Framework
|
# Framework
|
||||||
tokio = { version = "1.39.3", features = ["full"] }
|
tokio = { version = "1.39.3", features = ["full"] }
|
||||||
|
tower-http = { version = "0.6.1", features = ["fs", "trace"] }
|
||||||
axum = "0.7.5"
|
axum = "0.7.5"
|
||||||
axum-server = "0.7.1"
|
axum-server = "0.7.1"
|
||||||
zeromq = { version = "0.4.0", default-features = false, features = ["tokio-runtime", "tcp-transport"] }
|
zeromq = { version = "0.4.0", default-features = false, features = ["tokio-runtime", "tcp-transport"] }
|
||||||
|
@ -41,18 +42,18 @@ crc32fast = "1.4.2"
|
||||||
|
|
||||||
# Tracing
|
# Tracing
|
||||||
tracing = "0.1.40"
|
tracing = "0.1.40"
|
||||||
tracing-subscriber = "0.3.18"
|
tracing-subscriber = { version = "0.3.18", features = ["env-filter"] }
|
||||||
|
|
||||||
# Internal
|
# Internal
|
||||||
kcp = { path = "gateway-server/kcp" }
|
kcp = { path = "gateway-server/kcp" }
|
||||||
common = { path = "common/" }
|
common = { path = "common" }
|
||||||
shorekeeper-http = { path = "shorekeeper-http/" }
|
shorekeeper-http = { path = "shorekeeper-http" }
|
||||||
shorekeeper-data = { path = "shorekeeper-data/" }
|
shorekeeper-data = { path = "shorekeeper-data" }
|
||||||
shorekeeper-database = { path = "shorekeeper-database/" }
|
shorekeeper-database = { path = "shorekeeper-database" }
|
||||||
shorekeeper-network = { path = "shorekeeper-network/" }
|
shorekeeper-network = { path = "shorekeeper-network" }
|
||||||
shorekeeper-protocol = { path = "shorekeeper-protocol/" }
|
shorekeeper-protocol = { path = "shorekeeper-protocol" }
|
||||||
shorekeeper-protocol-derive = { path = "shorekeeper-protocol/shorekeeper-protocol-derive" }
|
shorekeeper-protocol-derive = { path = "shorekeeper-protocol/shorekeeper-protocol-derive" }
|
||||||
shorekeeper-protokey = { path = "shorekeeper-protokey/" }
|
shorekeeper-protokey = { path = "shorekeeper-protokey" }
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
strip = true # Automatically strip symbols from the binary.
|
strip = true # Automatically strip symbols from the binary.
|
||||||
|
|
64
assets/config/rODM5DcqOhYsIOtsEuZWNGFa2guZgl57/index.json
Normal file
64
assets/config/rODM5DcqOhYsIOtsEuZWNGFa2guZgl57/index.json
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
{
|
||||||
|
"default": {
|
||||||
|
"CdnUrl": [
|
||||||
|
{
|
||||||
|
"url": "https://cdn-huoshan-cn-mc.aki-game.com/prod/client/",
|
||||||
|
"weight": "2323"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://cdn-qiniu-cn-mc.aki-game.com/prod/client/",
|
||||||
|
"weight": "0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://cdn-qcloud-cn-mc.aki-game.com/prod/client/",
|
||||||
|
"weight": "5443"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://cdn-aliyun-cn-mc.aki-game.com/prod/client/",
|
||||||
|
"weight": "0"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"SecondaryUrl": [],
|
||||||
|
"PriceRatio": 1,
|
||||||
|
"SpeedRatio": 1,
|
||||||
|
"GachaUrl": {
|
||||||
|
"GachaRecord": "http://127.0.0.1:10001/gacha/record",
|
||||||
|
"GachaPoolDetail": "http://127.0.0.1:10001/gacha/detail"
|
||||||
|
},
|
||||||
|
"LogReport": {
|
||||||
|
"name": "pioneer-upload-log-1319073642",
|
||||||
|
"region": "dev-reversedrooms"
|
||||||
|
},
|
||||||
|
"PackageUpdateDescUrl": {
|
||||||
|
"MainUrl": "http://127.0.0.1:10001/force_update/UpdateDesc.html",
|
||||||
|
"SubUrl": "http://127.0.0.1:10001/force_update/UpdateDesc.html"
|
||||||
|
},
|
||||||
|
"PackageUpdateUrl": {
|
||||||
|
"MainUrl": "http://127.0.0.1:10001/force_update/UpdateJs.html",
|
||||||
|
"SubUrl": "http://127.0.0.1:10001/force_update/UpdateJs.html"
|
||||||
|
},
|
||||||
|
"TDCfg": {
|
||||||
|
"AppID": "3e2e647670b7498fa645eb9574f78c2c",
|
||||||
|
"URL": "http://127.0.0.1:10001/TDCfg"
|
||||||
|
},
|
||||||
|
"GmOpen": false,
|
||||||
|
"IosAuditFirstDownloadTip": false,
|
||||||
|
"NoticeUrl": "http://127.0.0.1:10001/notice",
|
||||||
|
"MixUri": "rODM5DcqOhYsIOtsEuZWNGFa2guZgl57",
|
||||||
|
"ResUri": "rODM5DcqOhYsIOtsEuZWNGFa2guZgl57",
|
||||||
|
"LoginServers": [
|
||||||
|
{
|
||||||
|
"id": "f9e0fc655c1931bc03ad976e9fc14473",
|
||||||
|
"ip": "http://127.0.0.1:5500",
|
||||||
|
"name": "Shorekeeper"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"PrivateServers": {
|
||||||
|
"enable": false,
|
||||||
|
"serverUrl": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"p1": {
|
||||||
|
"IosAuditFirstDownloadTip": false
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,64 +0,0 @@
|
||||||
{
|
|
||||||
"default": {
|
|
||||||
"CdnUrl": [
|
|
||||||
{
|
|
||||||
"url": "https://cdn-huoshan-cn-mc.aki-game.com/prod/client/",
|
|
||||||
"weight": "2323"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://cdn-qiniu-cn-mc.aki-game.com/prod/client/",
|
|
||||||
"weight": "0"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://cdn-qcloud-cn-mc.aki-game.com/prod/client/",
|
|
||||||
"weight": "5443"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://cdn-aliyun-cn-mc.aki-game.com/prod/client/",
|
|
||||||
"weight": "0"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"SecondaryUrl": [],
|
|
||||||
"PriceRatio": 1,
|
|
||||||
"SpeedRatio": 1,
|
|
||||||
"GachaUrl": {
|
|
||||||
"GachaRecord": "http://127.0.0.1:10001/gacha/record",
|
|
||||||
"GachaPoolDetail": "http://127.0.0.1:10001/gacha/detail"
|
|
||||||
},
|
|
||||||
"LogReport": {
|
|
||||||
"name": "pioneer-upload-log-1319073642",
|
|
||||||
"region": "dev-reversedrooms"
|
|
||||||
},
|
|
||||||
"PackageUpdateDescUrl": {
|
|
||||||
"MainUrl": "http://127.0.0.1:10001/force_update/UpdateDesc.html",
|
|
||||||
"SubUrl": "http://127.0.0.1:10001/force_update/UpdateDesc.html"
|
|
||||||
},
|
|
||||||
"PackageUpdateUrl": {
|
|
||||||
"MainUrl": "http://127.0.0.1:10001/force_update/UpdateJs.html",
|
|
||||||
"SubUrl": "http://127.0.0.1:10001/force_update/UpdateJs.html"
|
|
||||||
},
|
|
||||||
"TDCfg": {
|
|
||||||
"AppID": "3e2e647670b7498fa645eb9574f78c2c",
|
|
||||||
"URL": "http://127.0.0.1:10001/TDCfg"
|
|
||||||
},
|
|
||||||
"GmOpen": false,
|
|
||||||
"IosAuditFirstDownloadTip": false,
|
|
||||||
"NoticeUrl": "http://127.0.0.1:10001/notice",
|
|
||||||
"MixUri": "rODM5DcqOhYsIOtsEuZWNGFa2guZgl57",
|
|
||||||
"ResUri": "rODM5DcqOhYsIOtsEuZWNGFa2guZgl57",
|
|
||||||
"LoginServers": [
|
|
||||||
{
|
|
||||||
"id": "f9e0fc655c1931bc03ad976e9fc14473",
|
|
||||||
"ip": "http://127.0.0.1:5500",
|
|
||||||
"name": "Shorekeeper"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"PrivateServers": {
|
|
||||||
"enable": false,
|
|
||||||
"serverUrl": ""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"p1": {
|
|
||||||
"IosAuditFirstDownloadTip": false
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,4 +1,7 @@
|
||||||
use tracing::Level;
|
use tracing::Level;
|
||||||
|
use tracing_subscriber::fmt::writer::MakeWriterExt;
|
||||||
|
use tracing_subscriber::layer::SubscriberExt;
|
||||||
|
use tracing_subscriber::util::SubscriberInitExt;
|
||||||
|
|
||||||
pub fn init(max_level: Level) {
|
pub fn init(max_level: Level) {
|
||||||
tracing_subscriber::fmt()
|
tracing_subscriber::fmt()
|
||||||
|
@ -6,3 +9,24 @@ pub fn init(max_level: Level) {
|
||||||
.with_target(false)
|
.with_target(false)
|
||||||
.init();
|
.init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn init_axum(max_level: Level) {
|
||||||
|
tracing_subscriber::registry()
|
||||||
|
.with(
|
||||||
|
tracing_subscriber::EnvFilter::try_from_default_env().unwrap_or_else(|_| {
|
||||||
|
// axum logs rejections from built-in extractors with the `axum::rejection`
|
||||||
|
// target, at `TRACE` level. `axum::rejection=trace` enables showing those events
|
||||||
|
format!(
|
||||||
|
"{}=debug,tower_http=debug,axum::rejection=trace",
|
||||||
|
env!("CARGO_CRATE_NAME")
|
||||||
|
)
|
||||||
|
.into()
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
.with(
|
||||||
|
tracing_subscriber::fmt::layer()
|
||||||
|
.with_writer(std::io::stdout.with_max_level(max_level))
|
||||||
|
.with_target(false)
|
||||||
|
)
|
||||||
|
.init();
|
||||||
|
}
|
|
@ -1,4 +1,3 @@
|
||||||
use std::fs;
|
|
||||||
use std::sync::LazyLock;
|
use std::sync::LazyLock;
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
|
@ -26,20 +25,14 @@ async fn main() -> Result<()> {
|
||||||
LazyLock::new(|| config_util::load_or_create("configserver.toml"));
|
LazyLock::new(|| config_util::load_or_create("configserver.toml"));
|
||||||
|
|
||||||
::common::splash::print_splash();
|
::common::splash::print_splash();
|
||||||
::common::logging::init(::tracing::Level::DEBUG);
|
::common::logging::init_axum(::tracing::Level::DEBUG);
|
||||||
|
|
||||||
Application::new()
|
Application::new()
|
||||||
.get("/index.json", get_index)
|
.serve_dir("/", "assets/config")
|
||||||
.with_encryption(&CONFIG.encryption)
|
.with_encryption(&CONFIG.encryption)
|
||||||
|
.with_logger()
|
||||||
.serve(&CONFIG.network)
|
.serve(&CONFIG.network)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn get_index() -> &'static str {
|
|
||||||
static INDEX: LazyLock<String> =
|
|
||||||
LazyLock::new(|| fs::read_to_string("assets/config/index.json").unwrap());
|
|
||||||
|
|
||||||
&*INDEX
|
|
||||||
}
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ version.workspace = true
|
||||||
# Framework
|
# Framework
|
||||||
axum.workspace = true
|
axum.workspace = true
|
||||||
axum-server.workspace = true
|
axum-server.workspace = true
|
||||||
|
tower-http.workspace = true
|
||||||
|
|
||||||
# Cryptography
|
# Cryptography
|
||||||
aes.workspace = true
|
aes.workspace = true
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
use axum::{handler::Handler, middleware::map_response_with_state, routing, Router};
|
use axum::{handler::Handler, middleware::map_response_with_state, Router, routing};
|
||||||
use config::{AesSettings, NetworkSettings};
|
|
||||||
|
|
||||||
pub use axum::extract::{Path, Query, State};
|
pub use axum::extract::{Path, Query, State};
|
||||||
pub use axum::http::StatusCode;
|
pub use axum::http::StatusCode;
|
||||||
pub use axum::response::Json;
|
pub use axum::response::Json;
|
||||||
|
use tower_http::services::ServeDir;
|
||||||
|
use tower_http::trace::TraceLayer;
|
||||||
|
|
||||||
|
use config::{AesSettings, NetworkSettings};
|
||||||
|
|
||||||
pub mod config;
|
pub mod config;
|
||||||
mod encryption;
|
mod encryption;
|
||||||
|
@ -56,6 +58,11 @@ impl<S: Clone + Send + Sync + 'static> Application<S> {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn serve_dir(mut self, path: &str, dir: &str) -> Self {
|
||||||
|
self.router = self.router.nest_service(path, ServeDir::new(dir));
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
pub fn with_encryption(mut self, aes_settings: &'static AesSettings) -> Self {
|
pub fn with_encryption(mut self, aes_settings: &'static AesSettings) -> Self {
|
||||||
self.router = self.router.layer(map_response_with_state(
|
self.router = self.router.layer(map_response_with_state(
|
||||||
aes_settings,
|
aes_settings,
|
||||||
|
@ -64,6 +71,11 @@ impl<S: Clone + Send + Sync + 'static> Application<S> {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn with_logger(mut self) -> Self {
|
||||||
|
self.router = self.router.layer(TraceLayer::new_for_http());
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn serve(self, settings: &NetworkSettings) -> Result<(), Error> {
|
pub async fn serve(self, settings: &NetworkSettings) -> Result<(), Error> {
|
||||||
let http_addr = settings.http_addr.parse().map_err(|_| Error::InvalidAddr)?;
|
let http_addr = settings.http_addr.parse().map_err(|_| Error::InvalidAddr)?;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue