Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
R
railgun-routing-server
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Railgun
railgun-routing-server
Commits
e832a189
Commit
e832a189
authored
Dec 18, 2025
by
nanamicat
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
cors
parent
5ab08d3c
Pipeline
#42022
passed with stages
in 4 minutes and 42 seconds
Changes
6
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
34 additions
and
13 deletions
+34
-13
Cargo.lock
Cargo.lock
+15
-0
Cargo.toml
Cargo.toml
+1
-0
src/api.rs
src/api.rs
+3
-1
src/main.rs
src/main.rs
+10
-8
src/protocol.rs
src/protocol.rs
+4
-3
src/router.rs
src/router.rs
+1
-1
No files found.
Cargo.lock
View file @
e832a189
...
...
@@ -635,6 +635,7 @@ dependencies = [
"serde",
"serde_json",
"tokio",
"tower-http",
]
[[package]]
...
...
@@ -906,6 +907,20 @@ dependencies = [
"tracing",
]
[[package]]
name = "tower-http"
version = "0.6.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8"
dependencies = [
"bitflags",
"bytes",
"http",
"pin-project-lite",
"tower-layer",
"tower-service",
]
[[package]]
name = "tower-layer"
version = "0.3.3"
...
...
Cargo.toml
View file @
e832a189
...
...
@@ -13,3 +13,4 @@ tokio = { version = "1.48", features = ["full"] }
anyhow
=
"1.0.100"
axum
=
{
version
=
"0.8.7"
,
features
=
["macros"]
}
bincode
=
"2.0.1"
tower-http
=
{
version
=
"0.6.8"
,
features
=
["cors"]
}
src/api.rs
View file @
e832a189
use
axum
::{
routing
::
get
,
Json
};
use
axum
::{
Json
,
routing
::
get
};
use
serde
::
Serialize
;
use
std
::
collections
::
BTreeMap
;
use
std
::
sync
::
Arc
;
...
...
@@ -6,6 +6,7 @@ use tokio::sync::RwLock;
use
crate
::
data
::{
ConnectionData
,
RouterData
};
use
crate
::
router
::
Router
;
use
tower_http
::
cors
::
CorsLayer
;
#[derive(Serialize,
Clone)]
pub
struct
Info
{
...
...
@@ -17,4 +18,5 @@ pub fn create_app(routers: Arc<Vec<RouterData>>, connections: Arc<BTreeMap<u8, B
axum
::
Router
::
new
()
.route
(
"/info"
,
get
(||
async
move
{
Json
(
Info
{
routers
,
connections
})
}))
.route
(
"/metrics"
,
get
(||
async
move
{
Json
(
routers2
.read
()
.await
.clone
())
}))
.layer
(
CorsLayer
::
permissive
())
}
src/main.rs
View file @
e832a189
...
...
@@ -2,10 +2,11 @@ use crate::api::create_app;
use
crate
::
data
::
RouterData
;
use
crate
::
protocol
::{
Change
,
Report
};
use
crate
::
router
::
Router
;
use
crate
::
settings
::{
Settings
,
INTERVAL
,
TIMEOUT
};
use
anyhow
::
Result
;
use
crate
::
settings
::{
INTERVAL
,
Settings
,
TIMEOUT
};
use
::
config
::
Config
;
use
anyhow
::
Result
;
use
config
::
Environment
;
use
serde
::
Serialize
;
use
std
::
collections
::
BTreeMap
;
use
std
::
sync
::
Arc
;
use
tokio
::
net
::
UdpSocket
;
...
...
@@ -21,7 +22,7 @@ mod quality;
mod
router
;
mod
settings
;
#[derive(Default)]
#[derive(Default
,
Serialize
)]
pub
struct
UpdatingState
{
router_id
:
u8
,
change
:
Change
,
...
...
@@ -73,16 +74,16 @@ async fn main() -> Result<()> {
result
=
socket
.recv_from
(
&
mut
buf
)
=>
{
let
(
len
,
addr
)
=
result
?
;
if
let
Ok
((
report
,
_
))
=
bincode
::
decode_from_slice
::
<
Report
,
_
>
(
&
buf
[
..
len
],
bincode
::
config
::
standard
())
{
if
let
Ok
((
report
,
_
))
=
bincode
::
decode_from_slice
::
<
Report
,
_
>
(
&
buf
[
..
len
],
bincode
::
config
::
standard
())
{
println!
(
"{}"
,
serde_json
::
to_string
(
&
report
)
?
);
let
mut
routers
=
routers
.write
()
.await
;
if
let
Some
(
router
)
=
routers
.get_mut
(
&
report
.id
)
{
if
let
Some
(
router
)
=
routers
.get_mut
(
&
report
.id
)
{
if
let
Some
(
change
)
=
router
.on_message
(
report
,
addr
,
&
mut
updating
)
{
println!
(
"r{} {}"
,
router
.id
,
serde_json
::
to_string
(
&
change
)
?
);
let
len
=
bincode
::
encode_into_slice
(
change
,
&
mut
buf
,
bincode
::
config
::
standard
())
?
;
let
_
=
socket
.send_to
(
&
buf
[
..
len
],
addr
)
.await
;
}
}
}
}
}
...
...
@@ -107,6 +108,7 @@ async fn main() -> Result<()> {
if
let
Some
((
router
,
change
))
=
routers
.values
()
.find_map
(|
r
|
r
.update
(
&
routers
,
&
connections
)
.map
(|
change
|(
r
,
change
)))
{
updating
.router_id
=
router
.id
;
updating
.change
=
change
;
println!
(
"{}"
,
serde_json
::
to_string
(
&
updating
)
?
);
let
len
=
bincode
::
encode_into_slice
(
&
updating
.change
,
&
mut
buf
,
bincode
::
config
::
standard
())
?
;
let
_
=
socket
.send_to
(
&
buf
[
..
len
],
router
.addr
.unwrap
())
.await
;
}
...
...
src/protocol.rs
View file @
e832a189
use
bincode
::{
Decode
,
Encode
};
use
serde
::
Serialize
;
use
std
::
collections
::
BTreeMap
;
#[derive(Encode,
Decode)]
#[derive(Encode,
Decode
,
Serialize
)]
pub
struct
Report
{
pub
id
:
u8
,
pub
ack
:
u8
,
...
...
@@ -9,14 +10,14 @@ pub struct Report {
pub
peers
:
Vec
<
PeerQuality
>
,
}
#[derive(Encode,
Decode,
Copy,
Clone,
serde::
Serialize)]
#[derive(Encode,
Decode,
Copy,
Clone,
Serialize)]
pub
struct
PeerQuality
{
pub
delay
:
i16
,
pub
reliability
:
u8
,
pub
jitter
:
u8
,
}
#[derive(Encode,
Decode,
Default)]
#[derive(Encode,
Decode,
Default
,
Serialize
)]
pub
struct
Change
{
pub
seq
:
u8
,
pub
rst
:
bool
,
...
...
src/router.rs
View file @
e832a189
...
...
@@ -133,7 +133,7 @@ impl Router {
let
current
=
candidate
.iter
()
.find
(|(
v
,
_
)|
v
.id
==
*
self
.via
.get
(
&
to
.id
)
.expect
(
""
));
let
(
best_router
,
best_metric
)
=
candidate
.iter
()
.min_by_key
(|(
_
,
m
)|
m
)
.unwrap
();
if
current
.is_none_or
(|(
current_router
,
current_metric
)|
current_router
!=
best_router
&&
best_metric
+
THROTTLE
<
*
current_metric
)
{
if
current
.is_none_or
(|(
current_router
,
current_metric
)|
current_router
!=
best_router
&&
*
best_metric
!=
i32
::
MAX
&&
*
best_metric
+
THROTTLE
<
*
current_metric
)
{
changed_via
.insert
(
to
.id
,
best_router
.id
);
metric
.insert
(
to
.id
,
*
best_metric
);
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment