Skip to content

Commit 0270151

Browse files
committed
app: fix remote connection not beeing restored after app was sleeping for a long time.
1 parent 31b26e7 commit 0270151

File tree

4 files changed

+41
-26
lines changed

4 files changed

+41
-26
lines changed

frontend/src/components/Frame.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import Worker from '../worker?worker'
55
import { Row, Spinner } from 'react-bootstrap';
66
import { connected, connected_to, secret } from './charger_list';
77
import { setAppNavigation } from './Navbar';
8-
import { enableLogging } from '../utils';
8+
import { enableLogging, refreshPromise } from '../utils';
99
import Median from "median-js-bridge";
1010
import i18n from '../i18n';
1111

@@ -50,8 +50,10 @@ export class Frame extends Component {
5050
}
5151

5252
// used by the app to detect a resumed app
53-
window.addEventListener("appResumed", () => {
53+
window.addEventListener("appResumed", async () => {
5454
this.worker.terminate();
55+
this.worker = null;
56+
await refreshPromise;
5557
this.startWorker();
5658
this.show_spinner.value = true;
5759

frontend/src/index.tsx

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import Tabs from "react-bootstrap/Tabs";
3232
import Tab from "react-bootstrap/Tab";
3333
import { ChargerList } from './pages/chargers.js';
3434
import { ErrorAlert } from './components/Alert.js';
35-
import { BACKEND } from './utils';
35+
import { refresh_access_token } from './utils';
3636
import { AppState, loggedIn } from './utils.js';
3737
import { Col, Spinner } from 'react-bootstrap';
3838
import { Recovery } from './pages/recovery.js';
@@ -42,29 +42,6 @@ import { Footer } from "./components/Footer";
4242

4343
import "./main.scss";
4444

45-
async function refresh_access_token() {
46-
if (window.location.pathname == "/recovery") {
47-
loggedIn.value = AppState.Recovery;
48-
return;
49-
}
50-
51-
const resp = await fetch(BACKEND + "/auth/jwt_refresh", {
52-
method: "GET",
53-
credentials: "include"
54-
});
55-
56-
if (resp.status == 200) {
57-
if (!localStorage.getItem("loginKey") || !localStorage.getItem("secretKey")) {
58-
logout(false);
59-
}
60-
loggedIn.value = AppState.LoggedIn;
61-
} else {
62-
localStorage.removeItem("loginKey");
63-
localStorage.removeItem("secretKey");
64-
loggedIn.value = AppState.LoggedOut;
65-
}
66-
}
67-
6845
refresh_access_token().then(() => {
6946
if (loggedIn.value === AppState.LoggedIn) {
7047
setInterval(async () => {

frontend/src/utils.tsx

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { signal } from "@preact/signals";
22
import { hash, ArgonType } from "argon2-browser";
3+
import { logout } from "./components/Navbar";
34

45
export async function get_salt() {
56
const resp = await fetch(`${BACKEND}/auth/generate_salt`, {
@@ -79,3 +80,34 @@ window.addEventListener("keydown", (e: KeyboardEvent) => {
7980
enableLogging = true;
8081
}
8182
})
83+
84+
// This promise is used to synchronize the timeout and Frame component refreshing the access token
85+
export let refreshPromise: Promise<void>;
86+
87+
// This function must be called only at one place. Use the promise instead if you need to ensure that you have a valid token.
88+
export async function refresh_access_token() {
89+
refreshPromise = new Promise(async (resolve, reject) => {
90+
if (window.location.pathname == "/recovery") {
91+
loggedIn.value = AppState.Recovery;
92+
return;
93+
}
94+
95+
const resp = await fetch(BACKEND + "/auth/jwt_refresh", {
96+
method: "GET",
97+
credentials: "include"
98+
});
99+
100+
if (resp.status == 200) {
101+
if (!localStorage.getItem("loginKey") || !localStorage.getItem("secretKey")) {
102+
logout(false);
103+
}
104+
loggedIn.value = AppState.LoggedIn;
105+
} else {
106+
localStorage.removeItem("loginKey");
107+
localStorage.removeItem("secretKey");
108+
loggedIn.value = AppState.LoggedOut;
109+
}
110+
resolve();
111+
});
112+
await refreshPromise;
113+
}

frontend/src/worker.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,10 @@ async function start_connection(setup_data: SetupMessage) {
130130
disconnect_cb();
131131
return;
132132
}
133+
if (resp.status !== 200) {
134+
disconnect_cb();
135+
return;
136+
}
133137
const keys = await resp.json();
134138
const decrypted_keys = decrypt_keys(keys, setup_data.secret);
135139

0 commit comments

Comments
 (0)