From 5ee98de92a16af7574cfd7dfa383a98deffb249a Mon Sep 17 00:00:00 2001 From: Alexander Drozdov Date: Sat, 18 Jul 2020 12:48:06 +0300 Subject: [PATCH] file protocol --- src/background.ts | 6 +++++- src/ipc/ipc-event.ts | 2 ++ src/ipc/main-process-bindings.ts | 6 ++++++ src/main/app-file-protocol.ts | 22 ++++++++++++++++++++++ src/main/overlay-window.ts | 2 -- 5 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 src/main/app-file-protocol.ts diff --git a/src/background.ts b/src/background.ts index dfe855d6..0e4d79b0 100644 --- a/src/background.ts +++ b/src/background.ts @@ -1,7 +1,7 @@ 'use strict' import { app, protocol, ipcMain, screen } from 'electron' -import { installVueDevtools } from 'vue-cli-plugin-electron-builder/lib' +import { installVueDevtools, createProtocol } from 'vue-cli-plugin-electron-builder/lib' import { setupShortcuts } from './main/shortcuts' import { createTray } from './main/tray' import { setupShowHide } from './main/price-check' @@ -15,6 +15,7 @@ import { setupCfProtection } from './main/cf-protection' import { createOverlayWindow } from './main/overlay-window' import { setupAltVisibility } from './main/alt-visibility' import { setupBuiltinBrowser } from './main/builtin-browser' +import { createFileProtocol } from './main/app-file-protocol' const isDevelopment = process.env.NODE_ENV !== 'production' if (!app.requestSingleInstanceLock()) { @@ -51,6 +52,9 @@ app.on('ready', async () => { } } + createProtocol('app') + createFileProtocol() + setupConfigEvents() createTray() setupShowHide() diff --git a/src/ipc/ipc-event.ts b/src/ipc/ipc-event.ts index c7de95f2..0b574d12 100644 --- a/src/ipc/ipc-event.ts +++ b/src/ipc/ipc-event.ts @@ -62,3 +62,5 @@ export interface IpcOpenSystemBrowser { } export const OPEN_WIKI = 'MAIN->OVERLAY::open-wiki' + +export const IMPORT_FILE = 'OVERLAY->MAIN::import-file' diff --git a/src/ipc/main-process-bindings.ts b/src/ipc/main-process-bindings.ts index 01e34330..e2bbeb27 100644 --- a/src/ipc/main-process-bindings.ts +++ b/src/ipc/main-process-bindings.ts @@ -140,6 +140,12 @@ class MainProcessBinding extends EventTarget { } } + importFile (filePath: string) { + if (electron) { + return electron.ipcRenderer.sendSync(ipcEvent.IMPORT_FILE, filePath) + } + } + get CORS () { return (!electron) ? 'https://apt-cors.snos.workers.dev/?' diff --git a/src/main/app-file-protocol.ts b/src/main/app-file-protocol.ts new file mode 100644 index 00000000..353a4a43 --- /dev/null +++ b/src/main/app-file-protocol.ts @@ -0,0 +1,22 @@ +import { protocol, app, ipcMain } from 'electron' +import { IMPORT_FILE } from '@/ipc/ipc-event' +import path from 'path' +import crypto from 'crypto' +import fs from 'fs' + +export function createFileProtocol () { + protocol.registerFileProtocol('app-file', (req, resp) => { + resp({ path: path.join(app.getPath('userData'), 'apt-data/files', req.url.substr('app-file://'.length)) }) + }) + + ipcMain.on(IMPORT_FILE, (e, filePath: string) => { + const file = fs.readFileSync(filePath) + const hash = crypto.createHash('md5').update(file).digest('hex') + const filename = `${hash}${path.extname(filePath)}` + + fs.mkdirSync(path.join(app.getPath('userData'), 'apt-data/files'), { recursive: true }) + fs.writeFileSync(path.join(app.getPath('userData'), 'apt-data/files', filename), file) + + e.returnValue = `app-file://${filename}` + }) +} diff --git a/src/main/overlay-window.ts b/src/main/overlay-window.ts index 3e99262f..c9f450b3 100644 --- a/src/main/overlay-window.ts +++ b/src/main/overlay-window.ts @@ -3,7 +3,6 @@ import { BrowserWindow, ipcMain, dialog, Menu, systemPreferences } from 'electro import { PoeWindow } from './PoeWindow' import { logger } from './logger' import * as ipc from '@/ipc/ipc-event' -import { createProtocol } from 'vue-cli-plugin-electron-builder/lib' import { overlayWindow as OW } from 'electron-overlay-window' import { config } from './config' @@ -49,7 +48,6 @@ export async function createOverlayWindow () { overlayWindow.loadURL(process.env.WEBPACK_DEV_SERVER_URL + '#overlay') overlayWindow.webContents.openDevTools({ mode: 'detach', activate: false }) } else { - createProtocol('app') overlayWindow.loadURL('app://./index.html#overlay') }