1+ --- @class MQTTBroker
2+ local MQTTBroker = {}
3+
4+ local ERRORText = {
5+ [" validate_MessageWrongType" ] = " Message is not of type table! It is type %s" ,
6+ [" validate_MissingSender" ] = " Sender_ID is Missing" ,
7+ }
8+
9+ MQTTBroker .defaultTimeOut = 300 * 1000 -- 5 minutes
10+
11+ --- @type MQTTBroker_ClientList
12+ MQTTBroker .clientList = {}
13+
14+ --- @type nil | fun ( topic , message ): boolean , ( nil | string )
15+ MQTTBroker .validator = nil
16+
17+ --- @type MQTT_messages
18+ MQTTBroker .messages = {}
19+
20+ --- @private
21+ MQTTBroker .messageIndex = {}
22+
23+ --- @param id any
24+ --- @return MQTT_message | nil
25+ function MQTTBroker :getMessageByID (id )
26+ return self .messageIndex [id ]
27+ end
28+
29+
30+
31+ --- @param topic string
32+ --- @param message MQTT_message
33+ --- @return boolean
34+ --- @return string | nil
35+ function MQTTBroker :validatePayload (topic , message )
36+ if type (message ) ~= " table" then
37+ return false , string.format (ERRORText [" validate_MessageWrongType" ], type (message ))
38+ end
39+ if not message .sender or type (message .sender ) ~= " number" then
40+ return false , ERRORText [" validate_MissingSender" ]
41+ end
42+ if not MQTTBroker .validator then return true end
43+ return MQTTBroker .validator (topic , message .payload )
44+ end
45+
46+ --- @param topic string
47+ --- @param message MQTT_message
48+ --- @return boolean success
49+ --- @return string | nil idOrErrorReason
50+ function MQTTBroker :publish (topic , message )
51+ local ok , err = self :validatePayload (topic , message )
52+ if not ok then
53+ return false , err
54+ end
55+
56+
57+
58+ local suffix = 0
59+ local isDublicate = true
60+ local currentTime = string.format (math.floor (os.time ()))
61+ while isDublicate do
62+ if self :getMessageByID (currentTime .. suffix ) then
63+ suffix = suffix + 1
64+ isDublicate = true
65+ else
66+ isDublicate = false
67+ end
68+ end
69+ message .id = currentTime .. suffix
70+
71+ if not message .retain and not message .ttl then
72+ message .ttl = self .defaultTimeOut
73+ end
74+
75+ message .readBy = {}
76+
77+ if self .messages [topic ] == nil then
78+ self .messages [topic ] = {}
79+ end
80+
81+ table.insert (self .messages [topic ], message )
82+ self .messageIndex [message .id ] = message
83+ return true , message .id
84+ end
85+
86+ --- @param clientID number
87+ --- @param topic string
88+ --- @return boolean success
89+ function MQTTBroker :subscribe (clientID , topic )
90+ return true
91+ end
92+
93+ --- @param clientID number
94+ --- @param topic string
95+ --- @return boolean success
96+ function MQTTBroker :unsubscribe (clientID , topic )
97+ return true
98+ end
99+
100+ --- @param clientID number
101+ --- @return MQTT_messages
102+ function MQTTBroker :getMessagesForClient (clientID )
103+ return {}
104+ end
105+
106+
107+ --- @param clientID number
108+ --- @param topic string
109+ --- @return boolean success
110+ function MQTTBroker :markAsRead (clientID , topic )
111+ return true
112+ end
113+
114+ --- @return number deletedMessages
115+ function MQTTBroker :expireMessages ()
116+ return 0
117+ end
118+
119+ --- @param topic string
120+ --- @return boolean
121+ function MQTTBroker :pruneTopic (topic )
122+ return true
123+ end
124+
125+ --- Register the last will of a client (In case of a timeout)
126+ --- @param clientID number
127+ --- @param topic string
128+ --- @param message MQTT_message
129+ --- @param timeoutDuration number in seconds
130+ --- @return boolean
131+ function MQTTBroker :registerLastWillMessage (clientID , topic , message , timeoutDuration )
132+ return true
133+ end
134+
135+ --- comment
136+ --- @return integer
137+ function MQTTBroker :checkClientTimeouts ()
138+ return 0
139+ end
140+
141+
142+ return MQTTBroker
0 commit comments