mirror of
https://github.com/screego/server.git
synced 2025-09-27 04:26:34 +08:00
53 lines
993 B
Go
53 lines
993 B
Go
package ws
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
|
|
"github.com/screego/server/ws/outgoing"
|
|
)
|
|
|
|
type Typed struct {
|
|
Type string `json:"type"`
|
|
Payload json.RawMessage `json:"payload"`
|
|
}
|
|
|
|
func ToTypedOutgoing(outgoing outgoing.Message) (Typed, error) {
|
|
payload, err := json.Marshal(outgoing)
|
|
if err != nil {
|
|
return Typed{}, err
|
|
}
|
|
return Typed{
|
|
Type: outgoing.Type(),
|
|
Payload: payload,
|
|
}, nil
|
|
}
|
|
|
|
func ReadTypedIncoming(r io.Reader) (Event, error) {
|
|
typed := Typed{}
|
|
if err := json.NewDecoder(r).Decode(&typed); err != nil {
|
|
return nil, fmt.Errorf("%s e", err)
|
|
}
|
|
|
|
create, ok := provider[typed.Type]
|
|
|
|
if !ok {
|
|
return nil, errors.New("cannot handle " + typed.Type)
|
|
}
|
|
|
|
payload := create()
|
|
|
|
if err := json.Unmarshal(typed.Payload, payload); err != nil {
|
|
return nil, fmt.Errorf("incoming payload %s", err)
|
|
}
|
|
return payload, nil
|
|
}
|
|
|
|
var provider = map[string]func() Event{}
|
|
|
|
func register(t string, incoming func() Event) {
|
|
provider[t] = incoming
|
|
}
|