1
0
Эх сурвалжийг харах

Revert 0c841bd1439c3259d566836d0cd233911784811e

Falko Schindler 2 жил өмнө
parent
commit
57c3432d6b

+ 2 - 6
nicegui/client.py

@@ -53,10 +53,6 @@ class Client:
     def ip(self) -> Optional[str]:
         return self.environ.get('REMOTE_ADDR') if self.environ else None
 
-    @property
-    def room(self) -> str:
-        return globals._current_socket_ids[-1] if globals._use_current_socket[-1] else self.id
-
     @property
     def has_socket_connection(self) -> bool:
         return self.environ is not None
@@ -103,7 +99,7 @@ class Client:
             'code': code,
             'request_id': request_id if respond else None,
         }
-        create_task(globals.sio.emit('run_javascript', command, room=self.room))
+        create_task(globals.sio.emit('run_javascript', command, room=self.id))
         if not respond:
             return None
         deadline = time.time() + timeout
@@ -115,4 +111,4 @@ class Client:
 
     def open(self, target: Union[Callable, str]) -> None:
         path = target if isinstance(target, str) else globals.page_routes[target]
-        create_task(globals.sio.emit('open', path, room=self.room))
+        create_task(globals.sio.emit('open', path, room=self.id))

+ 2 - 2
nicegui/element.py

@@ -168,13 +168,13 @@ class Element(ABC, Visibility):
             return
         ids = self.collect_descendant_ids()
         elements = {id: self.client.elements[id].to_dict() for id in ids}
-        create_task(globals.sio.emit('update', {'elements': elements}, room=self.client.room))
+        create_task(globals.sio.emit('update', {'elements': elements}, room=self.client.id))
 
     def run_method(self, name: str, *args: Any) -> None:
         if not globals.loop:
             return
         data = {'id': self.id, 'name': name, 'args': args}
-        create_task(globals.sio.emit('run_method', data, room=self.client.room))
+        create_task(globals.sio.emit('run_method', data, room=globals._socketio_id or self.client.id))
 
     def clear(self) -> None:
         descendants = [self.client.elements[id] for id in self.collect_descendant_ids()[1:]]

+ 12 - 0
nicegui/elements/scene.js

@@ -134,9 +134,21 @@ export default {
 
     this.texture_loader = new THREE.TextureLoader();
     this.stl_loader = new THREE.STLLoader();
+
+    this.is_initialized = false;
+    const sendConnectEvent = async () => {
+      if (window.socket.id === undefined) return;
+      if (!this.is_initialized) {
+        this.$emit("connect", window.socket.id);
+      } else clearInterval(connectInterval);
+    };
+    const connectInterval = setInterval(sendConnectEvent, 100);
   },
 
   methods: {
+    init() {
+      this.is_initialized = true;
+    },
     create(type, id, parent_id, ...args) {
       let mesh;
       if (type == "group") {

+ 8 - 5
nicegui/elements/scene.py

@@ -1,11 +1,10 @@
 from dataclasses import dataclass
 from typing import Callable, Dict, List, Optional, Union
 
-from .. import globals
 from ..dependencies import register_component
 from ..element import Element
 from ..events import SceneClickEventArguments, SceneClickHit, handle_event
-from ..functions.lifecycle import on_connect
+from ..globals import socketio_id
 from .scene_object3d import Object3D
 from .scene_objects import Scene as SceneObject
 
@@ -72,14 +71,18 @@ class Scene(Element):
         self.stack: List[Union[Object3D, SceneObject]] = [SceneObject()]
         self.camera: SceneCamera = SceneCamera()
         self.on_click = on_click
+        self.on('connect', self.handle_connect)
         self.on('click3d', self.handle_click)
-        on_connect(self.handle_connect)
 
-    def handle_connect(self) -> None:
-        with globals.current_socket():
+    def handle_connect(self, x) -> None:
+        if not 'args' in x:
+            raise Exception('no args')
+        with socketio_id(x['args']):
+            self.run_method('init')
             self.move_camera(duration=0)
             for object in self.objects.values():
                 object.send()
+        return 'bam2'
 
     def handle_click(self, msg: Dict) -> None:
         arguments = SceneClickEventArguments(

+ 1 - 1
nicegui/functions/notify.py

@@ -24,4 +24,4 @@ def notify(message: str, *,
     Note: You can pass additional keyword arguments according to `Quasar's Notify API <https://quasar.dev/quasar-plugins/notify#notify-api>`_.
     """
     options = {key: value for key, value in locals().items() if not key.startswith('_') and value is not None}
-    create_task(globals.sio.emit('notify', options, room=globals.get_client().room))
+    create_task(globals.sio.emit('notify', options, room=globals.get_client().id))

+ 4 - 11
nicegui/globals.py

@@ -36,12 +36,11 @@ dark: Optional[bool]
 binding_refresh_interval: float
 excludes: List[str]
 socket_io_js_extra_headers: Dict = {}
+_socketio_id: Optional[str] = None
 
 slot_stacks: Dict[int, List['Slot']] = {}
 clients: Dict[str, 'Client'] = {}
 index_client: 'Client'
-_current_socket_ids: List[str] = []
-_use_current_socket: List[bool] = [False]
 
 page_routes: Dict[Callable, str] = {}
 tasks: List[asyncio.tasks.Task] = []
@@ -80,13 +79,7 @@ def get_client() -> 'Client':
 
 @contextmanager
 def socketio_id(id: str) -> None:
-    _current_socket_ids.append(id)
+    global _socketio_id
+    _socketio_id = id
     yield
-    _current_socket_ids.pop()
-
-
-@contextmanager
-def current_socket() -> None:
-    _use_current_socket.append(True)
-    yield
-    _use_current_socket.pop()
+    _socketio_id = None

+ 2 - 3
nicegui/nicegui.py

@@ -92,9 +92,8 @@ async def handle_handshake(sid: str) -> bool:
         return False
     client.environ = sio.get_environ(sid)
     sio.enter_room(sid, client.id)
-    with globals.socketio_id(sid):
-        for t in client.connect_handlers:
-            safe_invoke(t, client)
+    for t in client.connect_handlers:
+        safe_invoke(t, client)
     return True