axum_cometd/types/
messages.rs1mod 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 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 pub(crate) data: Option<JsonValue>,
63 pub(crate) error: Option<String>,
64 pub(crate) id: Option<String>,
66 #[serde(rename = "minimumVersion")]
67 pub(crate) minimum_version: Option<String>,
68 #[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) 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}