1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
use serde::Serialize;
use std::collections::HashMap;

/// Struct encompasses a message we are trying to relay to a client from somehwere within dim. It
/// holds an id and a event_type field.
#[derive(Serialize)]
pub struct Message {
    /// Field id, can hold anything and the client usually discriminates its meaning based on the
    /// event_type. For example within dim, sometimes it can be the library_id or media_id or
    /// sometimes its just -1 meaning ignore
    pub id: i64,
    /// Field holds the event type that gets relayed to the clients.
    #[serde(flatten)]
    pub event_type: PushEventType,
}

impl ToString for Message {
    fn to_string(&self) -> String {
        serde_json::to_string(&self).unwrap()
    }
}

/// Enum holds all event types used within dim that are dispatched over ws.
#[derive(Serialize)]
#[serde(tag = "type")]
pub enum PushEventType {
    /// A new media card has been added to the database
    EventNewCard { lib_id: i64 },
    /// A card has been removed from the database
    EventRemoveCard,
    /// A new library has been added to the database
    EventNewLibrary,
    /// A library has been removed from the database
    EventRemoveLibrary,
    /// A stream is ready to be streamed.
    EventStreamIsReady,
    /// Holds a hashmap of stats collected from ffmpeg over stdout.
    EventStreamStats(HashMap<String, String>),
    /// A library is being scanned.
    EventStartedScanning,
    /// A library has finished scanning.
    EventStoppedScanning,
    /// Tell client auth is ok
    EventAuthOk,
    /// Tell client their token is wrong or missing
    EventAuthErr,
    /// Matched mediafile. This hints to a listener that they must remove this mediafile from a
    /// list, or update its state.
    MediafileMatched { mediafile: i64, library_id: i64 },
}