48 lines
743 B
Go
48 lines
743 B
Go
|
package networking
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"io"
|
||
|
)
|
||
|
|
||
|
|
||
|
type AsyncWriter struct {
|
||
|
BufSize int
|
||
|
stream io.WriteCloser
|
||
|
dataChan chan []byte
|
||
|
stopFlag bool
|
||
|
}
|
||
|
|
||
|
func NewAsyncWriter(writer io.WriteCloser) *AsyncWriter {
|
||
|
return &AsyncWriter{
|
||
|
BufSize: defaultBufSize,
|
||
|
stream: writer,
|
||
|
stopFlag: false,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (aw *AsyncWriter) SendChan() (chan<- []byte) {
|
||
|
aw.dataChan = make(chan []byte)
|
||
|
go aw.sendLoop()
|
||
|
return aw.dataChan
|
||
|
}
|
||
|
|
||
|
func (aw *AsyncWriter) sendLoop() {
|
||
|
for !aw.stopFlag {
|
||
|
data, open := <- aw.dataChan
|
||
|
if !open {
|
||
|
aw.stopFlag = true
|
||
|
return
|
||
|
}
|
||
|
_, err := aw.stream.Write(data)
|
||
|
if err != nil {
|
||
|
fmt.Println("ouchie")
|
||
|
aw.stopFlag = true
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (aw *AsyncWriter) Close() {
|
||
|
aw.stopFlag = true
|
||
|
close(aw.dataChan)
|
||
|
}
|