axum_cometd/types/
messages.rs

1mod de;
2
3use crate::types::{ChannelId, ClientId};
4use axum::Json;
5use core::fmt::Debug;
6use core::time::Duration;
7use serde::{Deserialize, Serialize};
8use serde_json::Value as JsonValue;
9use serde_with::skip_serializing_none;
10
11#[skip_serializing_none]
12#[derive(Debug, Default, Serialize, Deserialize)]
13pub(crate) struct Advice {
14    pub(crate) interval: Option<u64>,
15    #[serde(rename = "maxInterval")]
16    pub(crate) max_interval: Option<u64>,
17    //#[serde(rename = "multiple-clients")]
18    //pub(crate) multiple_clients: Option<bool>,
19    pub(crate) reconnect: Option<Reconnect>,
20    pub(crate) timeout: Option<u64>,
21    pub(crate) hosts: Option<Vec<String>>,
22}
23
24impl Advice {
25    #[inline(always)]
26    pub(crate) fn retry(timeout: Duration, interval: Duration) -> Self {
27        Self {
28            reconnect: Some(Reconnect::Retry),
29            timeout: Some(timeout.as_millis().try_into().unwrap_or(u64::MAX)),
30            interval: Some(interval.as_millis().try_into().unwrap_or(u64::MAX)),
31            ..Default::default()
32        }
33    }
34
35    #[inline(always)]
36    pub(crate) fn handshake() -> Self {
37        Self {
38            reconnect: Some(Reconnect::Handshake),
39            interval: Some(0),
40            ..Default::default()
41        }
42    }
43}
44
45#[derive(Debug, Serialize, Deserialize)]
46#[serde(rename_all = "lowercase")]
47pub(crate) enum Reconnect {
48    Retry,
49    Handshake,
50    None,
51}
52
53#[skip_serializing_none]
54#[derive(Debug, Default, Serialize, Deserialize)]
55pub(crate) struct Message {
56    pub(crate) advice: Option<Advice>,
57    pub(crate) channel: Option<String>,
58    #[serde(rename = "clientId")]
59    pub(crate) client_id: Option<ClientId>,
60    //#[serde(rename = "connectionType")]
61    //pub(crate) connection_type: Option<String>,
62    pub(crate) data: Option<JsonValue>,
63    pub(crate) error: Option<String>,
64    //pub(crate) ext: Option<JsonValue>,
65    pub(crate) id: Option<String>,
66    #[serde(rename = "minimumVersion")]
67    pub(crate) minimum_version: Option<String>,
68    //pub(crate) reestablish: Option<bool>,
69    #[serde(default, deserialize_with = "de::deserialize_subscription")]
70    pub(crate) subscription: Option<Vec<String>>,
71    pub(crate) successful: Option<bool>,
72    #[serde(rename = "supportedConnectionTypes")]
73    pub(crate) supported_connection_types: Option<Vec<String>>,
74    //pub(crate) timestamp: Option<String>,
75    pub(crate) version: Option<String>,
76}
77
78#[derive(Debug, Clone)]
79pub(crate) struct SubscriptionMessage {
80    pub(crate) channel: ChannelId,
81    pub(crate) msg: JsonValue,
82}
83
84impl Message {
85    #[inline(always)]
86    pub(crate) fn ok(id: Option<String>, channel: Option<String>) -> Self {
87        Self {
88            id,
89            channel,
90            successful: Some(true),
91            ..Default::default()
92        }
93    }
94
95    #[inline(always)]
96    pub(crate) fn session_unknown(
97        id: Option<String>,
98        channel: Option<String>,
99        advice: Option<Advice>,
100    ) -> Self {
101        Self {
102            id,
103            successful: Some(false),
104            channel,
105            error: Some("402::session_unknown".into()),
106            advice,
107            ..Default::default()
108        }
109    }
110
111    #[inline(always)]
112    pub(crate) fn wrong_minimum_version(
113        id: Option<String>,
114        minimum_version: Option<String>,
115    ) -> Self {
116        Self {
117            id,
118            successful: Some(false),
119            minimum_version,
120            error: Some("400::minimum_version_missing".into()),
121            ..Default::default()
122        }
123    }
124
125    #[inline(always)]
126    pub(crate) fn subscription_missing(id: Option<String>) -> Self {
127        Self {
128            id,
129            channel: Some("/meta/subscribe".into()),
130            successful: Some(false),
131            error: Some("403::subscription_missing".into()),
132            ..Default::default()
133        }
134    }
135
136    #[inline(always)]
137    pub(crate) fn channel_missing(id: Option<String>) -> Self {
138        Self {
139            id,
140            successful: Some(false),
141            error: Some("400::channel_missing".into()),
142            ..Default::default()
143        }
144    }
145}
146
147impl From<Message> for Json<[Message; 1]> {
148    #[inline(always)]
149    fn from(message: Message) -> Self {
150        Json([message])
151    }
152}
153
154impl From<Message> for Json<Vec<Message>> {
155    #[inline(always)]
156    fn from(message: Message) -> Self {
157        Json(vec![message])
158    }
159}