Receive single-leg stance progress and metrics from an embedded fall risk test.
Embed /fall-risk/{fallRiskResultId}/single-leg-stance, usually using the
singleLegStanceTestUrl returned by the fall risk create route:
<iframe
id="singleLegStanceIframe"
title="Single-leg stance test"
src="https://your-client.gofa.app/fall-risk/result-id/single-leg-stance"
allow="camera; microphone"
></iframe>Messages use source: "gofa-single-leg-stance".
type | Payload | Meaning |
|---|---|---|
STATE_TRANSITION | State and current metrics | The flow changed state. |
ASSESSMENT_STARTED | Current metrics | The timed assessment began. |
ASSESSMENT_ENDED | Final metrics | The timed assessment ended. |
RESULTS_SET | elapsedSeconds and shoulderTilts | Final metrics were set. |
TIMER_COMPLETE | None | The 10-second timer completed. |
TIMER_ERROR | Error payload | The timer reported an error. |
EARLY_EXIT | None | The participant exited early. |
SHOULDER_TILT_UPDATE | Runtime tilt update | A live shoulder-tilt measurement was emitted. |
elapsedSeconds is capped at 10 in the current result model. Intermediate
metrics may be incomplete; use RESULTS_SET or retrieve the authenticated
result after completion.
const iframe = document.getElementById("singleLegStanceIframe") as HTMLIFrameElement | null;
const expectedOrigin = "https://your-client.gofa.app";
window.addEventListener("message", (event) => {
const { source, type, payload } = event.data ?? {};
if (
event.origin !== expectedOrigin ||
event.source !== iframe?.contentWindow ||
source !== "gofa-single-leg-stance"
) return;
if (type === "ASSESSMENT_ENDED" || type === "RESULTS_SET") {
handleCompletedTest(payload?.metrics ?? payload);
} else if (type === "EARLY_EXIT") {
handleEarlyExit();
}
});The page posts with a wildcard target origin for compatibility. The receiver
must check event.origin, event.source, source, and the payload before
using any camera-derived metric.