5
5
"net"
6
6
"strconv"
7
7
"strings"
8
+ "time"
8
9
9
10
"github.com/NamelessOne91/bisturi/sockets"
10
11
"github.com/NamelessOne91/bisturi/tui/styles"
@@ -26,7 +27,7 @@ const (
26
27
27
28
type errMsg error
28
29
29
- type packetMsg sockets.NetworkPacket
30
+ type readPacketsMsg [] sockets.NetworkPacket
30
31
31
32
type bisturiModel struct {
32
33
terminalHeight int
@@ -41,6 +42,7 @@ type bisturiModel struct {
41
42
selectedEthType uint16
42
43
rawSocket * sockets.RawSocket
43
44
packetsChan chan sockets.NetworkPacket
45
+ msgChan chan tea.Msg
44
46
errChan chan error
45
47
err error
46
48
}
@@ -60,8 +62,11 @@ func NewBisturiModel() *bisturiModel {
60
62
s .Style = lipgloss .NewStyle ().Foreground (lipgloss .Color ("#00cc99" ))
61
63
62
64
return & bisturiModel {
63
- step : retrieveIfaces ,
64
- spinner : s ,
65
+ step : retrieveIfaces ,
66
+ spinner : s ,
67
+ packetsChan : make (chan sockets.NetworkPacket ),
68
+ msgChan : make (chan tea.Msg ),
69
+ errChan : make (chan error ),
65
70
}
66
71
}
67
72
@@ -213,16 +218,12 @@ func (m *bisturiModel) updateRowsInput(msg tea.Msg) (tea.Model, tea.Cmd) {
213
218
maxRows , err := strconv .Atoi (m .rowsInput .Value ())
214
219
if err == nil && maxRows > 0 {
215
220
m .packetsTable = newPacketsTable (maxRows , m .terminalWidth )
216
-
217
- m .packetsChan = make (chan sockets.NetworkPacket )
218
- m .errChan = make (chan error )
219
-
220
221
m .step = receivePackets
221
222
222
- return m , tea . Batch ( func () tea. Msg {
223
- go m .rawSocket . ReadToChan ( m . packetsChan , m . errChan )
224
- return nil
225
- } , m .waitForPacket )
223
+ go m . rawSocket . ReadToChan ( m . packetsChan , m . errChan )
224
+ go m .readPackets ( )
225
+
226
+ return m , m .pollPacketsMessages ( )
226
227
}
227
228
}
228
229
}
@@ -242,18 +243,34 @@ func (m *bisturiModel) updateReceivingPacket(msg tea.Msg) (tea.Model, tea.Cmd) {
242
243
m .packetsTable .resizeTable (m .terminalWidth )
243
244
244
245
return m , nil
245
-
246
- case sockets.NetworkPacket :
247
- return m , m .waitForPacket
246
+ case readPacketsMsg :
247
+ return m , m .pollPacketsMessages ()
248
248
}
249
249
return m , cmd
250
250
}
251
251
252
- func (m bisturiModel ) waitForPacket () tea.Msg {
253
- select {
254
- case packet := <- m .packetsChan :
255
- return packetMsg (packet )
256
- case err := <- m .errChan :
257
- return errMsg (err )
252
+ func (m bisturiModel ) readPackets () {
253
+ readPackets := []sockets.NetworkPacket {}
254
+ timer := time .NewTicker (3 * time .Second )
255
+ defer timer .Stop ()
256
+
257
+ for {
258
+ select {
259
+ case packet := <- m .packetsChan :
260
+ readPackets = append (readPackets , packet )
261
+ case <- timer .C :
262
+ if len (readPackets ) > 0 {
263
+ m .msgChan <- readPacketsMsg (readPackets )
264
+ readPackets = []sockets.NetworkPacket {}
265
+ }
266
+ case err := <- m .errChan :
267
+ m .msgChan <- errMsg (err )
268
+ }
269
+ }
270
+ }
271
+
272
+ func (m bisturiModel ) pollPacketsMessages () tea.Cmd {
273
+ return func () tea.Msg {
274
+ return <- m .msgChan
258
275
}
259
276
}
0 commit comments