mirror of
https://github.com/songquanpeng/one-api.git
synced 2025-09-29 22:56:39 +08:00
59 lines
898 B
Go
59 lines
898 B
Go
package requester
|
|
|
|
import (
|
|
"io"
|
|
|
|
"github.com/gorilla/websocket"
|
|
)
|
|
|
|
type wsReader[T streamable] struct {
|
|
isFinished bool
|
|
|
|
reader *websocket.Conn
|
|
handlerPrefix HandlerPrefix[T]
|
|
}
|
|
|
|
func (stream *wsReader[T]) Recv() (response *[]T, err error) {
|
|
if stream.isFinished {
|
|
err = io.EOF
|
|
return
|
|
}
|
|
|
|
response, err = stream.processLines()
|
|
return
|
|
}
|
|
|
|
func (stream *wsReader[T]) processLines() (*[]T, error) {
|
|
for {
|
|
_, msg, err := stream.reader.ReadMessage()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var response []T
|
|
err = stream.handlerPrefix(&msg, &stream.isFinished, &response)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if stream.isFinished {
|
|
if len(response) > 0 {
|
|
return &response, io.EOF
|
|
}
|
|
return nil, io.EOF
|
|
}
|
|
|
|
if msg == nil || len(response) == 0 {
|
|
continue
|
|
}
|
|
|
|
return &response, nil
|
|
|
|
}
|
|
}
|
|
|
|
func (stream *wsReader[T]) Close() {
|
|
stream.reader.Close()
|
|
}
|