Skip to main content

powhttp_sdk/
websocket.rs

1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use super::shared::Side;
4use crate::serde_helpers::base64_bytes;
5
6/// A single WebSocket message exchanged between client and server.
7#[derive(Debug, Clone, Serialize, Deserialize)]
8#[serde(rename_all = "camelCase")]
9pub struct WebSocketMessage {
10    pub side: Side,
11    pub started_at: Option<DateTime<Utc>>,
12    pub ended_at: Option<DateTime<Utc>>,
13    pub payload: Payload,
14}
15
16#[derive(Debug, Clone, Serialize, Deserialize)]
17#[serde(rename_all = "camelCase")]
18pub struct Text {
19    pub text: String,
20}
21
22#[derive(Debug, Clone, Serialize, Deserialize)]
23#[serde(rename_all = "camelCase")]
24pub struct Data {
25    #[serde(with = "base64_bytes")]
26    pub data: Vec<u8>,
27}
28
29#[derive(Debug, Clone, Serialize, Deserialize)]
30#[serde(rename_all = "camelCase")]
31pub struct Close {
32    pub code: u16,
33    pub reason: String,
34}
35
36#[derive(Debug, Clone, Serialize, Deserialize)]
37#[serde(rename_all = "camelCase")]
38pub struct Ping {
39    #[serde(with = "base64_bytes")]
40    pub data: Vec<u8>,
41}
42
43#[derive(Debug, Clone, Serialize, Deserialize)]
44#[serde(rename_all = "camelCase")]
45pub struct Pong {
46    #[serde(with = "base64_bytes")]
47    pub data: Vec<u8>,
48}
49
50#[derive(Debug, Clone, Serialize, Deserialize)]
51#[serde(rename_all = "camelCase")]
52pub struct UnknownPayload {
53    #[serde(with = "base64_bytes")]
54    pub data: Vec<u8>,
55}
56
57/// The payload type of a WebSocket message.
58#[derive(Debug, Clone, Serialize, Deserialize)]
59#[serde(tag = "type", rename_all = "snake_case", rename_all_fields = "camelCase")]
60pub enum Payload {
61    Text(Text),
62    Binary(Data),
63    Close(Close),
64    Ping(Ping),
65    Pong(Pong),
66    Unknown(UnknownPayload),
67}