Allow fetches for "stream"

Ref:
- https://github.com/electron/electron/issues/40362
This commit is contained in:
Manav Rathi 2024-04-15 15:05:00 +05:30
parent 2a425b0f9b
commit 057fe9bbb1
No known key found for this signature in database

View file

@ -58,6 +58,21 @@ export const allowWindowClose = (): void => {
shouldAllowWindowClose = true; shouldAllowWindowClose = true;
}; };
/**
* Log a standard startup banner.
*
* This helps us identify app starts and other environment details in the logs.
*/
const logStartupBanner = () => {
const version = isDev ? "dev" : app.getVersion();
log.info(`Starting ente-photos-desktop ${version}`);
const platform = process.platform;
const osRelease = os.release();
const systemVersion = process.getSystemVersion();
log.info("Running on", { platform, osRelease, systemVersion });
};
/** /**
* next-electron-server allows up to directly use the output of `next build` in * next-electron-server allows up to directly use the output of `next build` in
* production mode and `next dev` in development mode, whilst keeping the rest * production mode and `next dev` in development mode, whilst keeping the rest
@ -74,18 +89,53 @@ export const allowWindowClose = (): void => {
const setupRendererServer = () => serveNextAt(rendererURL); const setupRendererServer = () => serveNextAt(rendererURL);
/** /**
* Log a standard startup banner. * Register privileged schemes.
* *
* This helps us identify app starts and other environment details in the logs. * We have two priviliged schemes:
*
* 1. "ente", used for serving our web app (@see {@link setupRendererServer}).
*
* 2. "stream", used for streaming IPC (@see {@link registerStreamProtocol}).
*
* Both of these need some privileges, however, the documentation for Electron's
* registerSchemesAsPrivileged says:
*
* > This method ... can be called only once.
* >
* > https://www.electronjs.org/docs/latest/api/protocol#protocolisprotocolregisteredscheme-deprecated
*
* The library we use for the "ente" scheme already calls it once when we invoke
* {@link setupRendererServer}. Luckily, in practice it seems that the last call
* wins, and we don't need to modify the next-electron-server to prevent it from
* calling registerSchemesAsPrivileged. Instead, both schemes get registered
* fine, but we do need to repeat what next-electron-server had done.
*/ */
const logStartupBanner = () => { const registerPrivilegedSchemes = () => {
const version = isDev ? "dev" : app.getVersion(); protocol.registerSchemesAsPrivileged([
log.info(`Starting ente-photos-desktop ${version}`); {
scheme: "ente",
const platform = process.platform; privileges: {
const osRelease = os.release(); standard: true,
const systemVersion = process.getSystemVersion(); secure: true,
log.info("Running on", { platform, osRelease, systemVersion }); allowServiceWorkers: true,
supportFetchAPI: true,
corsEnabled: true,
},
},
{
scheme: "stream",
privileges: {
// standard: true,
// secure: true,
// supportFetchAPI: true,
standard: true,
secure: true,
allowServiceWorkers: true,
supportFetchAPI: true,
corsEnabled: true,
},
},
]);
}; };
/** /**
@ -228,6 +278,8 @@ const setupTrayItem = (mainWindow: BrowserWindow) => {
* streaming the response. * streaming the response.
* *
* See also: [Note: Transferring large amount of data over IPC] * See also: [Note: Transferring large amount of data over IPC]
*
* Depends on: {@link registerPrivilegedSchemes}
*/ */
const registerStreamProtocol = () => { const registerStreamProtocol = () => {
protocol.handle("stream", (request: Request) => { protocol.handle("stream", (request: Request) => {
@ -275,8 +327,10 @@ const main = () => {
let mainWindow: BrowserWindow | undefined; let mainWindow: BrowserWindow | undefined;
initLogging(); initLogging();
setupRendererServer();
logStartupBanner(); logStartupBanner();
// The order of the next two calls is important
setupRendererServer();
registerPrivilegedSchemes();
increaseDiskCache(); increaseDiskCache();
app.on("second-instance", () => { app.on("second-instance", () => {