Диагностика запуска live-камеры в интерфейсе
This commit is contained in:
@@ -261,6 +261,18 @@ export function MseFmp4WebSocketPlayer({
|
||||
});
|
||||
activeDiagnosticRef.current = diagnosticLifecycle;
|
||||
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(
|
||||
transportEpochRef.current,
|
||||
transportEpoch,
|
||||
@@ -473,6 +485,11 @@ export function MseFmp4WebSocketPlayer({
|
||||
|
||||
const onSourceOpen = () => {
|
||||
if (!transportIsCurrent() || failed) return;
|
||||
diagnosticLifecycle.post({
|
||||
eventCode: "live_camera_media_source_open",
|
||||
streamId: delivery.id,
|
||||
transportEpoch,
|
||||
});
|
||||
try {
|
||||
sourceBuffer = mediaSource.addSourceBuffer(mediaType);
|
||||
} catch {
|
||||
@@ -525,6 +542,11 @@ export function MseFmp4WebSocketPlayer({
|
||||
socket.binaryType = "arraybuffer";
|
||||
socket.addEventListener("open", () => {
|
||||
if (!transportIsCurrent() || failed) return;
|
||||
diagnosticLifecycle.post({
|
||||
eventCode: "live_camera_websocket_open",
|
||||
streamId: delivery.id,
|
||||
transportEpoch,
|
||||
});
|
||||
startupWatchdog?.armFirstMedia();
|
||||
setStatus("buffering");
|
||||
setMessage(recovering
|
||||
|
||||
@@ -7,6 +7,10 @@ export type LiveViewerDiagnosticEventCode =
|
||||
| "live_receiver_error"
|
||||
| "live_camera_source_projected"
|
||||
| "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_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", () => {
|
||||
const range = normalizeTimelineRange({
|
||||
min: 0,
|
||||
|
||||
Reference in New Issue
Block a user