phystack-hub-client 0.2.5__tar.gz → 0.2.7__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 (24) hide show
  1. {phystack_hub_client-0.2.5 → phystack_hub_client-0.2.7}/PKG-INFO +7 -6
  2. {phystack_hub_client-0.2.5 → phystack_hub_client-0.2.7}/pyproject.toml +17 -6
  3. {phystack_hub_client-0.2.5 → phystack_hub_client-0.2.7}/src/phystack/hub_client/services/phyhub_connection.py +61 -3
  4. {phystack_hub_client-0.2.5 → phystack_hub_client-0.2.7}/.gitignore +0 -0
  5. {phystack_hub_client-0.2.5 → phystack_hub_client-0.2.7}/README.md +0 -0
  6. {phystack_hub_client-0.2.5 → phystack_hub_client-0.2.7}/examples/browser_test_backend.py +0 -0
  7. {phystack_hub_client-0.2.5 → phystack_hub_client-0.2.7}/scripts/python-node-test.sh +0 -0
  8. {phystack_hub_client-0.2.5 → phystack_hub_client-0.2.7}/scripts/webrtc-test.sh +0 -0
  9. {phystack_hub_client-0.2.5 → phystack_hub_client-0.2.7}/src/phystack/hub_client/__init__.py +0 -0
  10. {phystack_hub_client-0.2.5 → phystack_hub_client-0.2.7}/src/phystack/hub_client/client.py +0 -0
  11. {phystack_hub_client-0.2.5 → phystack_hub_client-0.2.7}/src/phystack/hub_client/instances/__init__.py +0 -0
  12. {phystack_hub_client-0.2.5 → phystack_hub_client-0.2.7}/src/phystack/hub_client/instances/base_instance.py +0 -0
  13. {phystack_hub_client-0.2.5 → phystack_hub_client-0.2.7}/src/phystack/hub_client/instances/edge_instance.py +0 -0
  14. {phystack_hub_client-0.2.5 → phystack_hub_client-0.2.7}/src/phystack/hub_client/instances/peripheral_instance.py +0 -0
  15. {phystack_hub_client-0.2.5 → phystack_hub_client-0.2.7}/src/phystack/hub_client/services/__init__.py +0 -0
  16. {phystack_hub_client-0.2.5 → phystack_hub_client-0.2.7}/src/phystack/hub_client/services/signals.py +0 -0
  17. {phystack_hub_client-0.2.5 → phystack_hub_client-0.2.7}/src/phystack/hub_client/services/webrtc/__init__.py +0 -0
  18. {phystack_hub_client-0.2.5 → phystack_hub_client-0.2.7}/src/phystack/hub_client/services/webrtc/data_channel.py +0 -0
  19. {phystack_hub_client-0.2.5 → phystack_hub_client-0.2.7}/src/phystack/hub_client/services/webrtc/media_stream.py +0 -0
  20. {phystack_hub_client-0.2.5 → phystack_hub_client-0.2.7}/src/phystack/hub_client/twin_messaging.py +0 -0
  21. {phystack_hub_client-0.2.5 → phystack_hub_client-0.2.7}/src/phystack/hub_client/twin_registry.py +0 -0
  22. {phystack_hub_client-0.2.5 → phystack_hub_client-0.2.7}/src/phystack/hub_client/types/__init__.py +0 -0
  23. {phystack_hub_client-0.2.5 → phystack_hub_client-0.2.7}/src/phystack/hub_client/types/twin_types.py +0 -0
  24. {phystack_hub_client-0.2.5 → phystack_hub_client-0.2.7}/tests/test_communication.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: phystack-hub-client
3
- Version: 0.2.5
3
+ Version: 0.2.7
4
4
  Summary: Python client for PhyHub - events, actions, DataChannel, and MediaStream
5
5
  Project-URL: Homepage, https://github.com/phystack/phystack-pypi
6
6
  Project-URL: Documentation, https://docs.phystack.com
@@ -15,11 +15,12 @@ Classifier: Programming Language :: Python :: 3.10
15
15
  Classifier: Programming Language :: Python :: 3.11
