Диагностика запуска live-камеры в интерфейсе
This commit is contained in:
@@ -261,6 +261,18 @@ export function MseFmp4WebSocketPlayer({
|
|||||||
});
|
});
|
||||||
activeDiagnosticRef.current = diagnosticLifecycle;
|
activeDiagnosticRef.current = diagnosticLifecycle;
|
||||||
diagnosticLifecycle.verifyBuild();
|
diagnosticLifecycle.verifyBuild();
|
||||||
|
diagnosticLifecycle.post({
|
||||||
|
eventCode: "live_camera_player_effect_started",
|
||||||
|
streamId: delivery.id,
|
||||||
|
transportEpoch,
|
||||||
|
});
|
||||||
|
if (!recoveryAuthorityIdentity) {
|
||||||
|
diagnosticLifecycle.post({
|
||||||
|
eventCode: "live_camera_playback_authority_missing",
|
||||||
|
streamId: delivery.id,
|
||||||
|
transportEpoch,
|
||||||
|
});
|
||||||
|
}
|
||||||
const transportIsCurrent = () => cameraTransportCallbackIsCurrent(
|
const transportIsCurrent = () => cameraTransportCallbackIsCurrent(
|
||||||
transportEpochRef.current,
|
transportEpochRef.current,
|
||||||
transportEpoch,
|
transportEpoch,
|
||||||
@@ -473,6 +485,11 @@ export function MseFmp4WebSocketPlayer({
|
|||||||
|
|
||||||
const onSourceOpen = () => {
|
const onSourceOpen = () => {
|
||||||
if (!transportIsCurrent() || failed) return;
|
if (!transportIsCurrent() || failed) return;
|
||||||
|
diagnosticLifecycle.post({
|
||||||
|
eventCode: "live_camera_media_source_open",
|
||||||
|
streamId: delivery.id,
|
||||||
|
transportEpoch,
|
||||||
|
});
|
||||||
try {
|
try {
|
||||||
sourceBuffer = mediaSource.addSourceBuffer(mediaType);
|
sourceBuffer = mediaSource.addSourceBuffer(mediaType);
|
||||||
} catch {
|
} catch {
|
||||||
@@ -525,6 +542,11 @@ export function MseFmp4WebSocketPlayer({
|
|||||||
socket.binaryType = "arraybuffer";
|
socket.binaryType = "arraybuffer";
|
||||||
socket.addEventListener("open", () => {
|
socket.addEventListener("open", () => {
|
||||||
if (!transportIsCurrent() || failed) return;
|
if (!transportIsCurrent() || failed) return;
|
||||||
|
diagnosticLifecycle.post({
|
||||||
|
eventCode: "live_camera_websocket_open",
|
||||||
|
streamId: delivery.id,
|
||||||
|
transportEpoch,
|
||||||
|
});
|
||||||
startupWatchdog?.armFirstMedia();
|
startupWatchdog?.armFirstMedia();
|
||||||
setStatus("buffering");
|
setStatus("buffering");
|
||||||
setMessage(recovering
|
setMessage(recovering
|
||||||
|
|||||||
@@ -7,6 +7,10 @@ export type LiveViewerDiagnosticEventCode =
|
|||||||
| "live_receiver_error"
|
| "live_receiver_error"
|
||||||
| "live_camera_source_projected"
|
| "live_camera_source_projected"
|
||||||
| "live_camera_window_admitted"
|
| "live_camera_window_admitted"
|
||||||
|
| "live_camera_player_effect_started"
|
||||||
|
| "live_camera_playback_authority_missing"
|
||||||
|
| "live_camera_media_source_open"
|
||||||
|
| "live_camera_websocket_open"
|
||||||
| "live_camera_transport_restart_requested"
|
| "live_camera_transport_restart_requested"
|
||||||
| "live_camera_transport_playing";
|
| "live_camera_transport_playing";
|
||||||
|
|
||||||
|
|||||||
@@ -203,6 +203,24 @@ test("live camera registers sourceopen before assigning the MSE object URL", asy
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("live camera reports each browser startup boundary without device actions", async () => {
|
||||||
|
const source = await readFile(
|
||||||
|
new URL("../src/components/MseFmp4WebSocketPlayer.tsx", import.meta.url),
|
||||||
|
"utf8",
|
||||||
|
);
|
||||||
|
for (const eventCode of [
|
||||||
|
"live_camera_player_effect_started",
|
||||||
|
"live_camera_playback_authority_missing",
|
||||||
|
"live_camera_media_source_open",
|
||||||
|
"live_camera_websocket_open",
|
||||||
|
]) {
|
||||||
|
assert.ok(
|
||||||
|
source.includes(`eventCode: "${eventCode}"`),
|
||||||
|
`missing bounded player diagnostic ${eventCode}`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
test("recorded observation timeline clamps relative seek time without epoch precision in the UI", () => {
|
test("recorded observation timeline clamps relative seek time without epoch precision in the UI", () => {
|
||||||
const range = normalizeTimelineRange({
|
const range = normalizeTimelineRange({
|
||||||
min: 0,
|
min: 0,
|
||||||
|
|||||||
@@ -20,6 +20,10 @@ LiveViewerEventCode = Literal[
|
|||||||
"live_receiver_error",
|
"live_receiver_error",
|
||||||
"live_camera_source_projected",
|
"live_camera_source_projected",
|
||||||
"live_camera_window_admitted",
|
"live_camera_window_admitted",
|
||||||
|
"live_camera_player_effect_started",
|
||||||
|
"live_camera_playback_authority_missing",
|
||||||
|
"live_camera_media_source_open",
|
||||||
|
"live_camera_websocket_open",
|
||||||
"live_camera_transport_restart_requested",
|
"live_camera_transport_restart_requested",
|
||||||
"live_camera_transport_playing",
|
"live_camera_transport_playing",
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -247,6 +247,10 @@ def test_live_viewer_diagnostic_endpoint_accepts_only_bounded_events(
|
|||||||
for event_code in (
|
for event_code in (
|
||||||
"live_camera_source_projected",
|
"live_camera_source_projected",
|
||||||
"live_camera_window_admitted",
|
"live_camera_window_admitted",
|
||||||
|
"live_camera_player_effect_started",
|
||||||
|
"live_camera_playback_authority_missing",
|
||||||
|
"live_camera_media_source_open",
|
||||||
|
"live_camera_websocket_open",
|
||||||
):
|
):
|
||||||
boundary_event = LiveViewerDiagnosticEvent(
|
boundary_event = LiveViewerDiagnosticEvent(
|
||||||
schema_version="missioncore.live-viewer-diagnostic/v2",
|
schema_version="missioncore.live-viewer-diagnostic/v2",
|
||||||
@@ -256,6 +260,12 @@ def test_live_viewer_diagnostic_endpoint_accepts_only_bounded_events(
|
|||||||
viewer_instance_id="00000000-0000-4000-8000-000000000004",
|
viewer_instance_id="00000000-0000-4000-8000-000000000004",
|
||||||
lifecycle_generation=1,
|
lifecycle_generation=1,
|
||||||
stream_id="camera-preview-2",
|
stream_id="camera-preview-2",
|
||||||
|
transport_epoch=(
|
||||||
|
1
|
||||||
|
if event_code
|
||||||
|
not in {"live_camera_source_projected", "live_camera_window_admitted"}
|
||||||
|
else None
|
||||||
|
),
|
||||||
)
|
)
|
||||||
with caplog.at_level(
|
with caplog.at_level(
|
||||||
logging.INFO,
|
logging.INFO,
|
||||||
|
|||||||
Reference in New Issue
Block a user