Continue even if localstorage is inaccessible (#678)

* Ignore storage failures

* changelog
This commit is contained in:
Will Hunt 2023-03-23 13:56:46 +00:00 committed by GitHub
parent 61f25fae36
commit b5b86d45da
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 12 deletions

1
changelog.d/678.bugfix Normal file
View File

@ -0,0 +1 @@
Ensure the widget still works without needing to store local storage data.

View File

@ -23,20 +23,27 @@ interface RequestOpts {
}
export class BridgeAPI {
static async getBridgeAPI(baseUrl: string, widgetApi: WidgetApi): Promise<BridgeAPI> {
const sessionToken = localStorage.getItem('hookshot-sessionToken');
baseUrl = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl;
if (sessionToken) {
const client = new BridgeAPI(baseUrl, sessionToken);
try {
await client.verify();
return client;
} catch (ex) {
// TODO: Check that the token is actually invalid, rather than just assuming we need to refresh.
console.warn(`Failed to verify token, fetching new token`, ex);
localStorage.removeItem(sessionToken);
try {
const sessionToken = localStorage.getItem('hookshot-sessionToken');
baseUrl = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl;
if (sessionToken) {
const client = new BridgeAPI(baseUrl, sessionToken);
try {
await client.verify();
return client;
} catch (ex) {
// TODO: Check that the token is actually invalid, rather than just assuming we need to refresh.
console.warn(`Failed to verify token, fetching new token`, ex);
localStorage.removeItem(sessionToken);
}
}
} catch (ex) {
// E.g. Browser prevents storage access.
console.debug(`Failed to fetch session token, requesting new token`, ex);
}
const creds = await widgetApi.requestOpenIDConnectToken();
const { matrix_server_name, access_token } = creds;
// eslint-disable-next-line camelcase
@ -66,7 +73,12 @@ export class BridgeAPI {
}
}
const response = await res.json() as ExchangeOpenAPIResponseBody;
localStorage.setItem('hookshot-sessionToken', response.token);
try {
localStorage.setItem('hookshot-sessionToken', response.token);
} catch (ex) {
// E.g. Browser prevents storage access.
console.debug(`Failed to store session token, continuing`, ex);
}
return new BridgeAPI(baseUrl, response.token);
}