anchor.diff:                      logVerbose (sprintf "Unknown command: %s" cmd)
                       state
   
  -            logVerbose "Let's loop"
               return! handlePacket newState socket
           | None ->
  -            logVerbose "None received, it's the end !"
  +            let userName = defaultArg state.userName "???"
  +            logVerbose (sprintf "[%A] LEAVE" userName)
               match state.userName with
               | Some userName ->
                   Interlocked.Decrement(&userCount) |> ignore
  -                socket.Broadcast { Packet.ofType Event with Data = [ JToken.FromObject("user left"); JToken.FromObject({ UserJoinedEvent.username = userName; numUsers = userCount })] }
  +                socket.Broadcast (chatPacket "user left" { UserJoinedEvent.username = userName; numUsers = userCount })
               | None -> ()
               return ()
       }
   
       let app =
           choose [
  -            //serveEngineIo { EngineIoConfig.empty with Path = "/socket.io/"; InitialPackets = initialPackets }
               socketio (handlePacket State.empty)
  -            // serveSocketIo emptySocketIoConfig
               GET >=> choose [
                   browseHome
               
  
positive.code:                     | None ->
                          let userName = packet.Data.[1].ToObject<string>()
                          Interlocked.Increment(&userCount) |> ignore
                          socket.Broadcast (chatPacket "user joined" { UserJoinedEvent.username = userName; numUsers = userCount })
                          socket.Send (chatPacket "login" { UserJoinedEvent.username = userName; numUsers = userCount })
                          { state with userName = Some userName }
  
negative.code:         let! p = socket.Receive()
          match p with
          | Some packet ->
              match packet.EventId with
              | Some id -> socket.Send({ Packet.ofType Ack with EventId = Some id })
              | None -> ()
  