-
Notifications
You must be signed in to change notification settings - Fork 139
Description
Hi!
I would like to propose some improvement for the initial avatar system. This issue is created in order to discuss around the subject.
Context
The endpoints /public/avatar
and /:sharing-id/recipients/:index/avatar
are both used to retrieve a user avatar. Those avatar pic are png files with a round of color and 1 or 2 letters in it. They are looking a lot like the ones generated by this service.
Those endpoints are called to illustrate the users avatar inside the "Share" column in drive and inside the "Share" pop-in used to manage the sharing rules.
In order to generate those png files the convert
binary from ImageMagick is called and then cached inside a cache service in order to improve the performances.
Issue
IMHO there is several issues with this process that can be improved:
- Using the
convert
binary force a external dependency to ImageMagick and this is a really big library. - The
convert
command need a write/read into the filesystem and so it require an access to the filesystem. - The call to an external binary and the access to the FS cost a lot in CPU and time. This is why a cache is required.
- The PNG format use rasterization which can be relatively heavy compared to another encodings
Proposed improvements
Do not use those endpoints
You already have a component in you ui librairy that does generate icons without any call to the server. This could be the easiest way to remove an http call, reduce the load on server side and reduce the latency on client side.
Use ajstarks/svgo in order to render an svg
After some tests I have successfully replaced the png generation with convert
by the use of a full Go natif library generating an svg. Those change seems to resolve all the issues listed above:
- There is no need to use the
convert
binary anymore so no more dependencies. - There is no more need to access the filesysteme.
- The performances are greatly improved, to the point that I guess the cache would not be required anymore
- By using SVG format I have successfully reduced the icon size from 3.3KB for the PNG file to 303B for the SVG.
Bonus point: With the SVG format you are using vectorization so your icon would have a perfect resolution whatever the size.
If you are interested I can propose you a PR with a "svgo" implementation for the initial generation.