fix: recover workbench session switchback hydration
This commit is contained in:
@@ -1748,11 +1748,22 @@ async function switchAwayAndBack(command) {
|
|||||||
const switchAway = await clickSession(alternateSessionId);
|
const switchAway = await clickSession(alternateSessionId);
|
||||||
const awaySettle = await waitForWorkbenchSessionHydrated(page, alternateSessionId, { timeoutMs: 15000 });
|
const awaySettle = await waitForWorkbenchSessionHydrated(page, alternateSessionId, { timeoutMs: 15000 });
|
||||||
const away = awaySettle.snapshot ?? await workbenchSessionSnapshot();
|
const away = awaySettle.snapshot ?? await workbenchSessionSnapshot();
|
||||||
const switchBack = await gotoTarget("/workbench/sessions/" + encodeURIComponent(canarySessionId));
|
let switchBack = await gotoTarget("/workbench/sessions/" + encodeURIComponent(canarySessionId));
|
||||||
const backSettle = await waitForWorkbenchSessionHydrated(page, canarySessionId, { timeoutMs: 15000 });
|
let backSettle = await waitForWorkbenchSessionHydrated(page, canarySessionId, { timeoutMs: 15000 });
|
||||||
const after = backSettle.snapshot ?? await workbenchSessionSnapshot();
|
let after = backSettle.snapshot ?? await workbenchSessionSnapshot();
|
||||||
const routeOk = after?.routeSessionId === canarySessionId;
|
let switchBackRecovery = null;
|
||||||
const activeOk = after?.activeSessionId === canarySessionId;
|
let routeOk = after?.routeSessionId === canarySessionId;
|
||||||
|
let activeOk = after?.activeSessionId === canarySessionId;
|
||||||
|
if (!routeOk || !activeOk) {
|
||||||
|
switchBackRecovery = await recoverControlPageSessionHydration(canarySessionId, backSettle);
|
||||||
|
if (switchBackRecovery?.ok === true) {
|
||||||
|
switchBack = { ...switchBack, recoveryApplied: true, recoveryNavigation: switchBackRecovery.navigation, valuesRedacted: true };
|
||||||
|
backSettle = switchBackRecovery.settle;
|
||||||
|
after = switchBackRecovery.snapshot ?? after;
|
||||||
|
routeOk = after?.routeSessionId === canarySessionId;
|
||||||
|
activeOk = after?.activeSessionId === canarySessionId;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (awaySettle.ok !== true) {
|
if (awaySettle.ok !== true) {
|
||||||
const error = new Error("switchAwayAndBack did not settle on the alternate session");
|
const error = new Error("switchAwayAndBack did not settle on the alternate session");
|
||||||
error.details = { canarySessionId, alternateSessionId, routeSessionId: away?.routeSessionId ?? null, activeSessionId: away?.activeSessionId ?? null, settle: awaySettle, pageId, valuesRedacted: true };
|
error.details = { canarySessionId, alternateSessionId, routeSessionId: away?.routeSessionId ?? null, activeSessionId: away?.activeSessionId ?? null, settle: awaySettle, pageId, valuesRedacted: true };
|
||||||
@@ -1760,7 +1771,7 @@ async function switchAwayAndBack(command) {
|
|||||||
}
|
}
|
||||||
if (!routeOk || !activeOk) {
|
if (!routeOk || !activeOk) {
|
||||||
const error = new Error("switchAwayAndBack did not return to the canary session");
|
const error = new Error("switchAwayAndBack did not return to the canary session");
|
||||||
error.details = { canarySessionId, alternateSessionId, routeSessionId: after?.routeSessionId ?? null, activeSessionId: after?.activeSessionId ?? null, settle: backSettle, pageId, valuesRedacted: true };
|
error.details = { canarySessionId, alternateSessionId, routeSessionId: after?.routeSessionId ?? null, activeSessionId: after?.activeSessionId ?? null, settle: backSettle, recovery: switchBackRecovery, pageId, valuesRedacted: true };
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
@@ -1784,6 +1795,7 @@ async function switchAwayAndBack(command) {
|
|||||||
},
|
},
|
||||||
switchBack,
|
switchBack,
|
||||||
backSettle,
|
backSettle,
|
||||||
|
switchBackRecovery,
|
||||||
routeSessionId: after?.routeSessionId ?? null,
|
routeSessionId: after?.routeSessionId ?? null,
|
||||||
activeSessionId: after?.activeSessionId ?? null,
|
activeSessionId: after?.activeSessionId ?? null,
|
||||||
routeOk,
|
routeOk,
|
||||||
@@ -1794,6 +1806,39 @@ async function switchAwayAndBack(command) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function recoverControlPageSessionHydration(sessionId, previousSettle) {
|
||||||
|
const observerHydration = observerPage && !observerPage.isClosed()
|
||||||
|
? await waitForWorkbenchSessionHydrated(observerPage, sessionId, { timeoutMs: 5000 })
|
||||||
|
: { ok: false, reason: "observer-page-unavailable", valuesRedacted: true };
|
||||||
|
if (observerHydration.ok !== true) {
|
||||||
|
return { ok: false, attempted: false, reason: "observer-session-not-hydrated", previousSettle, observerHydration, valuesRedacted: true };
|
||||||
|
}
|
||||||
|
await recreateControlPageForNavigation("switch-back-hydration-retry", 1);
|
||||||
|
const navigation = await gotoTarget("/workbench/sessions/" + encodeURIComponent(sessionId));
|
||||||
|
const settle = await waitForWorkbenchSessionHydrated(page, sessionId, { timeoutMs: 15000 });
|
||||||
|
const snapshot = settle.snapshot ?? await workbenchSessionSnapshot();
|
||||||
|
const routeOk = snapshot?.routeSessionId === sessionId;
|
||||||
|
const activeOk = snapshot?.activeSessionId === sessionId;
|
||||||
|
return {
|
||||||
|
ok: settle.ok === true && routeOk && activeOk,
|
||||||
|
attempted: true,
|
||||||
|
reason: settle.ok === true ? "control-page-recreated" : settle.reason || "control-session-hydration-retry-failed",
|
||||||
|
previousSettle,
|
||||||
|
observerHydration,
|
||||||
|
navigation,
|
||||||
|
settle,
|
||||||
|
snapshot: {
|
||||||
|
routeSessionId: snapshot?.routeSessionId ?? null,
|
||||||
|
activeSessionId: snapshot?.activeSessionId ?? null,
|
||||||
|
composerReady: snapshot?.composerReady === true,
|
||||||
|
messageCount: snapshot?.messageCount ?? null,
|
||||||
|
valuesRedacted: true,
|
||||||
|
},
|
||||||
|
pageId,
|
||||||
|
valuesRedacted: true,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
async function assertSessionInvariant(command) {
|
async function assertSessionInvariant(command) {
|
||||||
const beforeUrl = currentPageUrl();
|
const beforeUrl = currentPageUrl();
|
||||||
const snapshot = await workbenchSessionSnapshot();
|
const snapshot = await workbenchSessionSnapshot();
|
||||||
|
|||||||
Reference in New Issue
Block a user