Skip to main content

vapour_protocol/
service_method.rs

1use prost::Message;
2
3use crate::{
4    connection::{Connection, ConnectionState},
5    emsg::EMsg,
6    error::Result,
7    protobuf::CMsgProtoBufHeader,
8};
9
10#[derive(Debug, Clone, PartialEq, Eq)]
11pub struct ServiceMethod {
12    pub target_job_name: String,
13}
14
15impl ServiceMethod {
16    pub fn new(target_job_name: impl Into<String>) -> Self {
17        Self {
18            target_job_name: target_job_name.into(),
19        }
20    }
21}
22
23pub async fn call<Req, Resp>(
24    connection: &Connection,
25    method: &ServiceMethod,
26    request: &Req,
27) -> Result<Resp>
28where
29    Req: Message,
30    Resp: Message + Default,
31{
32    let packet = connection
33        .request(
34            EMsg::ServiceMethodCallFromClientNonAuthed,
35            CMsgProtoBufHeader {
36                target_job_name: Some(method.target_job_name.clone()),
37                ..Default::default()
38            },
39            request,
40        )
41        .await?;
42
43    packet.decode_body::<Resp>()
44}
45
46/// Like `call` but uses `ServiceMethodCallFromClient` with the logged-on session
47/// headers (steamid + client_sessionid). Required for user-scoped service methods.
48pub async fn call_authed<Req, Resp>(
49    connection: &Connection,
50    state: &ConnectionState,
51    method: &ServiceMethod,
52    request: &Req,
53) -> Result<Resp>
54where
55    Req: Message,
56    Resp: Message + Default,
57{
58    let packet = connection
59        .request(
60            EMsg::ServiceMethodCallFromClient,
61            CMsgProtoBufHeader {
62                steamid: state.steamid,
63                client_sessionid: state.client_session_id,
64                target_job_name: Some(method.target_job_name.clone()),
65                ..Default::default()
66            },
67            request,
68        )
69        .await?;
70
71    packet.decode_body::<Resp>()
72}