internal void HandlePacket(Packet packet)
        {
            Action <string> ack = args => m_socket.SendPacket(new Packet {
                Type = PacketType.Ack, Args = args, AckId = packet.Id
            });

            switch (packet.Type)
            {
            case PacketType.Connect:
                EmitLocally("connect");
                break;

            case PacketType.Disconnect:
                EmitLocally("disconnect", packet.Reason);
                break;

            case PacketType.Message:
            case PacketType.Json:
                if (packet.Ack != null && packet.Ack != "data")
                {
                    ack(null);
                }

                EmitLocally("message", packet.Data, packet.Ack == "data" ? ack : null);
                break;

            case PacketType.Event:
                var args = JsonConvert.DeserializeObject <object[]>(packet.Args);

                EmitLocally(packet.Name, args, packet.Ack == "data" ? ack : null);
                break;

            case PacketType.Ack:
                if (m_acks.ContainsKey(packet.AckId))
                {
                    var ackToCall = m_acks[packet.AckId];
                    m_acks.Remove(packet.AckId);
                    ackToCall(packet.Args);
                }
                break;

            case PacketType.Error:
                EmitLocally(packet.Reason == "unauthorized" ? "connect_failed" : "error", packet.Reason);
                break;
            }
        }