64 lines
1.4 KiB
Go
64 lines
1.4 KiB
Go
package transport
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io"
|
|
"time"
|
|
)
|
|
|
|
// ConnParameters is connection parameter of server.
|
|
type ConnParameters struct {
|
|
PingInterval time.Duration
|
|
PingTimeout time.Duration
|
|
SID string
|
|
Upgrades []string
|
|
}
|
|
|
|
type jsonParameters struct {
|
|
SID string `json:"sid"`
|
|
Upgrades []string `json:"upgrades"`
|
|
PingInterval int `json:"pingInterval"`
|
|
PingTimeout int `json:"pingTimeout"`
|
|
}
|
|
|
|
// ReadConnParameters reads ConnParameters from r.
|
|
func ReadConnParameters(r io.Reader) (ConnParameters, error) {
|
|
var param jsonParameters
|
|
if err := json.NewDecoder(r).Decode(¶m); err != nil {
|
|
return ConnParameters{}, err
|
|
}
|
|
|
|
return ConnParameters{
|
|
SID: param.SID,
|
|
Upgrades: param.Upgrades,
|
|
PingInterval: time.Duration(param.PingInterval) * time.Millisecond,
|
|
PingTimeout: time.Duration(param.PingTimeout) * time.Millisecond,
|
|
}, nil
|
|
}
|
|
|
|
// WriteTo writes to w with json format.
|
|
func (p ConnParameters) WriteTo(w io.Writer) (int64, error) {
|
|
arg := jsonParameters{
|
|
SID: p.SID,
|
|
Upgrades: p.Upgrades,
|
|
PingInterval: int(p.PingInterval / time.Millisecond),
|
|
PingTimeout: int(p.PingTimeout / time.Millisecond),
|
|
}
|
|
writer := writer{
|
|
w: w,
|
|
}
|
|
err := json.NewEncoder(&writer).Encode(arg)
|
|
return writer.i, err
|
|
}
|
|
|
|
type writer struct {
|
|
i int64
|
|
w io.Writer
|
|
}
|
|
|
|
func (w *writer) Write(p []byte) (int, error) {
|
|
n, err := w.w.Write(p)
|
|
w.i += int64(n)
|
|
return n, err
|
|
}
|