Files
openaccounting-server/core/ws/.ws.go.swp

29 lines
20 KiB
Plaintext
Raw Normal View History

b0VIM 8.0<00><00>\<5C><00>6txgruppitxgruppi-pc~txgruppi/src/github.com/txgruppi/oa-server/core/ws/ws.goutf-8 3210#"! U
<00>
<00>
<00>
<00>
w
s
r
O



<00> <00> <00> <00> <00> v j f e C B /  <00><00>~uqpJ1<00><00><00><00>2(#<00><00><00><00><00><00><00><00><00><00>ca`<00><00><00><00><00><00>~GF-<00><00><00><00>sG<<00><00><00><00><00><00>xH8
<00><00><00><00><00><00> sequenceNumbers[conn]++ case "ping": } return errors.New("Unhandled message type: " + message.Type) default: unsubscribe(conn, key, priceSubscriptions) case "price": unsubscribe(conn, key, accountSubscriptions) case "account": unsubscribe(conn, key, txSubscriptions) case "transaction": switch message.Type { case "unsubscribe": } return errors.New("Unhandled message type: " + message.Type) default: subscribe(conn, key, priceSubscriptions) case "price": subscribe(conn, key, accountSubscriptions) case "account": subscribe(conn, key, txSubscriptions) case "transaction": switch message.Type { case "subscribe": switch message.Action { log.Println(message.Action, message.Type, dataString) key := getKey(userMap[conn].Id, dataString) } return err if err != nil { err := mapstructure.Decode(message.Data, &dataString) var dataString stringfunc processMessage(message Message, conn *websocket.Conn) error {} return userId + "-" + orgIdfunc getKey(userId string, orgId string) string {} } } continue log.Println(err) if err != nil { err = processMessage(message, c) } continue } break writeMessage(c, websocket.CloseMessage, websocket.FormatCloseMessage(4000, err.Error())) log.Println("Authentication error " + err.Error()) if err != nil { err = authenticate(message, c) log.Println("checking message for authentication") if userMap[c] == nil { // make sure they are authenticated } break writeMessage(c, websocket.CloseMessage, websocket.FormatCloseMessage(4001, err.Error())) log.Println(err.Error()) if err != nil { err = checkVersion(message.Version) // check version log.Printf("recv: %s", message) } continue log.Println("Could not parse message:", string(messageData)) if err != nil { err = json.Unmarshal(messageData, &message) message := Message{} } continue log.Println("Unsupported message type", mt) if mt != websocket.TextMessage { } break unsubscribeAll(c) // remove connection from maps log.Println("readerr:", err) if err != nil { mt, messageData, err := c.ReadMessage() for { defer c.Close() locks[c] = &sync.Mutex{} sequenceNumbers[c] = -1 } return log.Print("upgrade:", err) if err != nil { c, err := websocket.Upgrade(w.(http.ResponseWriter), r.Request, nil, 0, 0)func Handler(w rest.ResponseWriter, r *rest.Request) {} Data interface{} `json:"data"` Action string `json:"action"` Type string `json:"type"` SequenceNumber int `json:"sequenceNumber"` Version string `json:"version"`type Message struct {var locks = make(map[*websocket.Conn]*sync.Mutex)var sequenceNumbers = make(map[*websocket.Conn]int)var userMap = make(map[*websocket.Conn]*types.User)var priceSubscriptions = make(map[string][]*websocket.Conn)var accountSubscriptions = make(map[string][]*websocket.Conn)var txSubscriptions = make(map[string][]*websocket.Conn)//var upgrader = websocket.Upgrader{} // use default optionsconst version = "1.2.0") "sync" "net/http" "log" "github.com/openaccounting/oa-server/core/model/types" "github.com/openaccounting/oa-server/core/auth" "github.com/mitchellh/mapstructure" "github.com/gorilla/websocket" "github.com/ant0ine/go-json-rest/rest" "github.com/Masterminds/semver" "errors" "encoding/json"import (package wsad<00>
<00> 8<00><00><00><00><00><00><00><00><00>O@<00><00><00><00><00><00><00><00>cREBA+*<00> <00> <00> <00> z w v F   <00> <00> <00>  X U T H F E <00> <00> <00> <00> <00> <00> } return conn.WriteMessage(messageType, data) defer locks[conn].Unlock() locks[conn].Lock()func writeMessage(conn *websocket.Conn, messageType int, data []byte) error {} return nil } return errors.New("Invalid version") if versionMatch == false && compatMatch == false { compatMatch := constraint.Check(compatVersion) versionMatch := constraint.Check(serverVersion) compatVersion, _ := semver.NewVersion("0.1.8") serverVersion, _ := semver.NewVersion(version) } return errors.New("Invalid version") if err != nil { constraint, err := semver.NewConstraint(clientVersion)func checkVersion(clientVersion string) error {} return nil userMap[conn] = user } return err if err != nil { user, err := auth.Instance.Authenticate(id, "") } return errors.New("Authentication required") if message.Action != "authenticate" { } return err if err != nil { err := mapstructure.Decode(message.Data, &id) var id stringfunc authenticate(message Message, conn *websocket.Conn) error {} } } } unsubscribeAll(conn) log.Println("Cannot PushPrice to client:", err) if err != nil {ad
<00>
<00>
<00>
<00>
<00>
<00>
|
`
N
+
&
"
<00> <00> <00> <00> <00> <00> <00> <00> S 5 4 <00><00><00><00>sX&<00><00><00><00><00><00><00>`_L<00><00><00><00><00><00><00>a`><00><00><00>jiV+ <00><00><00><00>xsolji#<00><00><00><00>qV$<00><00><00><00><00><00><00>i err = writeMessage(conn, websocket.TextMessage, messageData) } return log.Println("PushPrice error:", err) if err != nil { messageData, err := json.Marshal(message) message.SequenceNumber = sequenceNumbers[conn] sequenceNumbers[conn]++ for _, conn := range priceSubscriptions[key] { key := getKey(userId, price.OrgId) for _, userId := range userIds { message := Message{version, -1, "price", action, price}func PushPrice(price *types.Price, userIds []string, action string) {} } } } unsubscribeAll(conn) log.Println("Cannot PushAccount to client:", err) if err != nil { err = writeMessage(conn, websocket.TextMessage, messageData) } return log.Println("PushAccount error:", err) if err != nil { messageData, err := json.Marshal(message) message.SequenceNumber = sequenceNumbers[conn] sequenceNumbers[conn]++ for _, conn := range accountSubscriptions[key] { key := getKey(userId, account.OrgId) for _, userId := range userIds { message := Message{version, -1, "account", action, account}func PushAccount(account *types.Account, userIds []string, action string) {} } } } unsubscribeAll(conn) log.Println("Cannot PushTransaction to client:", err) if err != nil { err = writeMessage(conn, websocket.TextMessage, messageData) } return log.Println("PushTransaction json error:", err) if err != nil { messageData, err := json.Marshal(message) message.SequenceNumber = sequenceNumbers[conn] sequenceNumbers[conn]++ for _, conn := range txSubscriptions[key] { key := getKey(userId, transaction.OrgId) for _, userId := range userIds { message := Message{version, -1, "transaction", action, transaction} log.Println(txSubscriptions)func PushTransaction(transaction *types.Transaction, userIds []string, action string) {} delete(locks, conn) delete(sequenceNumbers, conn) delete(userMap, conn) } priceSubscriptions[key] = newConns } } newConns = append(newConns, c) if conn != c { for _, c := range conns { newConns := conns[:0] for key, conns := range priceSubscriptions { } accountSubscriptions[key] = newConns } } newConns = append(newConns, c) if conn != c { for _, c := range conns { newConns := conns[:0] for key, conns := range accountSubscriptions { } txSubscriptions[key] = newConns } } newConns = append(newConns, c) if conn != c { for _, c := range conns { newConns := conns[:0] for key, conns := range txSubscriptions { // TODO fix "concurrent map iteration and map write" errorfunc unsubscribeAll(conn *websocket.Conn) {} } } newConns = append(newConns, c) if conn != c { for _, c := range clientMap[key] { newConns := clientMap[key][:0]func unsubscribe(conn *websocket.Conn, key string, clientMap map[string][]*websocket.Conn) {} } clientMap[key] = append(clientMap[key], conn) if alreadySubscribed == false { } } alreadySubscribed = true if conn == c { for _, c := range conns { alreadySubscribed := false conns := clientMap[key]func subscribe(conn *websocket.Conn, key string, clientMap map[string][]*websocket.Conn) {} return nil } } return err unsubscribeAll(conn) if err != nil { err = writeMessage(conn, websocket.TextMessage, responseData) } return err if err != nil { responseData, err := json.Marshal(response) response := Message{version, sequenceNumbers[conn], "pong", "pong", nil}