rocket-welder-sdk 1.1.35.dev13__tar.gz → 1.1.36.dev14__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 (68) hide show
  1. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/PKG-INFO +1 -1
  2. rocket_welder_sdk-1.1.36.dev14/VERSION +1 -0
  3. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/high_level/__init__.py +2 -0
  4. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/high_level/client.py +3 -30
  5. rocket_welder_sdk-1.1.36.dev14/rocket_welder_sdk/high_level/frame_sink_factory.py +118 -0
  6. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/transport/__init__.py +2 -1
  7. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/transport/frame_sink.py +45 -0
  8. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk.egg-info/PKG-INFO +1 -1
  9. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk.egg-info/SOURCES.txt +1 -0
  10. rocket_welder_sdk-1.1.35.dev13/VERSION +0 -1
  11. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/MANIFEST.in +0 -0
  12. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/README.md +0 -0
  13. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/logo.png +0 -0
  14. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/pyproject.toml +0 -0
  15. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/__init__.py +0 -0
  16. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/bytes_size.py +0 -0
  17. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/connection_string.py +0 -0
  18. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/controllers.py +0 -0
  19. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/external_controls/__init__.py +0 -0
  20. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/external_controls/contracts.py +0 -0
  21. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/external_controls/contracts_old.py +0 -0
  22. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/frame_metadata.py +0 -0
  23. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/gst_metadata.py +0 -0
  24. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/high_level/connection_strings.py +0 -0
  25. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/high_level/data_context.py +0 -0
  26. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/high_level/schema.py +0 -0
  27. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/high_level/transport_protocol.py +0 -0
  28. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/keypoints_protocol.py +0 -0
  29. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/opencv_controller.py +0 -0
  30. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/periodic_timer.py +0 -0
  31. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/py.typed +0 -0
  32. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/rocket_welder_client.py +0 -0
  33. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/segmentation_result.py +0 -0
  34. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/session_id.py +0 -0
  35. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/transport/frame_source.py +0 -0
  36. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/transport/nng_transport.py +0 -0
  37. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/transport/stream_transport.py +0 -0
  38. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/transport/tcp_transport.py +0 -0
  39. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/transport/unix_socket_transport.py +0 -0
  40. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/ui/__init__.py +0 -0
  41. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/ui/controls.py +0 -0
  42. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/ui/icons.py +0 -0
  43. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/ui/ui_events_projection.py +0 -0
  44. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/ui/ui_service.py +0 -0
  45. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk/ui/value_types.py +0 -0
  46. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk.egg-info/dependency_links.txt +0 -0
  47. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk.egg-info/requires.txt +0 -0
  48. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/rocket_welder_sdk.egg-info/top_level.txt +0 -0
  49. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/setup.cfg +0 -0
  50. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/setup.py +0 -0
  51. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/tests/test_bytes_size.py +0 -0
  52. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/tests/test_connection_string.py +0 -0
  53. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/tests/test_controllers.py +0 -0
  54. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/tests/test_external_controls_serialization.py +0 -0
  55. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/tests/test_external_controls_serialization_v2.py +0 -0
  56. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/tests/test_frame_metadata.py +0 -0
  57. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/tests/test_gst_metadata.py +0 -0
  58. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/tests/test_high_level_api.py +0 -0
  59. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/tests/test_icons.py +0 -0
  60. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/tests/test_keypoints_cross_platform.py +0 -0
  61. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/tests/test_keypoints_protocol.py +0 -0
  62. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/tests/test_rocket_welder_client.py +0 -0
  63. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/tests/test_segmentation_cross_platform.py +0 -0
  64. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/tests/test_segmentation_result.py +0 -0
  65. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/tests/test_session_id.py +0 -0
  66. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/tests/test_transport_cross_platform.py +0 -0
  67. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/tests/test_ui_controls.py +0 -0
  68. {rocket_welder_sdk-1.1.35.dev13 → rocket_welder_sdk-1.1.36.dev14}/tests/test_ui_service_happy_path.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rocket-welder-sdk
