pulse-framework 0.1.68__tar.gz → 0.1.69__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/PKG-INFO +1 -1
  2. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/pyproject.toml +1 -1
  3. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/render_session.py +16 -1
  4. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/README.md +0 -0
  5. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/__init__.py +0 -0
  6. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/_examples.py +0 -0
  7. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/app.py +0 -0
  8. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/channel.py +0 -0
  9. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/cli/__init__.py +0 -0
  10. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/cli/cmd.py +0 -0
  11. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/cli/dependencies.py +0 -0
  12. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/cli/folder_lock.py +0 -0
  13. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/cli/helpers.py +0 -0
  14. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/cli/logging.py +0 -0
  15. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/cli/models.py +0 -0
  16. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/cli/packages.py +0 -0
  17. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/cli/processes.py +0 -0
  18. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/cli/secrets.py +0 -0
  19. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/cli/uvicorn_log_config.py +0 -0
  20. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/code_analysis.py +0 -0
  21. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/codegen/__init__.py +0 -0
  22. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/codegen/codegen.py +0 -0
  23. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/codegen/templates/__init__.py +0 -0
  24. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/codegen/templates/layout.py +0 -0
  25. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/codegen/templates/route.py +0 -0
  26. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/codegen/templates/routes_ts.py +0 -0
  27. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/codegen/utils.py +0 -0
  28. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/component.py +0 -0
  29. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/components/__init__.py +0 -0
  30. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/components/for_.py +0 -0
  31. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/components/if_.py +0 -0
  32. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/components/react_router.py +0 -0
  33. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/context.py +0 -0
  34. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/cookies.py +0 -0
  35. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/decorators.py +0 -0
  36. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/dom/__init__.py +0 -0
  37. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/dom/elements.py +0 -0
  38. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/dom/events.py +0 -0
  39. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/dom/props.py +0 -0
  40. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/dom/svg.py +0 -0
  41. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/dom/tags.py +0 -0
  42. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/dom/tags.pyi +0 -0
  43. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/env.py +0 -0
  44. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/forms.py +0 -0
  45. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/helpers.py +0 -0
  46. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/hooks/__init__.py +0 -0
  47. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/hooks/core.py +0 -0
  48. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/hooks/effects.py +0 -0
  49. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/hooks/init.py +0 -0
  50. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/hooks/runtime.py +0 -0
  51. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/hooks/setup.py +0 -0
  52. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/hooks/stable.py +0 -0
  53. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/hooks/state.py +0 -0
  54. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/js/__init__.py +0 -0
  55. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/js/__init__.pyi +0 -0
  56. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/js/_types.py +0 -0
  57. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/js/array.py +0 -0
  58. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/js/console.py +0 -0
  59. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/js/date.py +0 -0
  60. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/js/document.py +0 -0
  61. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/js/error.py +0 -0
  62. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/js/json.py +0 -0
  63. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/js/map.py +0 -0
  64. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/js/math.py +0 -0
  65. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/js/navigator.py +0 -0
  66. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/js/number.py +0 -0
  67. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/js/obj.py +0 -0
  68. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/js/object.py +0 -0
  69. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/js/promise.py +0 -0
  70. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/js/pulse.py +0 -0
  71. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/js/react.py +0 -0
  72. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/js/regexp.py +0 -0
  73. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/js/set.py +0 -0
  74. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/js/string.py +0 -0
  75. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/js/weakmap.py +0 -0
  76. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/js/weakset.py +0 -0
  77. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/js/window.py +0 -0
  78. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/messages.py +0 -0
  79. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/middleware.py +0 -0
  80. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/plugin.py +0 -0
  81. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/proxy.py +0 -0
  82. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/py.typed +0 -0
  83. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/queries/__init__.py +0 -0
  84. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/queries/client.py +0 -0
  85. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/queries/common.py +0 -0
  86. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/queries/effect.py +0 -0
  87. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/queries/infinite_query.py +0 -0
  88. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/queries/mutation.py +0 -0
  89. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/queries/protocol.py +0 -0
  90. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/queries/query.py +0 -0
  91. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/queries/store.py +0 -0
  92. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/react_component.py +0 -0
  93. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/reactive.py +0 -0
  94. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/reactive_extensions.py +0 -0
  95. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/renderer.py +0 -0
  96. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/request.py +0 -0
  97. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/requirements.py +0 -0
  98. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/routing.py +0 -0
  99. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/scheduling.py +0 -0
  100. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/serializer.py +0 -0
  101. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/state.py +0 -0
  102. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/test_helpers.py +0 -0
  103. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/transpiler/__init__.py +0 -0
  104. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/transpiler/assets.py +0 -0
  105. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/transpiler/builtins.py +0 -0
  106. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/transpiler/dynamic_import.py +0 -0
  107. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/transpiler/emit_context.py +0 -0
  108. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/transpiler/errors.py +0 -0
  109. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/transpiler/function.py +0 -0
  110. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/transpiler/id.py +0 -0
  111. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/transpiler/imports.py +0 -0
  112. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/transpiler/js_module.py +0 -0
  113. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/transpiler/modules/__init__.py +0 -0
  114. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/transpiler/modules/asyncio.py +0 -0
  115. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/transpiler/modules/json.py +0 -0
  116. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/transpiler/modules/math.py +0 -0
  117. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/transpiler/modules/pulse/__init__.py +0 -0
  118. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/transpiler/modules/pulse/tags.py +0 -0
  119. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/transpiler/modules/typing.py +0 -0
  120. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/transpiler/nodes.py +0 -0
  121. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/transpiler/py_module.py +0 -0
  122. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/transpiler/transpiler.py +0 -0
  123. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/transpiler/vdom.py +0 -0
  124. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/types/__init__.py +0 -0
  125. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/types/event_handler.py +0 -0
  126. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/user_session.py +0 -0
  127. {pulse_framework-0.1.68 → pulse_framework-0.1.69}/src/pulse/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pulse-framework
