sora-sdk 2024.4.0.dev20__tar.gz → 2024.4.0.dev22__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 (32) hide show
  1. {sora_sdk-2024.4.0.dev20/src/sora_sdk.egg-info → sora_sdk-2024.4.0.dev22}/PKG-INFO +3 -3
  2. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/README.md +2 -2
  3. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/pyproject.toml +1 -1
  4. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/run.py +1 -1
  5. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/src/sora_sdk/sora_sdk_ext.cpython-310-darwin.so +0 -0
  6. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22/src/sora_sdk.egg-info}/PKG-INFO +3 -3
  7. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/src/sora_sdk.egg-info/SOURCES.txt +2 -0
  8. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/tests/test_encoded_transform.py +6 -6
  9. sora_sdk-2024.4.0.dev22/tests/test_signaling_notify.py +53 -0
  10. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/tests/test_sora_disconnect.py +20 -0
  11. sora_sdk-2024.4.0.dev22/tests/test_type_switched.py +118 -0
  12. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/tests/test_vad.py +2 -2
  13. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/LICENSE +0 -0
  14. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/MANIFEST.in +0 -0
  15. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/NOTICE.md +0 -0
  16. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/buildbase.py +0 -0
  17. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/pypath.py +0 -0
  18. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/setup.cfg +0 -0
  19. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/setup.py +0 -0
  20. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/src/sora_sdk/__init__.py +0 -0
  21. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/src/sora_sdk/py.typed +0 -0
  22. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/src/sora_sdk/sora_sdk_ext.pyi +0 -0
  23. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/src/sora_sdk.egg-info/dependency_links.txt +0 -0
  24. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/src/sora_sdk.egg-info/top_level.txt +0 -0
  25. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/tests/test_ca_cert.py +0 -0
  26. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/tests/test_macos.py +0 -0
  27. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/tests/test_messaging.py +0 -0
  28. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/tests/test_openh264.py +0 -0
  29. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/tests/test_re_offer_re_answer_sdp.py +0 -0
  30. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/tests/test_sendonly_recvonly.py +0 -0
  31. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/tests/test_signaling_message.py +0 -0
  32. {sora_sdk-2024.4.0.dev20 → sora_sdk-2024.4.0.dev22}/tests/test_simulcast.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sora_sdk
3
- Version: 2024.4.0.dev20
3
+ Version: 2024.4.0.dev22
4
4
  Summary: WebRTC SFU Sora Python SDK
5
5
  Home-page: https://github.com/shiguredo/sora-python-sdk
6
6
  Author-email: "Shiguredo Inc." <contact+pypi@shiguredo.jp>
@@ -290,7 +290,8 @@ PyPI 経由ではインストールできません。
290
290
  - Windows 11 x86_64
291
291
  - Windows Server 2022 x86_64
292
292
  - macOS Sequoia 15 arm64
293
- - macOS Sonoma 14 arm64
293
+ - macOS Ventura 14 arm64
294
+ - macOS Sonoma 13 arm64
294
295
  - Ubuntu 24.04 LTS x86_64
295
296
  - Ubuntu 24.04 LTS arm64
296
297
  - Ubuntu 22.04 LTS x86_64
@@ -311,7 +312,6 @@ PyPI 経由ではインストールできません。
311
312
  ### 優先実装が可能な機能一覧
312
313
 
313
314
  - Windows 11 arm64
314
- - macOS Ventura 13 arm64
315
315
  - Ubuntu 24.04 arm64
316
316
  - Ubuntu 22.04 arm64
317
317
  - Ubuntu 20.04 arm64 (NVIDIA Jetson JetPack SDK 5)
@@ -92,7 +92,8 @@ PyPI 経由ではインストールできません。
92
92
  - Windows 11 x86_64
93
93
  - Windows Server 2022 x86_64
94
94
  - macOS Sequoia 15 arm64
95
- - macOS Sonoma 14 arm64
95
+ - macOS Ventura 14 arm64
96
+ - macOS Sonoma 13 arm64
96
97
  - Ubuntu 24.04 LTS x86_64