3
- Version: 1.1.35.dev13
3
+ Version: 1.1.36.dev14
4
4
  Summary: High-performance video streaming SDK for RocketWelder services using ZeroBuffer IPC
5
5
  Home-page: https://github.com/modelingevolution/rocket-welder-sdk
6
6
  Author: ModelingEvolution
@@ -0,0 +1 @@
1
+ 1.1.36.dev14
@@ -23,6 +23,7 @@ from .data_context import (
23
23
  IKeyPointsDataContext,
24
24
  ISegmentationDataContext,
25
25
  )
26
+ from .frame_sink_factory import FrameSinkFactory
26
27
  from .schema import (
27
28
  IKeyPointsSchema,
28
29
  ISegmentationSchema,
@@ -35,6 +36,7 @@ from .transport_protocol import (
35
36
  )
36
37
 
37
38
  __all__ = [
39
+ "FrameSinkFactory",
38
40
  "IKeyPointsDataContext",
39
41
  "IKeyPointsSchema",
40
42
  "ISegmentationDataContext",
@@ -32,13 +32,13 @@ from .data_context import (
32
32
  KeyPointsDataContext,
33
33
  SegmentationDataContext,
34
34
  )
35
+ from .frame_sink_factory import FrameSinkFactory
35
36
  from .schema import (
36
37
  IKeyPointsSchema,
37
38
  ISegmentationSchema,
38
39
  KeyPointsSchema,
39
40
  SegmentationSchema,
40
41
  )
41
- from .transport_protocol import TransportKind
42
42
 
43
43
  if TYPE_CHECKING:
44
44
  from rocket_welder_sdk.keypoints_protocol import KeyPointsSink
@@ -203,35 +203,8 @@ class RocketWelderClient:
203
203
  return kp_ctx, seg_ctx
204
204
 
205
205
  def _create_frame_sink(self, protocol: Any, address: str) -> IFrameSink:
206
- """Create frame sink from protocol."""
207
- from rocket_welder_sdk.transport import NngFrameSink
208
- from rocket_welder_sdk.transport.stream_transport import StreamFrameSink
209
- from rocket_welder_sdk.transport.unix_socket_transport import UnixSocketFrameSink
210
-
211
- from .transport_protocol import TransportProtocol
212
-
213
- if not isinstance(protocol, TransportProtocol):
214
- raise TypeError(f"Expected TransportProtocol, got {type(protocol)}")
215
-
216
- if protocol.kind == TransportKind.FILE:
217
- logger.debug("Creating file sink: %s", address)
218
- file_handle = open(address, "wb") # noqa: SIM115 ownership transfers to sink
219
- try:
220
- return StreamFrameSink(file_handle)
221
- except Exception:
222
- file_handle.close()
223
- raise
224
- elif protocol.kind == TransportKind.SOCKET:
225
- logger.debug("Creating Unix socket sink: %s", address)
226
- return UnixSocketFrameSink.connect(address)
227
- elif protocol.kind in (TransportKind.NNG_PUSH_IPC, TransportKind.NNG_PUSH_TCP):
228
- logger.debug("Creating NNG pusher: %s", address)
229
- return NngFrameSink.create_pusher(address)
230
- elif protocol.kind in (TransportKind.NNG_PUB_IPC, TransportKind.NNG_PUB_TCP):
231
- logger.debug("Creating NNG publisher: %s", address)
232
- return NngFrameSink.create_publisher(address)
233
- else:
234
- raise ValueError(f"Unsupported protocol: {protocol}")
206
+ """Create frame sink from protocol using FrameSinkFactory."""
207
+ return FrameSinkFactory.create(protocol, address, logger_instance=logger)
235
208
 
236
209
  def close(self) -> None:
237
210
  """Release resources."""
@@ -0,0 +1,118 @@
1
+ """
2
+ Factory for creating IFrameSink instances from parsed protocol and address.
3
+
4
+ Does NOT parse URLs - use SegmentationConnectionString or KeyPointsConnectionString for parsing.
5
+
6
+ This mirrors the C# FrameSinkFactory class for API consistency.
7
+
8
+ Usage:
9
+ from rocket_welder_sdk.high_level import FrameSinkFactory, SegmentationConnectionString
10
+
11
+ cs = SegmentationConnectionString.parse("socket:///tmp/seg.sock")
12
+ sink = FrameSinkFactory.create(cs.protocol, cs.address)
13
+
14
+ # For null sink (no output configured):
15
+ sink = FrameSinkFactory.create_null()
16
+ """
17
+
18
+ from __future__ import annotations
19
+
20
+ import logging
21
+ from typing import TYPE_CHECKING, Optional
22
+
23
+ from .transport_protocol import TransportProtocol
24
+
25
+ if TYPE_CHECKING:
26
+ from rocket_welder_sdk.transport.frame_sink import IFrameSink
27
+
28
+ logger = logging.getLogger(__name__)
29
+
30
+
31
+ class FrameSinkFactory:
32
+ """
33
+ Factory for creating IFrameSink instances from parsed protocol and address.
34
+
35
+ Does NOT parse URLs - use SegmentationConnectionString or KeyPointsConnectionString for parsing.
36
+
37
+ Mirrors C# RocketWelder.SDK.Transport.FrameSinkFactory.
38
+ """
39
+
40
+ @staticmethod
41
+ def create(
42
+ protocol: Optional[TransportProtocol],
43
+ address: str,
44
+ *,
45
+ logger_instance: Optional[logging.Logger] = None,
46
+ ) -> IFrameSink:
47
+ """
48
+ Create a frame sink from parsed protocol and address.
49
+
50
+ Returns NullFrameSink if protocol is None (no URL specified).
51
+
52
+ Args:
53
+ protocol: The transport protocol (from ConnectionString.protocol), or None
54
+ address: The address (file path, socket path, or NNG address)
55
+ logger_instance: Optional logger for diagnostics
56
+
57
+ Returns:
58
+ An IFrameSink connected to the specified address, or NullFrameSink if protocol is None
59
+
60
+ Raises:
61
+ ValueError: If protocol is not supported for sinks
62
+
63
+ Example:
64
+ cs = SegmentationConnectionString.parse("socket:///tmp/seg.sock")
65
+ sink = FrameSinkFactory.create(cs.protocol, cs.address)
66
+ """
67
+ from rocket_welder_sdk.transport import NngFrameSink, NullFrameSink
68
+ from rocket_welder_sdk.transport.stream_transport import StreamFrameSink
69
+ from rocket_welder_sdk.transport.unix_socket_transport import UnixSocketFrameSink
70
+
71
+ log = logger_instance or logger
72
+
73
+ # Handle None protocol - return null sink
74
+ if protocol is None:
75
+ log.debug("No protocol specified, using NullFrameSink")
76
+ return NullFrameSink.instance()
77
+
78
+ if not isinstance(protocol, TransportProtocol):
79
+ raise TypeError(f"Expected TransportProtocol, got {type(protocol).__name__}")
80
+
81
+ if protocol.is_file:
82
+ log.info("Creating file frame sink at: %s", address)
83
+ file_handle = open(address, "wb") # noqa: SIM115
84
+ return StreamFrameSink(file_handle)
85
+
86
+ if protocol.is_socket:
87
+ log.info("Creating Unix socket frame sink at: %s", address)
88
+ return UnixSocketFrameSink.connect(address)
89
+
90
+ if protocol.is_nng:
91
+ log.info("Creating NNG frame sink (%s) at: %s", protocol.schema, address)
92
+
93
+ if protocol.is_pub:
94
+ return NngFrameSink.create_publisher(address)
95
+ if protocol.is_push:
96
+ return NngFrameSink.create_pusher(address)
97
+
98
+ raise ValueError(
99
+ f"NNG protocol '{protocol.schema}' is not supported for sinks "
100
+ "(only pub and push are supported)"
101
+ )
102
+
103
+ raise ValueError(f"Transport protocol '{protocol.schema}' is not supported for frame sinks")
104
+
105
+ @staticmethod
106
+ def create_null() -> IFrameSink:
107
+ """
108
+ Create a null frame sink that discards all data.
109
+
110
+ Use when no output URL is configured.
111
+ """
112
+ from rocket_welder_sdk.transport import NullFrameSink
113
+
114
+ return NullFrameSink.instance()
115
+
116
+
117
+ # Re-export for convenience
118
+ __all__ = ["FrameSinkFactory"]
@@ -4,7 +4,7 @@ Transport layer for RocketWelder SDK.
4
4
  Provides transport-agnostic frame sink/source abstractions for protocols.
5
5
  """
6
6
 
7
- from .frame_sink import IFrameSink
7
+ from .frame_sink import IFrameSink, NullFrameSink
8
8
  from .frame_source import IFrameSource
9
9
  from .nng_transport import NngFrameSink, NngFrameSource
10
10
  from .stream_transport import StreamFrameSink, StreamFrameSource
@@ -20,6 +20,7 @@ __all__ = [
20
20
  "IFrameSource",
21
21
  "NngFrameSink",
22
22
  "NngFrameSource",
23
+ "NullFrameSink",
23
24
  "StreamFrameSink",
24
25
  "StreamFrameSource",
25
26
  "TcpFrameSink",
@@ -75,3 +75,48 @@ class IFrameSink(ABC):
75
75
  async def close_async(self) -> None:
76
76
  """Close the sink and release resources asynchronously."""
77
77
  pass
78
+
79
+
80
+ class NullFrameSink(IFrameSink):
81
+ """
82
+ A frame sink that discards all data.
83
+
84
+ Use when no output URL is configured or for testing.
85
+ Singleton pattern - use NullFrameSink.instance() to get the shared instance.
86
+ """
87
+
88
+ _instance: "NullFrameSink | None" = None
89
+
90
+ def __new__(cls) -> "NullFrameSink":
91
+ if cls._instance is None:
92
+ cls._instance = super().__new__(cls)
93
+ return cls._instance
94
+
95
+ @classmethod
96
+ def instance(cls) -> "NullFrameSink":
97
+ """Get the singleton instance."""
98
+ return cls()
99
+
100
+ def write_frame(self, frame_data: bytes) -> None:
101
+ """Discards the frame data (no-op)."""
102
+ pass
103
+
104
+ async def write_frame_async(self, frame_data: bytes) -> None:
105
+ """Discards the frame data (no-op)."""
106
+ pass
107
+
108
+ def flush(self) -> None:
109
+ """No-op flush."""
110
+ pass
111
+
112
+ async def flush_async(self) -> None:
113
+ """No-op flush."""
114
+ pass
115
+
116
+ def close(self) -> None:
117
+ """No-op close (singleton, never actually closed)."""
118
+ pass
119
+
120
+ async def close_async(self) -> None:
121
+ """No-op close (singleton, never actually closed)."""
122
+ pass
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rocket-welder-sdk
3
- Version: 1.1.35.dev13
3
+ Version: 1.1.36.dev14
4
4
  Summary: High-performance video streaming SDK for RocketWelder services using ZeroBuffer IPC
5
5
  Home-page: https://github.com/modelingevolution/rocket-welder-sdk
6
6
  Author: ModelingEvolution
@@ -30,6 +30,7 @@ rocket_welder_sdk/high_level/__init__.py
30
30
  rocket_welder_sdk/high_level/client.py
31
31
  rocket_welder_sdk/high_level/connection_strings.py
32
32
  rocket_welder_sdk/high_level/data_context.py
33
+ rocket_welder_sdk/high_level/frame_sink_factory.py
33
34
  rocket_welder_sdk/high_level/schema.py
34
35
  rocket_welder_sdk/high_level/transport_protocol.py
35
36
  rocket_welder_sdk/transport/__init__.py
@@ -1 +0,0 @@
1
- 1.1.35.dev13