16
16
  Classifier: Programming Language :: Python :: 3.12
17
17
  Requires-Python: >=3.10
18
- Requires-Dist: aiohttp>=3.9.0
19
- Requires-Dist: aiortc>=1.6.0
20
- Requires-Dist: numpy>=1.24.0
21
- Requires-Dist: opencv-python>=4.8.0
22
- Requires-Dist: python-socketio[asyncio-client]>=5.10.0
18
+ Requires-Dist: aiohttp<4.0.0,>=3.9.0
19
+ Requires-Dist: aiortc<2.0.0,>=1.6.0
20
+ Requires-Dist: numpy<3.0.0,>=1.24.0
21
+ Requires-Dist: opencv-python<5.0.0,>=4.8.0
22
+ Requires-Dist: python-engineio<4.12.0,>=4.9.0
23
+ Requires-Dist: python-socketio[asyncio-client]<5.12.0,>=5.11.0
23
24
  Provides-Extra: dev
24
25
  Requires-Dist: black>=23.0.0; extra == 'dev'
25
26
  Requires-Dist: mypy>=1.5.0; extra == 'dev'
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "phystack-hub-client"
7
- version = "0.2.5"
7
+ version = "0.2.7"
8
8
  description = "Python client for PhyHub - events, actions, DataChannel, and MediaStream"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -22,11 +22,22 @@ classifiers = [
22
22
  "Programming Language :: Python :: 3.12",
23
23
  ]
24
24
  dependencies = [
25
- "python-socketio[asyncio_client]>=5.10.0",
26
- "aiohttp>=3.9.0",
27
- "aiortc>=1.6.0",
28
- "opencv-python>=4.8.0",
29
- "numpy>=1.24.0",
25
+ # Pinned to narrow ranges tested against the PhyOS hub socket.io server
26
+ # (socket.io 4.8.1 / engine.io 6.6.4). python-engineio 4.12+ has a bug
27
+ # in the WebSocket upgrade error path: _connect_websocket can pass a
28
+ # WebSocketError object into the packet decoder, causing
29
+ # "TypeError: object of type 'WebSocketError' has no len()".
30
+ "python-socketio[asyncio_client]>=5.11.0,<5.12.0",
31
+ "python-engineio>=4.9.0,<4.12.0",
32
+ # aiohttp 4.x is an announced future breaking release; cap below it.
33
+ "aiohttp>=3.9.0,<4.0.0",
34
+ # aiortc has had minor-version API breaks; cap at next major.
35
+ "aiortc>=1.6.0,<2.0.0",
36
+ # opencv-python 5.x is not released yet; cap at next major.
37
+ "opencv-python>=4.8.0,<5.0.0",
38
+ # numpy 2.0 was a large ABI change. Allow 2.x but cap before the next
39
+ # unreleased major to avoid surprise breaks.
40
+ "numpy>=1.24.0,<3.0.0",
30
41
  ]
31
42
 
32
43
  [project.optional-dependencies]
@@ -182,14 +182,33 @@ class PhyHubConnection:
182
182
  return self._sio
183
183
 
184
184
  mode = self.config.mode
185
+
186
+ # Debug: log versions of key libraries for connection troubleshooting
187
+ try:
188
+ import socketio as _sio_mod
189
+ import engineio as _eio_mod
190
+ import aiohttp as _aiohttp_mod
191
+ print(
192
+ f"[PhyHubConnection] Library versions: "
193
+ f"python-socketio={_sio_mod.__version__}, "
194
+ f"python-engineio={_eio_mod.__version__}, "
195
+ f"aiohttp={_aiohttp_mod.__version__}"
196
+ )
197
+ except Exception as _e:
198
+ print(f"[PhyHubConnection] Could not read lib versions: {_e}")
199
+
185
200
  print(f"[PhyHubConnection] Connecting to {self.config.url} ({mode.value} mode)")
201
+ print(f"[PhyHubConnection] Instance ID: {self.config.instance_id!r}")
202
+ print(f"[PhyHubConnection] Device ID: {self.config.device_id!r}")
186
203
 
