func HandleClientSocket(eng *engine.Engine, conn net.Conn) { reader := bufio.NewReader(conn) writer := make(chan *message.Message, WRITE_QUEUE) kill := make(chan bool) associatedObj := object.NewObject(nil, object.DUMMY_ID) associatedObj.SetWriter(writer) defer func() { conn.Close() associatedObj.SetWriter(nil) kill <- true }() go func() { socketWriter := bufio.NewWriter(conn) for { select { case writerMsg := <-writer: _, err := socketWriter.WriteString(writerMsg.Data + "\n") if err != nil { log.Println("Unexpected error (write socket): ", err) } err = socketWriter.Flush() if err != nil { log.Println("Unexpected error (flush socket): ", err) } case <-kill: return } } }() for { rawMessage, err := reader.ReadString('\n') if err != nil { return } trimmedMessage := strings.TrimSpace(rawMessage) splitMessage := strings.SplitN(trimmedMessage, " ", 2) msg := message.MakeMutableMessage(splitMessage[0]) if len(splitMessage) > 1 { msg.Append(splitMessage[1]) } msg.Finalize() eng.Do(&associatedObj, msg) } }
func (db *Database) CreateObject() *object.Object { db.Lock() defer db.Unlock() id := db.getNextId() obj := object.NewObject(db.saver, id) return obj }
func (db *Database) getOrCreateObj(saver chan *object.SerializableObject, id object.ObjectID) *object.Object { db.Lock() defer db.Unlock() obj := db.objects[id] if obj == nil { obj = object.NewObject(saver, id) db.objects[id] = obj } return obj }
func WSConnection(eng *engine.Engine, ws *websocket.Conn) { decoder := json.NewDecoder(ws) writer := make(chan *message.Message, WRITE_QUEUE) kill := make(chan bool) associatedObj := object.NewObject(nil, object.DUMMY_ID) associatedObj.SetWriter(writer) defer func(o *object.Object) { associatedObj.SetWriter(nil) kill <- true }(associatedObj) go func() { encoder := json.NewEncoder(ws) for { select { case writerMsg := <-writer: err := encoder.Encode(writerMsg) if err != nil { log.Println("Unexpected error (encode JSON): ", err) } case <-kill: return } } }() for { readerMsg := &message.Message{} err := decoder.Decode(readerMsg) if err != nil { if err != io.EOF { log.Println("Unexpected error (decode JSON): ", err) } return } readerMsg.Finalize() eng.Do(&associatedObj, readerMsg) } }