appease the linter

pull/27326/head
Travis Ralston 2024-04-11 16:31:00 -06:00
parent 69817ca17a
commit 296c82c645
2 changed files with 44 additions and 39 deletions

View File

@ -1,12 +1,12 @@
const serverSupportMap: { const serverSupportMap: {
[serverUrl: string]: { [serverUrl: string]: {
supportsMSC3916: boolean, supportsMSC3916: boolean;
cacheExpires: number, cacheExpires: number;
}, };
} = {}; } = {};
const credentialStore: { const credentialStore: {
[serverUrl: string]: string, [serverUrl: string]: string;
} = {}; } = {};
// We skipWaiting() to update the service worker more frequently, particularly in development environments. // We skipWaiting() to update the service worker more frequently, particularly in development environments.
@ -16,7 +16,9 @@ skipWaiting();
self.addEventListener("message", (event) => { self.addEventListener("message", (event) => {
if (event.data?.type !== "credentials") return; // ignore if (event.data?.type !== "credentials") return; // ignore
credentialStore[event.data.homeserverUrl] = event.data.accessToken; 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 // @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")) { 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 // 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. // later on we need to proxy the request through if it turns out the server doesn't support authentication.
event.respondWith((async (): Promise<Response> => { event.respondWith(
// Figure out which homeserver we're communicating with (async (): Promise<Response> => {
const csApi = url.substring(0, url.indexOf("/_matrix/media/v3")); // 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. // Locate our access token, and populate the fetchConfig with the authentication header.
const accessToken = credentialStore[csApi]; const accessToken = credentialStore[csApi];
let fetchConfig: {headers?: {[key: string]: string}} = {}; let fetchConfig: { headers?: { [key: string]: string } } = {};
if (accessToken) { if (accessToken) {
fetchConfig = { fetchConfig = {
headers: { headers: {
Authorization: `Bearer ${accessToken}`, Authorization: `Bearer ${accessToken}`,
}, },
}; };
} }
// Update or populate the server support map using a (usually) authenticated `/versions` call. // Update or populate the server support map using a (usually) authenticated `/versions` call.
if (!serverSupportMap[csApi] || serverSupportMap[csApi].cacheExpires <= (new Date()).getTime()) { if (!serverSupportMap[csApi] || serverSupportMap[csApi].cacheExpires <= new Date().getTime()) {
const versions = await (await fetch(`${csApi}/_matrix/client/versions`, fetchConfig)).json(); const versions = await (await fetch(`${csApi}/_matrix/client/versions`, fetchConfig)).json();
serverSupportMap[csApi] = { serverSupportMap[csApi] = {
supportsMSC3916: Boolean(versions?.unstable_features?.["org.matrix.msc3916"]), supportsMSC3916: Boolean(versions?.unstable_features?.["org.matrix.msc3916"]),
cacheExpires: (new Date()).getTime() + (2 * 60 * 60 * 1000), // 2 hours from now 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 we have server support (and a means of authentication), rewrite the URL to use MSC3916 endpoints.
if (serverSupportMap[csApi].supportsMSC3916 && accessToken) { if (serverSupportMap[csApi].supportsMSC3916 && accessToken) {
// Currently unstable only. // Currently unstable only.
url = url.replace(/\/media\/v3\/(.*)\//, "/client/unstable/org.matrix.msc3916/media/$1/"); url = url.replace(/\/media\/v3\/(.*)\//, "/client/unstable/org.matrix.msc3916/media/$1/");
} // else by default we make no changes } // else by default we make no changes
// Add authentication and send the request. We add authentication even if MSC3916 endpoints aren't // Add authentication and send the request. We add authentication even if MSC3916 endpoints aren't
// being used to ensure patches like this work: // being used to ensure patches like this work:
// https://github.com/matrix-org/synapse/commit/2390b66bf0ec3ff5ffb0c7333f3c9b239eeb92bb // https://github.com/matrix-org/synapse/commit/2390b66bf0ec3ff5ffb0c7333f3c9b239eeb92bb
return fetch(url, fetchConfig); return fetch(url, fetchConfig);
})()); })(),
);
} }
}); });

View File

@ -47,9 +47,10 @@ export default class WebPlatform extends VectorBasePlatform {
// Register service worker if available on this platform // Register service worker if available on this platform
if ("serviceWorker" in navigator) { if ("serviceWorker" in navigator) {
// sw.js is exported by webpack, sourced from `/src/serviceworker/index.ts` // sw.js is exported by webpack, sourced from `/src/serviceworker/index.ts`
navigator.serviceWorker.register("sw.js") navigator.serviceWorker
.then(r => r.update()) .register("sw.js")
.catch(e => console.error("Error registering/updating service worker:", e)); .then((r) => r.update())
.catch((e) => console.error("Error registering/updating service worker:", e));
} }
} }