Movim 0.19 - Ikeya is out!
Timothée Jaussoin · pubsub.movim.eu / Movim · Saturday, 20 February, 2021 - 21:58 edit · 7 minutes
This version is a major step for Movim with a lot of improvements on the performances and many (many!) small fixes and new features.
Chat and chatrooms
A criticism that was coming once in a while is how difficult it was to join and/or create a chatroom in Movim. The 0.19 version follow the Modern XMPP Multi-user Chats recommendations that is already implemented in several other XMPP clients. This standard is bringing a common naming convention and flow to create and configure chatrooms in XMPP.
On top of that the join/create chatroom flow was completely redesigned. The new one is inspired by the Telegram one, with one unique "+" button to start a new one-to-one or one-to-many conversation. The global chatroom search was also directly integrated in the flow to allow you to quickly search and join one of the few thousands already listed ones.
The one-to-one chat conversations views are now cached server side. This simple trick is saving some precious milliseconds during the page load. The performance boost allowed us to simply remove the chat list placeholder (you don't need a placeholder if the content is loading instantly).
The encrypted messages are now displayed in the bubbles.
You can receive messages read confirmation in group chats and in small channels (when there are less than 10 persons connected).
XEP-0201: "Best Practices for Message Threads" has been implemented. Now Movim handles replies on received messages. Useful to follow multiple topics during a conversation.
Like images before, now videos are also embedded in conversations with the support of the WebM and H264 video format.
With this awesome feature, the Tenor API was also integrated. You can now search in millions of GIFs and publish them instantly in your conversations. The Tenor API is disabled by default, the server administrator can enable it by adding its custom API key in the Movim admin panel.
All the published message URLs are also now embedded in the discussions. Now you can also easily browse the URL related pictures directly in the Movim picture preview gallery widget.
Chat rooms with unread messages are put on top of the chat rooms list now.
A package of ~1500 new emojis were added to the emoji picker.
Communities and blogs
The explore page was reorganized with a few new features. You can now filter the explore panel to return only the communities or blog articles (the same way you can filter the articles on the news page). A "More" button is also now allowing you to retrieve older articles.
The communities on the servers are now ordered by last updated.
The preview widget is now having a "copy to clipboard" button. Useful!
There is a first integration of the Firebase Push notifications in Movim. This is currently in test with the Android app and will require some more improvements and adjustments before being released as a stable feature.
You can now directly drag & drop files or copy & paste pictures in Movim to trigger the upload dialog box.
Lets now dive in the more technical aspects with the performances improvements.
Most of the performances bump in Ikeya are actually regarding how he database is requested. In the previous Movim version, a presence buffer was introduced to save "batches" of incoming requests in one database query and not hundred of them.
The presence is a core concept of XMPP (eXtensible Messaging and Presence Protocol). During the connection, you will receive a presence from each online contact from your contact list, similarly, when you join a chatroom, you will as well receive a presence for each member connected to the room.
So now imagine that you have a big account, with hundreds of contacts and a few dozen chat rooms with hundreds of connected users in each of them. During the login, your XMPP client will then receive thousands of presences. The presence buffer is there to "stack them" when they are received and save them in batches in the database and then notifies the UI (your browser) only once that "all those presences were saved".
This presence buffer element was greatly improved and will not only save the presences in batches now, but also handle some related data like capabilities requests (those information are used to know what your contacts XMPP clients are capable of) as well as vcard requests (your contact personal information and avatars).
In a similar aspect, the retrieved bookmarked conferences and community subscriptions are also now saved in batches in the database, saving dozens of requests.
Another important optimisation that can be done when dealing with databases is to preload some information when retrieving list of items. Lets imagine that you need to retrieve 50 messages from the database. Those messages might have related data, such as reactions, replies or attached files. It is often good to load in parallel all those data "in batches".
The wrong way
1. Get the messages A, B, E and F
2. Process the messages
- Check if A has an attached file
- Check if B has an attached file
The good way
1. Get the messages A, B, E and F
2. Try to get files for the A, B, E and F messages
3. Once the two lists are retrieved, see if some files matches the messages
This was already done in many places in Movim (hopefully), but even after years we are still finding some small improvements that were missing. All those small improvements are now allowing Movim to retrieve full conversations and scroll the history in a few hundred milliseconds, even if the database is filled with millions of messages.
Database connection auto-close
Each connected user on a Movim instance is having it's own specific process launched on the server. This is bringing some nice isolation and performances distribution, especially on servers with many parallel available threads (this also brings some memory consumption issues that will be improved in the upcoming versions).
For each of those launched "user-session-processes" a database connection was opened to allow them to perform database queries quickly.
The main issue there is that database servers (such as MySQL and PostgreSQL, the two supported servers for Movim) can only handle a certain limit of parallel connections. Movim is then now automatically closing unused connections after a few seconds and resume them once a new query is sent. This allows Movim to handle hundreds of parallel sessions without overloading the database server anymore.
The languages translations are now cached when the daemon is launched once for all. This brings a few milliseconds gain during page load. It's not much but it's an easy win!
The translations can also be manually recompiled using the following command
php daemon.php compileLanguages
Picture proxyfying and caching
Most of the Movim pictures are now proxyfied by Movim. This way the Movim pod will hide its users personal IPs and browser information when the pictures are retrieved. The proxy is also moving all the pictures URL under a specific
picture/ directory. This simple trick allows server admins to create a nice caching system directly on the web-server level.
For example, if a friend in a chatroom is sharing a nice picture that is a bit heavy. The first person that will receive the picture will ask Movim, through the Movim web-server to download it and return an optimized version of it. The web-server will then keep a copy of the optimized picture. All the other users will then ask the same resource, and the web-server will simply return the cached version, without even asking anything to Movim anymore.
A specific section in the Movim setup tutorial was added to explain you how to setup and configure this cache system during the Movim deployment.
This was quite a big version indeed, we hope that you will enjoy it. The upcoming one will be a special release and will focus on one specific feature. We will come back to it in the upcoming weeks, be patient.
As always, if you like Movim please share it around. You can always help us by directly contributing to the project and help funding us on our Patreon.
That's all folks!