Skip to content

Commit a030ae6

Browse files
authored
fix generate_data to do trace render loop for web sockets (#1345)
1 parent 5e2e6e7 commit a030ae6

File tree

2 files changed

+17
-5
lines changed

2 files changed

+17
-5
lines changed

mesop/runtime/context.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ def __init__(
116116
self._previous_states: dict[type[Any], object] = copy.deepcopy(states)
117117
self._handlers: dict[str, Handler] = {}
118118
self._commands: list[pb.Command] = []
119+
self._has_rendered: bool = False
119120
self._viewport_size: pb.ViewportSize | None = None
120121
self._theme_settings: pb.ThemeSettings | None = None
121122
self._js_modules: set[str] = set()
@@ -146,6 +147,12 @@ def js_modules(self) -> set[str]:
146147
def clear_js_modules(self):
147148
self._js_modules = set()
148149

150+
def has_rendered(self) -> bool:
151+
return self._has_rendered
152+
153+
def set_has_rendered(self, has_rendered: bool) -> None:
154+
self._has_rendered = has_rendered
155+
149156
def query_params(self) -> dict[str, list[str]]:
150157
return self._query_params
151158

mesop/server/server.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ def render_loop(
130130
],
131131
)
132132
)
133+
runtime().context().set_has_rendered(True)
133134
yield serialize(data)
134135
except Exception as e:
135136
logging.error(e)
@@ -205,16 +206,20 @@ def generate_data(ui_request: pb.UiRequest) -> Generator[str, None, None]:
205206
runtime().context().set_viewport_size(event.viewport_size)
206207
runtime().context().initialize_query_params(event.query_params)
207208

208-
if not MESOP_WEBSOCKETS_ENABLED:
209+
if (
210+
not MESOP_WEBSOCKETS_ENABLED or not runtime().context().has_rendered()
211+
):
209212
if event.states.states:
210213
runtime().context().update_state(event.states)
211214
else:
212215
runtime().context().restore_state_from_session(event.state_token)
213216

214-
# In websockets mode, we don't need to do a trace render loop because
215-
# the context instance is long-lived and contains all the registered
216-
# event handlers from the last render loop.
217-
if not MESOP_WEBSOCKETS_ENABLED:
217+
# In websockets mode, since the context instance is long-lived, we only
218+
# need to do a trace render loop if the context has not completed at least
219+
# one render loop.
220+
if (
221+
not MESOP_WEBSOCKETS_ENABLED or not runtime().context().has_rendered()
222+
):
218223
for _ in render_loop(path=ui_request.path, trace_mode=True):
219224
pass
220225
if ui_request.user_event.handler_id:

0 commit comments

Comments
 (0)