feat: CI regression: offline artifact browser journey does not file after reconnect #918
|
|
@ -36,6 +36,7 @@
|
||||||
root.fetch = boundary.fetch;
|
root.fetch = boundary.fetch;
|
||||||
const attach = () => {
|
const attach = () => {
|
||||||
boundary.startActivityHeartbeat();
|
boundary.startActivityHeartbeat();
|
||||||
|
boundary.startReconnectResume();
|
||||||
const button = root.document.getElementById('sign-out');
|
const button = root.document.getElementById('sign-out');
|
||||||
if (button) button.addEventListener('click', () => boundary.signOut());
|
if (button) button.addEventListener('click', () => boundary.signOut());
|
||||||
const allDevicesButton = root.document.getElementById('sign-out-all');
|
const allDevicesButton = root.document.getElementById('sign-out-all');
|
||||||
|
|
@ -387,6 +388,12 @@
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function startReconnectResume() {
|
||||||
|
addActivityListener?.('online', async () => {
|
||||||
|
if (await refreshOfflineLease()) await resumeQueuedWork();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
async function refreshOfflineLease() {
|
async function refreshOfflineLease() {
|
||||||
try {
|
try {
|
||||||
const response = await sessionFetch(base + 'api/v1/session');
|
const response = await sessionFetch(base + 'api/v1/session');
|
||||||
|
|
@ -617,6 +624,7 @@
|
||||||
handleServiceWorkerMessage,
|
handleServiceWorkerMessage,
|
||||||
refreshOfflineLease,
|
refreshOfflineLease,
|
||||||
resumeQueuedWork,
|
resumeQueuedWork,
|
||||||
|
startReconnectResume,
|
||||||
recordActivity,
|
recordActivity,
|
||||||
startActivityHeartbeat,
|
startActivityHeartbeat,
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -809,6 +809,28 @@ process.stdout.write(JSON.stringify(state));
|
||||||
assert result["workerMessages"] == [{"type": "stackchain-resume-outbox"}]
|
assert result["workerMessages"] == [{"type": "stackchain-resume-outbox"}]
|
||||||
|
|
||||||
|
|
||||||
|
def test_reconnect_requests_queued_delivery_resume_after_offline_reload():
|
||||||
|
result = run_session_scenario(
|
||||||
|
"""
|
||||||
|
boundary.startReconnectResume();
|
||||||
|
state.responsePayload = {authenticated:true, expires_at:200000, idle_expires_at:150000};
|
||||||
|
await state.activityListeners.online();
|
||||||
|
await new Promise(resolve => setTimeout(resolve, 0));
|
||||||
|
process.stdout.write(JSON.stringify(state));
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result["requests"][0]["url"] == "/dashboard/api/v1/session"
|
||||||
|
assert result["workerMessages"] == [
|
||||||
|
{
|
||||||
|
"type": "stackchain-session-lease",
|
||||||
|
"expiresAt": 200000,
|
||||||
|
"idleExpiresAt": 150000,
|
||||||
|
},
|
||||||
|
{"type": "stackchain-resume-outbox"},
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.anyio
|
@pytest.mark.anyio
|
||||||
async def test_dashboard_loads_session_boundary_first_and_offers_sign_out():
|
async def test_dashboard_loads_session_boundary_first_and_offers_sign_out():
|
||||||
html = await dashboard()
|
html = await dashboard()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user