One of the main challenges related to web development is maintaining state across the client and the server and most web applications have to solve this somehow. Because of this reason, so-called sync engines have become available as they can own a large part of data synchronization.
In his MSc thesis, my student Mikael Siidorow looked into the space to find out the limits of generalized sync. He did his study through multiple methods including literature review, interviews, and a case study. In the end he came up with a taxonomy showing where generalized sync breaks and what you have to keep in mind when implementing these solutions.
This is not to say sync engines are useless, but that there are clear tradeoffs to consider when introducing them to your codebase especially if you have to deal with an offline requirement.