diff --git a/src/serviceworker/index.ts b/src/serviceworker/index.ts index 7d7de1da4c..169e68ede8 100644 --- a/src/serviceworker/index.ts +++ b/src/serviceworker/index.ts @@ -1,12 +1,12 @@ const serverSupportMap: { [serverUrl: string]: { - supportsMSC3916: boolean, - cacheExpires: number, - }, + supportsMSC3916: boolean; + cacheExpires: number; + }; } = {}; const credentialStore: { - [serverUrl: string]: string, + [serverUrl: string]: string; } = {}; // We skipWaiting() to update the service worker more frequently, particularly in development environments. @@ -16,7 +16,9 @@ skipWaiting(); self.addEventListener("message", (event) => { if (event.data?.type !== "credentials") return; // ignore credentialStore[event.data.homeserverUrl] = event.data.accessToken; - console.log(`[Service Worker] Updated access token for ${event.data.homeserverUrl} (accessToken? ${Boolean(event.data.accessToken)})`); + console.log( + `[Service Worker] Updated access token for ${event.data.homeserverUrl} (accessToken? ${Boolean(event.data.accessToken)})`, + ); }); // @ts-expect-error - getting types to work for this is difficult, so we anticipate that "addEventListener" doesn't @@ -38,40 +40,42 @@ self.addEventListener("fetch", (event: FetchEvent) => { if (url.includes("/_matrix/media/v3/download") || url.includes("/_matrix/media/v3/thumbnail")) { // We need to call respondWith synchronously, otherwise we may never execute properly. This means // later on we need to proxy the request through if it turns out the server doesn't support authentication. - event.respondWith((async (): Promise => { - // Figure out which homeserver we're communicating with - const csApi = url.substring(0, url.indexOf("/_matrix/media/v3")); + event.respondWith( + (async (): Promise => { + // Figure out which homeserver we're communicating with + const csApi = url.substring(0, url.indexOf("/_matrix/media/v3")); - // Locate our access token, and populate the fetchConfig with the authentication header. - const accessToken = credentialStore[csApi]; - let fetchConfig: {headers?: {[key: string]: string}} = {}; - if (accessToken) { - fetchConfig = { - headers: { - Authorization: `Bearer ${accessToken}`, - }, - }; - } + // Locate our access token, and populate the fetchConfig with the authentication header. + const accessToken = credentialStore[csApi]; + let fetchConfig: { headers?: { [key: string]: string } } = {}; + if (accessToken) { + fetchConfig = { + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }; + } - // Update or populate the server support map using a (usually) authenticated `/versions` call. - if (!serverSupportMap[csApi] || serverSupportMap[csApi].cacheExpires <= (new Date()).getTime()) { - const versions = await (await fetch(`${csApi}/_matrix/client/versions`, fetchConfig)).json(); - serverSupportMap[csApi] = { - supportsMSC3916: Boolean(versions?.unstable_features?.["org.matrix.msc3916"]), - cacheExpires: (new Date()).getTime() + (2 * 60 * 60 * 1000), // 2 hours from now - }; - } + // Update or populate the server support map using a (usually) authenticated `/versions` call. + if (!serverSupportMap[csApi] || serverSupportMap[csApi].cacheExpires <= new Date().getTime()) { + const versions = await (await fetch(`${csApi}/_matrix/client/versions`, fetchConfig)).json(); + serverSupportMap[csApi] = { + supportsMSC3916: Boolean(versions?.unstable_features?.["org.matrix.msc3916"]), + cacheExpires: new Date().getTime() + 2 * 60 * 60 * 1000, // 2 hours from now + }; + } - // If we have server support (and a means of authentication), rewrite the URL to use MSC3916 endpoints. - if (serverSupportMap[csApi].supportsMSC3916 && accessToken) { - // Currently unstable only. - url = url.replace(/\/media\/v3\/(.*)\//, "/client/unstable/org.matrix.msc3916/media/$1/"); - } // else by default we make no changes + // If we have server support (and a means of authentication), rewrite the URL to use MSC3916 endpoints. + if (serverSupportMap[csApi].supportsMSC3916 && accessToken) { + // Currently unstable only. + url = url.replace(/\/media\/v3\/(.*)\//, "/client/unstable/org.matrix.msc3916/media/$1/"); + } // else by default we make no changes - // Add authentication and send the request. We add authentication even if MSC3916 endpoints aren't - // being used to ensure patches like this work: - // https://github.com/matrix-org/synapse/commit/2390b66bf0ec3ff5ffb0c7333f3c9b239eeb92bb - return fetch(url, fetchConfig); - })()); + // Add authentication and send the request. We add authentication even if MSC3916 endpoints aren't + // being used to ensure patches like this work: + // https://github.com/matrix-org/synapse/commit/2390b66bf0ec3ff5ffb0c7333f3c9b239eeb92bb + return fetch(url, fetchConfig); + })(), + ); } }); diff --git a/src/vector/platform/WebPlatform.ts b/src/vector/platform/WebPlatform.ts index 1a734b3c43..0eb268e0c0 100644 --- a/src/vector/platform/WebPlatform.ts +++ b/src/vector/platform/WebPlatform.ts @@ -47,9 +47,10 @@ export default class WebPlatform extends VectorBasePlatform { // Register service worker if available on this platform if ("serviceWorker" in navigator) { // sw.js is exported by webpack, sourced from `/src/serviceworker/index.ts` - navigator.serviceWorker.register("sw.js") - .then(r => r.update()) - .catch(e => console.error("Error registering/updating service worker:", e)); + navigator.serviceWorker + .register("sw.js") + .then((r) => r.update()) + .catch((e) => console.error("Error registering/updating service worker:", e)); } }