appease the linter
parent
69817ca17a
commit
296c82c645
|
@ -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);
|
||||||
})());
|
})(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue