diff --git a/src/matrix/Client.js b/src/matrix/Client.js index 49f24d691f..a950ba9a6e 100644 --- a/src/matrix/Client.js +++ b/src/matrix/Client.js @@ -289,6 +289,10 @@ export class Client { platform: this._platform, serverVersions: lastVersionsResponse.versions, }); + + // Let the serviceWorkerHandler know of this access-token + this._platform.updateService.setAccessToken(sessionInfo.accessToken); + this._session = new Session({ storage: this._storage, sessionInfo: filteredSessionInfo, @@ -378,6 +382,7 @@ export class Client { throw Error("No session loaded, cannot update access token"); } this._session.updateAccessToken(token); + await this._platform.updateService.setAccessToken(token); await this._platform.sessionInfoStorage.updateAccessToken(this._sessionId, token); } diff --git a/src/platform/web/dom/ServiceWorkerHandler.js b/src/platform/web/dom/ServiceWorkerHandler.js index 84f499a818..1fd836bf04 100644 --- a/src/platform/web/dom/ServiceWorkerHandler.js +++ b/src/platform/web/dom/ServiceWorkerHandler.js @@ -28,12 +28,21 @@ export class ServiceWorkerHandler { this._currentController = null; this._sessionInfoStorage = sessionInfoStorage; this.haltRequests = false; + this._accessToken = null; } setNavigation(navigation) { this._navigation = navigation; } + /** + * Set the access-token to be used within the service worker. + * @param token An access-token + */ + setAccessToken(token) { + this._accessToken = token; + } + registerAndStart(path) { this._registrationPromise = (async () => { navigator.serviceWorker.addEventListener("message", this); @@ -88,24 +97,13 @@ export class ServiceWorkerHandler { } else if (data.type === "openRoom") { this._navigation.push("room", data.payload.roomId); } else if (data.type === "getAccessToken") { - const token = await this._getLatestAccessToken(); - event.source.postMessage({ replyTo: data.id, payload: token }); + event.source.postMessage({ + replyTo: data.id, + payload: this._accessToken, + }); } } - /** - * Fetch access-token from the storage - * @returns access token as string - */ - async _getLatestAccessToken() { - const currentSessionId = this._navigation?.path.get("session")?.value; - if (!currentSessionId) return null; - const { accessToken } = await this._sessionInfoStorage.get( - currentSessionId - ); - return accessToken; - } - _closeSessionIfNeeded(sessionId) { const currentSession = this._navigation?.path.get("session"); if (sessionId && currentSession?.value === sessionId) { diff --git a/src/platform/web/sw.js b/src/platform/web/sw.js index 96b2f4521e..4f16659d8d 100644 --- a/src/platform/web/sw.js +++ b/src/platform/web/sw.js @@ -132,6 +132,11 @@ async function handleRequest({ request, clientId }) { "getAccessToken", {} ); + if (!accessToken) { + throw new Error( + "Token returned from getAccessToken message in sw.js is null" + ); + } headers.set("authorization", `Bearer ${accessToken}`); request = new Request(request, { mode: "cors",