3
- Version: 0.1.68
3
+ Version: 0.1.69
4
4
  Summary: Pulse - Full-stack framework for building real-time React applications in Python
5
5
  Requires-Dist: websockets>=12.0
6
6
  Requires-Dist: fastapi>=0.128.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pulse-framework"
3
- version = "0.1.68"
3
+ version = "0.1.69"
4
4
  description = "Pulse - Full-stack framework for building real-time React applications in Python"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -258,6 +258,7 @@ class RenderSession:
258
258
  _pending_api: dict[str, asyncio.Future[dict[str, Any]]]
259
259
  _pending_js_results: dict[str, asyncio.Future[Any]]
260
260
  _global_states: dict[str, State]
261
+ _global_queue: list[ServerMessage]
261
262
  _tasks: TaskRegistry
262
263
  _timers: TimerRegistry
263
264
 
@@ -283,6 +284,7 @@ class RenderSession:
283
284
  self._client_address = client_address
284
285
  self._send_message = None
285
286
  self._global_states = {}
287
+ self._global_queue = []
286
288
  self.query_store = QueryStore()
287
289
  self.connected = False
288
290
  self.channels = ChannelsManager(self)
@@ -319,6 +321,10 @@ class RenderSession:
319
321
  """WebSocket connected. Set sender, don't auto-flush (attach does that)."""
320
322
  self._send_message = send_message
321
323
  self.connected = True
324
+ if self._global_queue:
325
+ for msg in self._global_queue:
326
+ send_message(msg)
327
+ self._global_queue = []
322
328
 
323
329
  def disconnect(self):
324
330
  """WebSocket disconnected. Start queuing briefly before pausing."""
@@ -333,11 +339,20 @@ class RenderSession:
333
339
 
334
340
  def send(self, message: ServerMessage):
335
341
  """Route message based on mount state."""
342
+ # Global messages (not path-specific, or navigate_to) bypass mount state.
343
+ if message.get("type") == "navigate_to":
344
+ if self._send_message:
345
+ self._send_message(message)
346
+ else:
347
+ self._global_queue.append(message)
348
+ return
336
349
  # Global messages (not path-specific) go directly if connected
337
350
  path = message.get("path")
338
351
  if path is None:
339
352
  if self._send_message:
340
353
  self._send_message(message)
354
+ else:
355
+ self._global_queue.append(message)
341
356
  return
342
357
 
343
358
  # Normalize path for lookup
@@ -441,7 +456,6 @@ class RenderSession:
441
456
 
442
457
  if mount is None or mount.state == "idle":
443
458
  # Initial render must come from prerender
444
- print(f"[DEBUG] Missing or idle route '{path}', reloading")
445
459
  self.send({"type": "reload"})
446
460
  return
447
461
 
@@ -583,6 +597,7 @@ class RenderSession:
583
597
  if not fut.done():
584
598
  fut.cancel()
585
599
  self._pending_js_results.clear()
600
+ self._global_queue = []
586
601
  self._send_message = None
587
602
  self.connected = False
588
603