Message received, dispatch
(raw []byte)
| 148 | |
| 149 | // Message received, dispatch |
| 150 | func (s *Session) dispatch(raw []byte) { |
| 151 | var msg ClientComMessage |
| 152 | |
| 153 | log.Printf("Session.dispatch got '%s' from '%s'", raw, s.remoteAddr) |
| 154 | |
| 155 | timestamp := time.Now().UTC().Round(time.Millisecond) |
| 156 | if err := json.Unmarshal(raw, &msg); err != nil { |
| 157 | // Malformed message |
| 158 | log.Println("Session.dispatch: " + err.Error()) |
| 159 | s.QueueOut(ErrMalformed("", "", timestamp)) |
| 160 | return |
| 161 | } |
| 162 | |
| 163 | msg.from = s.uid.UserId() |
| 164 | msg.timestamp = timestamp |
| 165 | |
| 166 | // Locking-unlocking is needed for long polling. |
| 167 | // Should not affect performance |
| 168 | s.rw.Lock() |
| 169 | defer s.rw.Unlock() |
| 170 | |
| 171 | switch { |
| 172 | case msg.Pub != nil: |
| 173 | s.publish(&msg) |
| 174 | log.Println("dispatch: Pub done") |
| 175 | |
| 176 | case msg.Sub != nil: |
| 177 | s.subscribe(&msg) |
| 178 | log.Println("dispatch: Sub done") |
| 179 | |
| 180 | case msg.Leave != nil: |
| 181 | s.leave(&msg) |
| 182 | log.Println("dispatch: Leave done") |
| 183 | |
| 184 | case msg.Login != nil: |
| 185 | s.login(&msg) |
| 186 | log.Println("dispatch: Login done") |
| 187 | |
| 188 | case msg.Get != nil: |
| 189 | s.get(&msg) |
| 190 | log.Println("dispatch: Get." + msg.Get.What + " done") |
| 191 | |
| 192 | case msg.Set != nil: |
| 193 | s.set(&msg) |
| 194 | log.Println("dispatch: Set." + msg.Set.What + " done") |
| 195 | |
| 196 | case msg.Del != nil: |
| 197 | s.del(&msg) |
| 198 | log.Println("dispatch: Del." + msg.Del.What + " done") |
| 199 | |
| 200 | case msg.Acc != nil: |
| 201 | s.acc(&msg) |
| 202 | log.Println("dispatch: Acc done") |
| 203 | |
| 204 | default: |
| 205 | // Unknown message |
| 206 | s.QueueOut(ErrMalformed("", "", msg.timestamp)) |
| 207 | log.Println("Session.dispatch: unknown message") |