PyAgoraRTC 0.2.0__tar.gz → 0.2.2__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.
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/.github/workflows/release.yml +3 -1
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/PKG-INFO +1 -1
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/docs/architecture.md +4 -1
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/docs/backlog.md +20 -6
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/docs/decisions.md +30 -1
- pyagorartc-0.2.2/docs/migration.md +996 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/docs/open_questions.md +14 -4
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/docs/protocol.md +5 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/pyagorartc/models.py +4 -2
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/pyagorartc/session/session.py +25 -7
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/pyproject.toml +1 -1
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/integration/test_session_join.py +22 -1
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/integration/test_session_streams.py +45 -1
- pyagorartc-0.2.2/tests/unit/session/test_session_join_race.py +95 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/unit/session/test_session_streams.py +70 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/unit/test_models.py +1 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/uv.lock +1 -1
- pyagorartc-0.2.0/docs/migration.md +0 -683
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/.claude/agents/code-reviewer.md +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/.claude/agents/test-reviewer.md +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/.github/workflows/ci.yml +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/.gitignore +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/.pre-commit-config.yaml +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/.python-version +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/CLAUDE.md +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/CONSTITUTION.md +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/CONTRIBUTING.md +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/LICENSE +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/README.md +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/docs/analysis/divergence.md +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/docs/analysis/legacy/README.md +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/docs/analysis/legacy/agora_api.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/docs/analysis/legacy/agora_sdp.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/docs/analysis/legacy/agora_websockets.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/docs/code_style.md +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/docs/testing.md +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/pyagorartc/__init__.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/pyagorartc/ap/__init__.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/pyagorartc/ap/client.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/pyagorartc/ap/password.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/pyagorartc/ap/response.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/pyagorartc/const.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/pyagorartc/exceptions.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/pyagorartc/py.typed +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/pyagorartc/rtm/__init__.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/pyagorartc/rtm/client.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/pyagorartc/sdp/__init__.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/pyagorartc/sdp/answer.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/pyagorartc/sdp/candidates.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/pyagorartc/sdp/offer.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/pyagorartc/session/__init__.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/pyagorartc/session/messages.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/pyagorartc/session/recovery.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/pyagorartc/session/transport.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/__init__.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/_helpers.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/conftest.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fakegateway/__init__.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fakegateway/__main__.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fakegateway/_common.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fakegateway/ap.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fakegateway/gateway.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fakegateway/rtm.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fakegateway/scheduler.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fakegateway/server.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fakegateway/state.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/README.md +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/ap/choose_server_all_failed.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/ap/choose_server_gateway_failed.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/ap/choose_server_irregular.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/ap/choose_server_one_failed.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/ap/choose_server_request_expected.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/ap/choose_server_response.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/ap/update_ticket_response.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/error.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/join_failed.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/join_failed_code_only.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/join_ok.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/join_ok_no_ortc.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/join_ok_rtx.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/join_v3_expected.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/join_v3_inputs.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/leave_expected.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/non_object_message.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/on_add_video_stream.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/on_add_video_stream_h265_pt0.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/on_add_video_stream_minimal.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/on_add_video_stream_no_ssrc.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/on_notification_quit.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/on_notification_warn.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/on_p2p_lost.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/on_p2p_lost_top_level.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/on_p2p_lost_top_level_only.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/on_p2p_ok.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/on_rtp_capability_change.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/on_rtp_capability_change_irregular.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/on_token_privilege_did_expire.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/on_token_privilege_will_expire.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/on_user_offline.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/on_user_offline_no_uid.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/on_user_online.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/ping_back.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/ping_expected.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/renew_token_expected.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/set_client_role_expected.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/subscribe_expected.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/unknown_event.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/gateway/unsubscribe_expected.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/rtm/ack_delivered.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/rtm/ack_failed.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/rtm/ack_failed_sent.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/rtm/ack_mixed_case.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/rtm/ack_offline.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/rtm/ack_sent.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/rtm/peer_message_request_expected.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/sdp/chrome_answer_shipped.sdp +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/sdp/chrome_offer_ortc_shipped.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/sdp/chrome_recvonly_offer.sdp +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/sdp/gateway_join_ortc.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/sdp/gateway_ortc_vp8.json +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/sdp/go2rtc_offer.sdp +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/fixtures/sdp/whep_trickle_fragment.sdpfrag +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/integration/__init__.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/integration/_helpers.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/integration/conftest.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/integration/test_ap_client.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/integration/test_fakegateway_contract_ap.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/integration/test_fakegateway_contract_control.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/integration/test_fakegateway_contract_gateway_events.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/integration/test_fakegateway_contract_gateway_join.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/integration/test_fakegateway_contract_rtm.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/integration/test_rtm_client.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/integration/test_session_endings.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/integration/test_session_secrets.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/integration/test_session_timers.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/integration/test_transport.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/meta/__init__.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/meta/_helpers.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/meta/test_conventions.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/meta/test_guards.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/regression/__init__.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/unit/__init__.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/unit/_fakes.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/unit/ap/__init__.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/unit/ap/test_client.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/unit/ap/test_password.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/unit/ap/test_response.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/unit/conftest.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/unit/rtm/__init__.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/unit/rtm/test_client.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/unit/sdp/__init__.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/unit/sdp/_helpers.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/unit/sdp/test_answer.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/unit/sdp/test_candidates.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/unit/sdp/test_offer.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/unit/session/__init__.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/unit/session/_helpers.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/unit/session/test_messages.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/unit/session/test_recovery.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/unit/session/test_session.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/unit/session/test_session_recovery.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/unit/session/test_session_teardown.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/unit/session/test_session_timers.py +0 -0
- {pyagorartc-0.2.0 → pyagorartc-0.2.2}/tests/unit/session/test_transport.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: PyAgoraRTC
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
4
4
|
Summary: Async Python client for Agora RTC signalling: edge discovery, SDP/ORTC negotiation and the WebSocket gateway session
|
|
5
5
|
Project-URL: Homepage, https://github.com/mikey0000/PyAgoraRTC
|
|
6
6
|
Project-URL: Documentation, https://github.com/mikey0000/PyAgoraRTC/tree/main/docs
|
|
@@ -77,7 +77,9 @@ host: s = AgoraSession(creds, ap, options, callbacks…)
|
|
|
77
77
|
(JoinRejectedError / JoinTimeoutError; never a fabricated SDP)
|
|
78
78
|
4. subscribe to streams already in the join payload, and to each
|
|
79
79
|
announced stream once both on_add_video_stream and
|
|
80
|
-
on_user_online for its publisher have been seen (any order
|
|
80
|
+
on_user_online for its publisher have been seen (any order;
|
|
81
|
+
a held stream logs its uid at DEBUG, Q18) — or on the
|
|
82
|
+
announcement alone with subscribe_requires_online=False (D28),
|
|
81
83
|
filtered by target_uid and never our own uid; each subscribe
|
|
82
84
|
task calls on_stream(stream) once, after its first subscribe
|
|
83
85
|
5. start owned tasks: ping, keepalive (if given); every timer
|
|
@@ -145,6 +147,7 @@ new `AgoraSession`. That is what keeps state simple enough to reason about.
|
|
|
145
147
|
| `set_client_role` after join | `SessionOptions.send_set_client_role` (default off) | knowing the device tolerates it |
|
|
146
148
|
| Join codec and flags | `client_codec` (default `vp8`, D7), `prealloc_pc` (default on, Q10), `extra_join_attributes` (merged into `userAttributes` last; stored read-only) | the codec its device publishes; any flag it needs |
|
|
147
149
|
| DTLS role in the client ORTC | `ortc_dtls_role` (default `server`; `None` sends none, D4/Q2) | a parity experiment |
|
|
150
|
+
| Subscribing before presence | `subscribe_requires_online` (default on, D28/Q18) | whether its gateway sends `on_user_online` for a publisher |
|
|
148
151
|
| Ending on `on_p2p_lost` | `end_on_p2p_lost` (default off, D22) | whether its device treats it as fatal |
|
|
149
152
|
| Renewal cadence | `renew_debounce_s` (default 30 s, D8/Q11) | nothing, unless the gateway penalises repeats |
|
|
150
153
|
| Timeouts | `join_timeout_s` (15 s), `connect_timeout_s` (10 s) | a slower network |
|
|
@@ -19,6 +19,15 @@ Open work only; finished items are deleted.
|
|
|
19
19
|
coverage.
|
|
20
20
|
- A fake gateway knob that omits `dtlsParameters.fingerprints` from the join
|
|
21
21
|
response, so D26's fill-in gets integration coverage (Q19).
|
|
22
|
+
- A way for a host to filter the join's inline candidates. PetKit dropped
|
|
23
|
+
host candidates before the join (`whep_proxy.py:170-173`); `join()` now
|
|
24
|
+
sends every `a=candidate:` in the offer. The workaround (strip the lines,
|
|
25
|
+
`add_ice_candidate` the filtered ones, migration §3.6) works; decide after
|
|
26
|
+
the PetKit run whether an option is worth it.
|
|
27
|
+
- Send AP detail `6` without putting `string_uid` into the join. PetKit's AP
|
|
28
|
+
request always carried `6 = str(uid)` (`agora_api.py:320-321`) and its join
|
|
29
|
+
none (`agora_websocket.py:686`); `ChannelCredentials.string_uid` couples
|
|
30
|
+
the two (Q9).
|
|
22
31
|
- Post-join trickle candidates once Q4 is answered.
|
|
23
32
|
- ICE restart / rejoin with `rejoin_token` (the field is stored today and
|
|
24
33
|
never used).
|
|
@@ -31,12 +40,17 @@ Open work only; finished items are deleted.
|
|
|
31
40
|
|
|
32
41
|
## Hosts
|
|
33
42
|
|
|
34
|
-
- HA-Luba:
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
43
|
+
- HA-Luba: merge the `pyagorartc-migration` branch (`docs/migration.md` §2)
|
|
44
|
+
once the hardware run below passes.
|
|
45
|
+
- HA-Luba: run one WiFi and one 4G session on a Luba 2 and a Yuka across all
|
|
46
|
+
camera uids to validate the migration (Q2, Q5, Q6, Q10, Q11; migration §4).
|
|
47
|
+
- pymammotion drops its unused `sdp-transform`, `websockets`, `webrtc-models`
|
|
48
|
+
requirements.
|
|
49
|
+
- PetKit: migration per `docs/migration.md` §3. One go2rtc session per
|
|
50
|
+
camera model at DEBUG answers Q18 first (it decides the default of
|
|
51
|
+
`subscribe_requires_online`, D28), then Q3, Q7 and
|
|
52
|
+
Q13 (migration §4). `send_set_client_role` and `end_on_p2p_lost` stay on
|
|
53
|
+
for PetKit until those runs say otherwise.
|
|
40
54
|
|
|
41
55
|
## Documentation
|
|
42
56
|
|
|
@@ -191,7 +191,7 @@ socket and tasks and fires `on_closed(JOIN_FAILED)` before raising (a socket
|
|
|
191
191
|
that closes after the join result but before `join()` acts on it is a failed
|
|
192
192
|
join, `GatewayConnectError`, not a silently dead joined session); the
|
|
193
193
|
gateway's quit, a socket close, the deadline and (with D22) `p2p_lost` fire
|
|
194
|
-
their reasons. `close()` is idempotent and safe after a failed join. A
|
|
194
|
+
their reasons, including when they land while `join()` is in flight (D29). `close()` is idempotent and safe after a failed join. A
|
|
195
195
|
candidate added after `join()` is ignored with a DEBUG line (Q4).
|
|
196
196
|
|
|
197
197
|
## D24. `parse_offer` restores what `sdp_transform` coerces (amends D3)
|
|
@@ -239,3 +239,32 @@ dozen characters, so a `renew_token` frame is logged whole, token included
|
|
|
239
239
|
`pyagorartc.session.wire`, set to INFO. A host that needs the frames can set
|
|
240
240
|
that logger to DEBUG on purpose; the session's own frame lines go through
|
|
241
241
|
`describe_frame` and carry no values.
|
|
242
|
+
|
|
243
|
+
## D28. The presence gate on subscribe is an option
|
|
244
|
+
|
|
245
|
+
HA-Luba subscribed to an announced stream only once its publisher's
|
|
246
|
+
`on_user_online` had been seen; PetKit subscribed on `on_add_video_stream`
|
|
247
|
+
alone, and its camera likely starts publishing after the join, so the gate
|
|
248
|
+
could hold its stream forever. `SessionOptions.subscribe_requires_online`
|
|
249
|
+
defaults to `True`, preserving the Mammotion rule; PetKit passes `False`,
|
|
250
|
+
which counts the announced uid as present so `on_user_offline` still tears
|
|
251
|
+
the subscription down. A held stream logs its uid at DEBUG. Q18 decides the
|
|
252
|
+
eventual default.
|
|
253
|
+
|
|
254
|
+
## D29. A quit or `p2p_lost` during `join()` fails the join with its own reason (amends D23)
|
|
255
|
+
|
|
256
|
+
The gateway sends the older session's 2003 quit when a second join on the
|
|
257
|
+
same uid lands, which can be right behind the older session's own join
|
|
258
|
+
result: the reader dispatches both before `join()` resumes. The handlers
|
|
259
|
+
used to act only on a joined session, so the quit was dropped and `join()`
|
|
260
|
+
answered for a session the gateway had already quit (a frozen feed in HA).
|
|
261
|
+
A quit, or `p2p_lost` with `end_on_p2p_lost`, that arrives before `join()`
|
|
262
|
+
has marked the session joined is recorded; `join()` then raises
|
|
263
|
+
`GatewayConnectError` and `on_closed` fires once with `GATEWAY_QUIT` /
|
|
264
|
+
`P2P_LOST`, not `JOIN_FAILED`: the join succeeded at the gateway and the
|
|
265
|
+
reason is what the host acts on. It is checked ahead of the socket-close
|
|
266
|
+
race, since the gateway closes the socket after the quit. One that arrives
|
|
267
|
+
before the result fails the join at once instead of waiting out the
|
|
268
|
+
timeout. `GatewayConnectError`, not `JoinRejectedError`: the join result was
|
|
269
|
+
a success, and `JoinRejectedError` carries a join-result code the gateway
|
|
270
|
+
never sent; this is the same shape as the socket-close race.
|