clemensm

clemensm

How to enable compression for LiveView diffs

Hi everyone

I’m currently developing an app using Phoenix LiveView, and we’ve got one component (search) where we’ve got to push rather large chanes over the wire (html up to ca. 700kB).

When I was checking on how we could speed the transfer of this up I realized that the websocket does not seem to use compression for the diffs, is there a way to turn this on? I’ve looked around on the web, and setting:

x_web/config/prod.exs
config x_web, XWeb.Endpoint,
  http: [compress: true ...]

does not seem to help. This will compress the http requests, but the diffs over the Websocket seem to be still uncompressed.

I’ve tested this using Firefox and Chrome, and have the same result in both environments (using Phoenix 1.5, LiveView 0.14.1, cowboy 2.8.0)

Thanks for the help

Marked As Solved

clemensm

clemensm

Ok, found it after digging through the documentation in depth. Just enable the compress=true in the socket, like for any other channel, the setting is then passed along to cowboy.

I.e. in your endpoint.ex, do this:

socket "/live", Phoenix.LiveView.Socket, websocket: [compress: compress]

And here ist the documentation for it.

Also Liked

drathier

drathier

Old post, but phoenix dashboard total input / total output clearly shows that compression works :slight_smile: Sending 1MB of test data roundtrip results in just over a 1MB increase in those numbers with compression off, and about 110kB with compression on. Browsers still completely hide whether or not compression was used.

  socket "/my-socket", MyWeb.MySocket,
   longpoll: true,
   websocket: [compress: true]
clemensm

clemensm

Sadly I’ve found no way to measure the size, all browsers seem to display only the size of the uncompressed message.

However I was able to “somewhat” measure the reduced time. Messages took roughly 450 ms to deliver before (I knew that ~150ms where spend on the server on the actual logic), and times are now down to ~200ms. So seems to be working as expected.

ndrean

ndrean

[See correction below]

I send a 1.1MB payload - a JSON string - from the server via a pushEvent along the liveSocket.
The network/socket shows that I send indeed 1.1MB.
To inspect the “real” size, I inspect the loopback with Wireshark.
Without compress: true, I see 70 TCP packets × ~16 KB = ~1.1 MB. No compression is applied.
Digging further, I should see RSV1 bit should be set 1, but Wireshark displays nothing.
This confirms that Bandit does only negotiate but does not apply any compression at all on the frames
So how do you see your results above?

Edit. :double_exclamation_mark: When you do set “compress”, I see that 18 packets have been sent for a length of 276kB. This means that Bandit compression correctly.

Where Next?

Popular in Questions Top

sergio
In Ruby, I can go: User.find_by(email: "foobar@email.com").update(email: "hello@email.com") How can I do something similar in Elixir? ...
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
mgjohns61585
Could someone help me? I’m making my first elixir program, number guessing game. I can’t figure out how to convert the user’s guess from ...
New
JulienCorb
I am trying to implement my new.html.eex file to create new posts on my website. new.html.eex: <h1>Create Post</h1> <%= ...
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
script
If I have a string “1000 cfu/ml” . I want to remove the characters and / and space . So the string is like this "1000" What is the ...
New
komlanvi
Hi everyone, I was playing with phoenix liveView but I run into an issue. I have a form and want to validate each input text when the te...
New
hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" => #BSON.ObjectId<58eb1a7a9ad169198c3dXXXX>, "email" => ...
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New

Other popular topics Top

vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
TunkShif
This post is an instruction guide to help you setup your Neovim for Elixir development from scratch. It includes general information on h...
274 41539 114
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod – where is this set? Thanks.
New
chrismccord
Phoenix 1.4.0 released Phoenix 1.4 is out! This release ships with exciting new features, most notably with HTTP2 support, improved deve...
688 30877 112
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
gausby
I asked this very same question on twitter and got some interesting feedback, but I thought it would be a good question to ask here as we...
1207 39297 209
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
Qqwy
Update: How to use the Blogs & Podcasts section You can post links to your blog posts or podcasts either in one of the Official Blog...
3271 126479 1222
New

We're in Beta

About us Mission Statement