97
98
  - Ubuntu 24.04 LTS arm64
98
99
  - Ubuntu 22.04 LTS x86_64
@@ -113,7 +114,6 @@ PyPI 経由ではインストールできません。
113
114
  ### 優先実装が可能な機能一覧
114
115
 
115
116
  - Windows 11 arm64
116
- - macOS Ventura 13 arm64
117
117
  - Ubuntu 24.04 arm64
118
118
  - Ubuntu 22.04 arm64
119
119
  - Ubuntu 20.04 arm64 (NVIDIA Jetson JetPack SDK 5)
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "sora_sdk"
3
3
  authors = [{ name = "Shiguredo Inc.", email = "contact+pypi@shiguredo.jp" }]
4
- version = "2024.4.0.dev20"
4
+ version = "2024.4.0.dev22"
5
5
  description = "WebRTC SFU Sora Python SDK"
6
6
  readme = "README.md"
7
7
  license = { file = "LICENSE" }
@@ -226,7 +226,7 @@ def main():
226
226
  args.local_sora_cpp_sdk_args,
227
227
  )
228
228
 
229
- configuration = "Release"
229
+ configuration = "Debug" if args.debug else "Release"
230
230
 
231
231
  webrtc_platform = get_webrtc_platform(platform)
232
232
  webrtc_info = get_webrtc_info(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sora_sdk
3
- Version: 2024.4.0.dev20
3
+ Version: 2024.4.0.dev22
4
4
  Summary: WebRTC SFU Sora Python SDK
5
5
  Home-page: https://github.com/shiguredo/sora-python-sdk
6
6
  Author-email: "Shiguredo Inc." <contact+pypi@shiguredo.jp>
@@ -290,7 +290,8 @@ PyPI 経由ではインストールできません。
290
290
  - Windows 11 x86_64
291
291
  - Windows Server 2022 x86_64
292
292
  - macOS Sequoia 15 arm64
293
- - macOS Sonoma 14 arm64
293
+ - macOS Ventura 14 arm64
294
+ - macOS Sonoma 13 arm64
294
295
  - Ubuntu 24.04 LTS x86_64
295
296
  - Ubuntu 24.04 LTS arm64
296
297
  - Ubuntu 22.04 LTS x86_64
@@ -311,7 +312,6 @@ PyPI 経由ではインストールできません。
311
312
  ### 優先実装が可能な機能一覧
312
313
 
313
314
  - Windows 11 arm64
314
- - macOS Ventura 13 arm64
315
315
  - Ubuntu 24.04 arm64
316
316
  - Ubuntu 22.04 arm64
317
317
  - Ubuntu 20.04 arm64 (NVIDIA Jetson JetPack SDK 5)
@@ -23,6 +23,8 @@ tests/test_openh264.py
23
23
  tests/test_re_offer_re_answer_sdp.py
24
24
  tests/test_sendonly_recvonly.py
25
25
  tests/test_signaling_message.py
26
+ tests/test_signaling_notify.py
26
27
  tests/test_simulcast.py
27
28
  tests/test_sora_disconnect.py
29
+ tests/test_type_switched.py
28
30
  tests/test_vad.py
@@ -35,7 +35,7 @@ class SendonlyEncodedTransform:
35
35
  # 接続した
36
36
  self._connected: Event = Event()
37
37
  # 終了
38
- self._closed = Event()
38
+ self._disconnected = Event()
39
39
 
40
40
  self._audio_channels: int = 1
41
41
  self._audio_sample_rate: int = 16000
@@ -117,13 +117,13 @@ class SendonlyEncodedTransform:
117
117
  return self._is_called_on_video_transform
118
118
 
119
119
  def _fake_audio_loop(self):
120
- while not self._closed.is_set():
120
+ while not self._disconnected.is_set():
121
121
  time.sleep(0.02)
122
122
  if self._audio_source is not None:
123
123
  self._audio_source.on_data(numpy.zeros((320, 1), dtype=numpy.int16))
124
124
 
125
125
  def _fake_video_loop(self):
126
- while not self._closed.is_set():
126
+ while not self._disconnected.is_set():
127
127
  time.sleep(1.0 / 30)
128
128
  if self._video_source is not None:
129
129
  self._video_source.on_captured(
@@ -148,7 +148,7 @@ class SendonlyEncodedTransform:
148
148
 
149
149
  def _on_disconnect(self, error_code, message):
150
150
  print(f"Disconnected Sora: error_code='{error_code}' message='{message}'")
151
- self._closed.set()
151
+ self._disconnected.set()
152
152
  self._connected.clear()
153
153
 
154
154
  if self._fake_audio_thread is not None:
@@ -209,7 +209,7 @@ class RecvonlyEncodedTransform:
209
209
  # 接続した
210
210
  self._connected: Event = Event()
211
211
  # 終了
212
- self._closed = Event()
212
+ self._disconnected = Event()
213
213
 
214
214
  self._audio_output_frequency: int = 24000
215
215
  self._audio_output_channels: int = 1
@@ -276,7 +276,7 @@ class RecvonlyEncodedTransform:
276
276
 
277
277
  def _on_disconnect(self, error_code, message):
278
278
  print(f"Disconnected Sora: error_code='{error_code}' message='{message}'")
279
- self._closed = True
279
+ self._disconnected.set()
280
280
  self._connected.clear()
281
281
 
282
282
  def _on_track(self, track: SoraMediaTrack) -> None:
@@ -0,0 +1,53 @@
1
+ import sys
2
+ import uuid
3
+
4
+ from client import SoraClient, SoraRole
5
+
6
+
7
+ def test_signaling_notify(setup):
8
+ """
9
+ 2 接続での connection.created と connection.destroyed の通知を確認する
10
+ """
11
+ signaling_urls = setup.get("signaling_urls")
12
+ channel_id_prefix = setup.get("channel_id_prefix")
13
+ metadata = setup.get("metadata")
14
+
15
+ channel_id = f"{channel_id_prefix}_{__name__}_{sys._getframe().f_code.co_name}_{uuid.uuid4()}"
16
+
17
+ with SoraClient(
18
+ signaling_urls,
19
+ SoraRole.SENDRECV,
20
+ channel_id,
21
+ audio=True,
22
+ video=True,
23
+ metadata=metadata,
24
+ ) as c1:
25
+ # c1 に自分の connection.created が通知される
26
+ notify = c1.wait_notify(lambda notify: notify["event_type"] == "connection.created")
27
+ assert notify["connection_id"] == c1.connection_id
28
+ assert notify["channel_connections"] == 1
29
+
30
+ with SoraClient(
31
+ signaling_urls,
32
+ SoraRole.SENDRECV,
33
+ channel_id,
34
+ audio=True,
35
+ video=True,
36
+ metadata=metadata,
37
+ ) as c2:
38
+ # c2 に自分の connection.created が通知される
39
+ notify = c2.wait_notify(lambda notify: notify["event_type"] == "connection.created")
40
+ assert notify["connection_id"] == c2.connection_id
41
+ assert notify["channel_connections"] == 2
42
+ # data に c1 の connection_id が入ってる
43
+ assert notify["data"][0]["connection_id"] == c1.connection_id
44
+
45
+ # c1 に c2 の connection.created が通知される
46
+ notify = c1.wait_notify(lambda notify: notify["event_type"] == "connection.created")
47
+ assert notify["connection_id"] == c2.connection_id
48
+ assert notify["channel_connections"] == 2
49
+
50
+ # c1 に c2 の connection.destroyed が通知される
51
+ notify = c1.wait_notify(lambda notify: notify["event_type"] == "connection.destroyed")
52
+ assert notify["connection_id"] == c2.connection_id
53
+ assert notify["channel_connections"] == 1
@@ -6,6 +6,8 @@ import pytest
6
6
  from api import disconnect_connection_api
7
7
  from client import SoraClient, SoraRole
8
8
 
9
+ from sora_sdk import SoraSignalingErrorCode
10
+
9
11
 
10
12
  @pytest.mark.skipif(sys.platform != "linux", reason="linux でのみ実行する")
11
13
  def test_websocket_signaling_only_disconnect_api(setup):
@@ -33,10 +35,17 @@ def test_websocket_signaling_only_disconnect_api(setup):
33
35
  response = disconnect_connection_api(api_url, channel_id, conn.connection_id)
34
36
  assert response.status_code == 200
35
37
 
38
+ time.sleep(3)
39
+
36
40
  assert conn.ws_close is True
37
41
  assert conn.ws_close_code == 1000
38
42
  assert conn.ws_close_reason == "DISCONNECTED-API"
39
43
 
44
+ # C++ SDK 側でこのテストが通るようなコードが必要
45
+ # assert conn.disconnect_code == SoraSignalingErrorCode.CLOSE_SUCCEEDED
46
+ # assert conn.disconnect_reason is not None
47
+ # assert "DISCONNECTED-API" in conn.disconnect_reason
48
+
40
49
  # TODO: LIFETIME-EXPIRED のテスト
41
50
 
42
51
 
@@ -66,10 +75,17 @@ def test_websocket_datachannel_signaling_disconnect_api(setup):
66
75
  response = disconnect_connection_api(api_url, channel_id, conn.connection_id)
67
76
  assert response.status_code == 200
68
77
 
78
+ time.sleep(3)
79
+
69
80
  assert conn.ws_close is True
70
81
  assert conn.ws_close_code == 1000
71
82
  assert conn.ws_close_reason == "DISCONNECTED-API"
72
83
 
84
+ # C++ SDK 側でこのテストが通るようなコードが必要
85
+ # assert conn.disconnect_code == SoraSignalingErrorCode.CLOSE_SUCCEEDED
86
+ # assert conn.disconnect_reason is not None
87
+ # assert "DISCONNECTED-API" in conn.disconnect_reason
88
+
73
89
  # TODO: LIFETIME-EXPIRED のテスト
74
90
 
75
91
 
@@ -112,4 +128,8 @@ def test_datachannel_only_signaling_disconnect_api(setup):
112
128
  assert conn.close_message["code"] == 1000
113
129
  assert conn.close_message["reason"] == "DISCONNECTED-API"
114
130
 
131
+ assert conn.disconnect_code == SoraSignalingErrorCode.CLOSE_SUCCEEDED
132
+ assert conn.disconnect_reason is not None
133
+ assert "DISCONNECTED-API" in conn.disconnect_reason
134
+
115
135
  # TODO: LIFETIME-EXPIRED のテスト
@@ -0,0 +1,118 @@
1
+ import sys
2
+ import time
3
+ import uuid
4
+
5
+ import pytest
6
+ from client import SoraClient, SoraRole
7
+
8
+
9
+ def test_websocket_signaling_only_type_switched(setup):
10
+ signaling_urls = setup.get("signaling_urls")
11
+ channel_id_prefix = setup.get("channel_id_prefix")
12
+ metadata = setup.get("metadata")
13
+
14
+ channel_id = f"{channel_id_prefix}_{__name__}_{sys._getframe().f_code.co_name}_{uuid.uuid4()}"
15
+
16
+ """
17
+ - WebSocket シグナリングのみ
18
+ - type: switched 送られてこない
19
+ """
20
+ with SoraClient(
21
+ signaling_urls,
22
+ SoraRole.RECVONLY,
23
+ channel_id,
24
+ audio=True,
25
+ video=True,
26
+ metadata=metadata,
27
+ data_channel_signaling=False,
28
+ ignore_disconnect_websocket=False,
29
+ ) as conn:
30
+ time.sleep(3)
31
+
32
+ assert conn.switched is False
33
+ assert conn.ws_close_code is None
34
+ assert conn.ws_close_reason is None
35
+
36
+
37
+ def test_hybrid_signaling_type_switched(setup):
38
+ signaling_urls = setup.get("signaling_urls")
39
+ channel_id_prefix = setup.get("channel_id_prefix")
40
+ metadata = setup.get("metadata")
41
+
42
+ channel_id = f"{channel_id_prefix}_{__name__}_{sys._getframe().f_code.co_name}_{uuid.uuid4()}"
43
+
44
+ """
45
+ - WebSocket シグナリング + DataChannel シグナリング
46
+ - type: switched 送られてくる
47
+ """
48
+ with SoraClient(
49
+ signaling_urls,
50
+ SoraRole.RECVONLY,
51
+ channel_id,
52
+ audio=True,
53
+ video=True,
54
+ metadata=metadata,
55
+ data_channel_signaling=True,
56
+ ignore_disconnect_websocket=False,
57
+ ) as conn:
58
+ time.sleep(3)
59
+
60
+ assert conn.switched is True
61
+ assert conn.ws_close_code is None
62
+ assert conn.ws_close_reason is None
63
+
64
+
65
+ def test_datachannel_signaling_only_type_switched(setup):
66
+ signaling_urls = setup.get("signaling_urls")
67
+ channel_id_prefix = setup.get("channel_id_prefix")
68
+ metadata = setup.get("metadata")
69
+
70
+ channel_id = f"{channel_id_prefix}_{__name__}_{sys._getframe().f_code.co_name}_{uuid.uuid4()}"
71
+
72
+ """
73
+ - DataChannel シグナリングのみ
74
+ - type: switched 送られてくる
75
+ - Python SDK は WebSocket を自分で切断する
76
+ """
77
+ with SoraClient(
78
+ signaling_urls,
79
+ SoraRole.RECVONLY,
80
+ channel_id,
81
+ audio=True,
82
+ video=True,
83
+ metadata=metadata,
84
+ data_channel_signaling=True,
85
+ ignore_disconnect_websocket=True,
86
+ ) as conn:
87
+ time.sleep(3)
88
+
89
+ assert conn.switched is True
90
+ assert conn.ws_close_code == 1000
91
+ assert conn.ws_close_reason == "SELF-CLOSED"
92
+
93
+
94
+ @pytest.mark.skip(reason="Sora がまだ対応していない")
95
+ def test_disconnect_before_switched(setup):
96
+ # switched 前に type: disconnect を送りつける
97
+ # ignore_disconnect_websocket は true
98
+ signaling_urls = setup.get("signaling_urls")
99
+ channel_id_prefix = setup.get("channel_id_prefix")
100
+ metadata = setup.get("metadata")
101
+
102
+ channel_id = f"{channel_id_prefix}_{__name__}_{sys._getframe().f_code.co_name}_{uuid.uuid4()}"
103
+
104
+ with SoraClient(
105
+ signaling_urls,
106
+ SoraRole.RECVONLY,
107
+ channel_id,
108
+ audio=True,
109
+ video=True,
110
+ metadata=metadata,
111
+ data_channel_signaling=True,
112
+ ignore_disconnect_websocket=True,
113
+ ) as conn:
114
+ conn.disconnect()
115
+
116
+ if not conn.switched:
117
+ assert conn.ws_close_code == 1000
118
+ assert conn.ws_close_reason == "TYPE-DISCONNECT"
@@ -30,7 +30,7 @@ class VAD:
30
30
  # 接続した
31
31
  self._connected: Event = Event()
32
32
  # 終了
33
- self._closed = Event()
33
+ self._disconnected = Event()
34
34
 
35
35
  self._audio_output_frequency: int = 24000
36
36
  self._audio_output_channels: int = 1
@@ -86,7 +86,7 @@ class VAD:
86
86
 
87
87
  def _on_disconnect(self, error_code, message):
88
88
  print(f"Disconnected Sora: error_code='{error_code}' message='{message}'")
89
- self._closed = True
89
+ self._disconnected.set()
90
90
  self._connected.clear()
91
91
 
92
92
  def _on_frame(self, frame: SoraAudioFrame):