electric-sql / electric-sql/phoenix_sync

Phoenix LiveView Phoenix.Sync.LiveView.sync_stream evaluation

Open
#96 4 comments 0 reactions 0 assignees View on GitHub
Dominant language
Elixir
Stars
290
Forks
17
PR merge metrics
No merged PRs in 30d

Description

Hello 👋🏻

I'm evaluating Phoenix.Sync.LiveView.sync_stream in my Phoenix LiveView application. Particular use case I'm checking is notification stream - I want to display notifications and keep them up to date in the UI.

I'm using it in the "standard" way:

```elixir
defmodule MyWeb.MyLive do
use Phoenix.LiveView
import Phoenix.Sync.LiveView

def mount(_params, _session, socket) do
{:ok, sync_stream(socket, :todos, Todos.Todo)}
end

def handle_info({:sync, event}, socket) do
{:noreply, sync_stream_update(socket, event)}
end
end
```

After playing with it for some time, I have these observations that surprised me.

1. `dead` render always has no data in stream - it's not ideal in tests and differs from the original LiveView approach.
2. initial `live` render stream has old (sometimes very old) data. It means there's a lot of catching up to be done on each page refresh (since I'm not using client-side caching)
3. Limit query seems to be not working, it silently ignores it.

So my questions:

1. Regular phoenix applications are being "mounted" frequently, on each page navigation. Currently it means each such mount is followed by a lot of catching up, which is visible in UI. I understand it's done that way to reduce database load, but it's not ideal. **Is there an easy option to configure max snapshot age before it's refreshed**?

2. Is there a way to get similar behaviour to phoenix streams in tests? I'm asking about dead render having fresh data (without cache)

3. Is there a way to respect limit query in the initial render? `Phoenix.Sync.LiveView.sync_stream(.., ..,.., limit: 10)` doesn't seem to work.

In general, I have a feeling that `sync_stream` is promising, but not yet battle-tested utility. Which is a shame.

**What I was hoping for**:

I would love a solution that would work in the same way as "stock" phoenix live view streams

1. initial data is always "current", present for both dead and initial live render, so there's not a lot of catching up, with limits working
2. I don't have to "babysit" these streams with lots of pubsub broadcasts and subscribes, it would just stay synchronized out of the box.

All in all, I'm rooting for this project! It's really impressive how it's all working, just wanted to drop my own observations.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.