204
+ # Enable verbose logging from socketio and engineio to trace the
205
+ # handshake and packet flow during connection troubleshooting.
187
206
  self._sio = socketio.AsyncClient(
188
207
  reconnection=True,
189
208
  reconnection_attempts=5,
190
209
  reconnection_delay=1,
191
- logger=False,
192
- engineio_logger=False,
210
+ logger=True,
211
+ engineio_logger=True,
193
212
  )
194
213
 
195
214
  self._connect_event = asyncio.Event()
@@ -198,6 +217,14 @@ class PhyHubConnection:
198
217
  async def connect() -> None:
199
218
  self._connected = True
200
219
  print("[PhyHubConnection] Connected successfully")
220
+ try:
221
+ print(
222
+ f"[PhyHubConnection] Namespaces on client: {list(self._sio.namespaces)}; "
223
+ f"Session ID: {self._sio.get_sid()!r}; "
224
+ f"Transport: {self._sio.transport()!r}"
225
+ )
226
+ except Exception as _e:
227
+ print(f"[PhyHubConnection] Could not read post-connect state: {_e}")
201
228
  if self._connect_event:
202
229
  self._connect_event.set()
203
230
 
@@ -208,7 +235,7 @@ class PhyHubConnection:
208
235
 
209
236
  @self._sio.event
210
237
  async def connect_error(data: Any) -> None:
211
- print(f"[PhyHubConnection] Connection error: {data}")
238
+ print(f"[PhyHubConnection] Connection error: {data!r}")
212
239
  if self._connect_event:
213
240
  self._connect_event.set()
214
241
 
@@ -224,15 +251,36 @@ class PhyHubConnection:
224
251
  auth = {"instanceId": self.config.instance_id}
225
252
  timeout = 3 if mode == ConnectionMode.SIMULATOR else 5
226
253
 
254
+ print(
255
+ f"[PhyHubConnection] Auth payload: {auth!r}; "
256
+ f"Connect wait_timeout={timeout}s"
257
+ )
258
+
227
259
  try:
260
+ print("[PhyHubConnection] Calling self._sio.connect()...")
228
261
  await self._sio.connect(
229
262
  self.config.url,
230
263
  auth=auth,
231
264
  wait_timeout=timeout,
232
265
  )
266
+ print("[PhyHubConnection] self._sio.connect() returned successfully")
267
+ try:
268
+ print(
269
+ f"[PhyHubConnection] Post-connect state: "
270
+ f"connected={self._sio.connected}, "
271
+ f"namespaces={list(self._sio.namespaces)}, "
272
+ f"transport={self._sio.transport()!r}"
273
+ )
274
+ except Exception as _e:
275
+ print(f"[PhyHubConnection] Could not read post-connect state: {_e}")
233
276
 
234
277
  # Wait for connection confirmation
278
+ print(f"[PhyHubConnection] Waiting for connect event (timeout={timeout}s)...")
235
279
  await asyncio.wait_for(self._connect_event.wait(), timeout=float(timeout))
280
+ print(
281
+ f"[PhyHubConnection] Connect event received. "
282
+ f"self._connected={self._connected}"
283
+ )
236
284
 
237
285
  if not self._connected:
238
286
  raise ConnectionError("Failed to connect to PhyHub")
@@ -240,9 +288,19 @@ class PhyHubConnection:
240
288
  return self._sio
241
289
 
242
290
  except asyncio.TimeoutError:
291
+ print(
292
+ "[PhyHubConnection] asyncio.TimeoutError waiting for connect event "
293
+ f"(timeout={timeout}s, mode={mode.value}, url={self.config.url})"
294
+ )
243
295
  raise ConnectionError(
244
296
  f"Connection timeout ({mode.value} mode, url={self.config.url})"
245
297
  )
298
+ except Exception as _e:
299
+ print(
300
+ f"[PhyHubConnection] Exception during connect: "
301
+ f"{type(_e).__name__}: {_e!r}"
302
+ )
303
+ raise
246
304
 
247
305
  async def disconnect(self) -> None:
248
306
  """Disconnect from PhyHub."""