one-api/common/requester/ws_reader.go
Buer ef041e28a1
♻️ refactor: provider refactor (#41)
* ♻️ refactor: provider refactor
* 完善百度/讯飞的函数调用,现在可以在`lobe-chat`中正常调用函数了
2024-01-19 02:47:10 +08:00

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()
}