first implementation

This commit is contained in:
2024-05-29 18:49:28 +08:00
commit 3079e602c8
31 changed files with 5415 additions and 0 deletions

16
signaling/Cargo.toml Normal file
View File

@ -0,0 +1,16 @@
[package]
name = "signaling"
version = "0.1.0"
edition = "2021"
[dependencies]
tonic = "0.11"
prost = "0.12"
serde = { version = "1" }
tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] }
[build-dependencies]
tonic-build = "0.11"
[dev-dependencies]
serde_json = "1"

21
signaling/build.rs Normal file
View File

@ -0,0 +1,21 @@
fn main() -> Result<(), Box<dyn std::error::Error>> {
tonic_build::configure()
.type_attribute(
"Message",
"#[derive(serde::Deserialize, serde::Serialize)]\n#[serde(tag = \"type\")]",
)
.type_attribute(
"SignalingMessage",
"#[derive(serde::Deserialize, serde::Serialize)]\n#[serde(default)]",
)
.type_attribute(
"SDPMessage",
"#[derive(serde::Deserialize, serde::Serialize)]",
)
.type_attribute(
"ICECandidate",
"#[derive(serde::Deserialize, serde::Serialize)]",
)
.compile(&["proto/signaling.proto"], &["proto"])?;
Ok(())
}

View File

@ -0,0 +1,44 @@
syntax = "proto3";
package signaling;
option go_package = "git.jeffthecoder.xyz/public/chat-signaling-server/pkg/proto/signaling";
import "google/protobuf/empty.proto";
enum SDPMessageKind {
Video = 0;
Audio = 1;
VideoAudio = 2;
Data = 3;
}
message SDPMessage {
string SDP = 1;
SDPMessageKind Kind = 2;
string Sender = 3;
}
message ICECandidate {
string Candidate = 1;
string Sender = 2;
}
message SignalingMessage {
string Room = 1;
string Sender = 2;
optional string Receiver = 3;
oneof Message {
google.protobuf.Empty Bootstrap = 10;
google.protobuf.Empty DiscoverRequest = 11;
google.protobuf.Empty DiscoverResponse = 12;
SDPMessage SessionOffer = 13;
SDPMessage SessionAnswer = 14;
ICECandidate ICECandidate = 15;
};
}
service Signaling {
rpc Biu(stream SignalingMessage) returns (stream SignalingMessage);
}

29
signaling/src/lib.rs Normal file
View File

@ -0,0 +1,29 @@
tonic::include_proto!("signaling"); // The string specified here must match the proto package name
#[cfg(test)]
mod test {
#[test]
fn serde_serialization() {
println!(
"{}",
serde_json::to_string(&crate::SignalingMessage {
message: Some(crate::signaling_message::Message::Bootstrap(())),
..Default::default()
})
.unwrap()
);
println!(
"{}",
serde_json::to_string(&crate::SignalingMessage {
message: Some(crate::signaling_message::Message::SessionOffer(
crate::SdpMessage {
..Default::default()
}
)),
..Default::default()
})
.unwrap()
);
}
}