Files
KoSukeWork 9fe0457ee1 Add Responses WebSocket relay support (#5062)
* Add Responses WebSocket relay support

* Fix Responses WebSocket relay protocol issues

* Add status to Responses WebSocket errors

* Fix Responses WebSocket local error handling

* Use Responses error payload for control write failures

* Fix WebSocket subprotocol auth handling

* fix: address responses websocket CR feedback

* fix: truncate responses websocket relay errors

* fix: preserve websocket error message

* test: cover responses usage output fallback

* feat: close active websockets for disabled channels

* chore: address websocket manager review feedback

* fix: adapt responses websocket relay after rebase

* feat: add per-channel Responses WebSocket switch

* fix: address responses websocket relay review findings

* fix: share Responses WebSocket billing with HTTP and retain existing rate limits
2026-09-14 21:04:26 +08:00

86 lines
2.2 KiB
Go

package common
import (
"bytes"
"encoding/json"
"io"
kitutil "github.com/QuantumNous/new-api/relaykit/relayconvert/kitutil"
"github.com/gin-gonic/gin/binding"
)
type RawMessage = json.RawMessage
// hostJSONCodec is the single place where the host chooses its JSON engine.
// Swap the implementation here (for example to sonic.ConfigStd) and every
// common.* and kitutil.* JSON helper, including relaykit DTO (un)marshalling,
// follows. Injected from init() rather than main() so tests run on the same
// engine as production: common is imported by virtually every root package
// and test binary, while main() never executes under `go test`.
type hostJSONCodec struct{}
func (hostJSONCodec) Marshal(v any) ([]byte, error) {
return json.Marshal(v)
}
func (hostJSONCodec) Unmarshal(data []byte, v any) error {
return json.Unmarshal(data, v)
}
func (hostJSONCodec) Decode(r io.Reader, v any) error {
return json.NewDecoder(r).Decode(v)
}
func (hostJSONCodec) Valid(data []byte) bool {
return json.Valid(data)
}
func init() {
kitutil.SetCodec(hostJSONCodec{})
}
func Unmarshal(data []byte, v any) error {
return kitutil.Unmarshal(data, v)
}
func UnmarshalJsonStr(data string, v any) error {
return kitutil.UnmarshalJsonStr(data, v)
}
func DecodeJson(reader io.Reader, v any) error {
return kitutil.DecodeJson(reader, v)
}
// DecodeJsonWithValidation decodes JSON and applies Gin's configured binding-tag
// validator, including binding:"required" and any registered custom validators.
func DecodeJsonWithValidation(reader io.Reader, v any) error {
if err := DecodeJson(reader, v); err != nil {
return err
}
if binding.Validator == nil {
return nil
}
return binding.Validator.ValidateStruct(v)
}
func Marshal(v any) ([]byte, error) {
return kitutil.Marshal(v)
}
func IndentJson(data []byte) ([]byte, error) {
var buffer bytes.Buffer
if err := json.Indent(&buffer, data, "", " "); err != nil {
return nil, err
}
return buffer.Bytes(), nil
}
func GetJsonType(data RawMessage) string {
return kitutil.GetJsonType(data)
}
// JsonRawMessageToString returns JSON strings as their decoded value and other JSON values as raw text.
func JsonRawMessageToString(data RawMessage) string {
return kitutil.JsonRawMessageToString(data)
}