diff --git a/app/index.html b/app/index.html index 677509da..7ed2d88e 100644 --- a/app/index.html +++ b/app/index.html @@ -4,7 +4,7 @@ - + Notes diff --git a/app/index.js b/app/index.js index 01050ff7..37dc6a80 100644 --- a/app/index.js +++ b/app/index.js @@ -7,6 +7,9 @@ const shell = require('electron').shell; const log = require('electron-log'); const Store = require('./javascripts/main/store.js'); +const ExtensionsServer = require('./javascripts/main/extServer.js'); +ExtensionsServer.instance().createServer(); + import menuManager from './javascripts/main/menuManager.js' import archiveManager from './javascripts/main/archiveManager.js'; import packageManager from './javascripts/main/packageManager.js'; diff --git a/app/javascripts/main/extServer.js b/app/javascripts/main/extServer.js new file mode 100644 index 00000000..8fcf5bd9 --- /dev/null +++ b/app/javascripts/main/extServer.js @@ -0,0 +1,66 @@ +const {app} = require('electron'); +var http = require('http'); +var fs = require('fs'); +var path = require('path'); + +const mimes = { + '.ico': 'image/x-icon', + '.html': 'text/html', + '.js': 'text/javascript', + '.json': 'application/json', + '.css': 'text/css', + '.png': 'image/png', + '.jpg': 'image/jpeg' +}; + +let instance = null; + +class ExtensionsServer { + + static instance() { + if(instance == null) { + instance = new ExtensionsServer(); + } + return instance; + } + + constructor() { + this.port = 45653; + } + + getHost() { + return `http://localhost:${this.port}/`; + } + + createServer() { + function handleRequest(req, res) { + const extensionsFolder = "Extensions"; + const extensionsDir = path.join(app.getPath('userData'), extensionsFolder); + const modifiedReqUrl = req.url.replace(extensionsFolder, ""); + const filePath = path.join(extensionsDir, modifiedReqUrl); + + fs.exists(filePath, function(exists) { + if(exists && fs.lstatSync(filePath).isFile()) { + const ext = path.parse(filePath).ext; + res.setHeader("Content-Type", mimes[ext] || 'text/plain'); + res.writeHead(200, { + 'Access-Control-Allow-Origin': '*' + }); + fs.createReadStream(filePath).pipe(res); + return; + } + + res.writeHead(404); + res.write('404 Not Found'); + res.end(); + }); + } + + var server = http.createServer(handleRequest); + server.listen(this.port, () => { + console.log(`Extensions server started at http://localhost:${this.port}`); + }); + } +} + +module.exports = ExtensionsServer; diff --git a/app/javascripts/renderer/preload.js b/app/javascripts/renderer/preload.js index a95ba1b0..edfb2997 100644 --- a/app/javascripts/renderer/preload.js +++ b/app/javascripts/renderer/preload.js @@ -3,6 +3,7 @@ const osLocale = require('os-locale'); const os = require('os'); const Store = require('../main/store.js'); +const ExtensionsServer = require('../main/extServer.js') const buildEditorContextMenu = remote.require('electron-editor-context-menu'); const rendererPath = 'file://' + __dirname + '/renderer.js'; @@ -23,7 +24,7 @@ const transmitter = new Transmitter(messageBus, }, isMacOS: PropertyType.VALUE, appVersion: PropertyType.VALUE, - userDataPath: PropertyType.VALUE, + extServerHost: PropertyType.VALUE, useSystemMenuBar: PropertyType.VALUE, sendIpcMessage: { type: PropertyType.METHOD, @@ -52,7 +53,7 @@ function loadTransmitter() { transmitter.expose({ spellcheck: spellcheck, - userDataPath: remote.app.getPath('userData'), + extServerHost: ExtensionsServer.instance().getHost(), rendererPath: rendererPath, isMacOS: process.platform === "darwin", appVersion: remote.app.getVersion(), diff --git a/app/javascripts/renderer/renderer.js b/app/javascripts/renderer/renderer.js index 9e35ec23..19a6b343 100644 --- a/app/javascripts/renderer/renderer.js +++ b/app/javascripts/renderer/renderer.js @@ -83,8 +83,8 @@ async function configureWindow() { } async function configureDesktopManager() { - const userDataPath = await bridge.userDataPath; - desktopManager.desktop_setApplicationDataPath(userDataPath); + const extServerHost = await bridge.extServerHost; + desktopManager.desktop_setExtServerHost(extServerHost); /* Handled by PackageManager */ desktopManager.desktop_setComponentInstallationSyncHandler(async (componentsData) => { diff --git a/app/package-lock.json b/app/package-lock.json index c3d26d09..b106d6a2 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -1,6 +1,6 @@ { "name": "standard-notes", - "version": "3.0.21", + "version": "3.0.22", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1022,7 +1022,7 @@ } }, "standard-notes-web": { - "version": "github:standardnotes/web#ec0555ad2646eb6372c0cde273fed0c7d0ed19a8", + "version": "github:standardnotes/web#7cbbf5ae1bc4de8a172af78d9afb35dc43b904c8", "from": "github:standardnotes/web" }, "string-width": { diff --git a/app/package.json b/app/package.json index 2a7dbb58..7f500ff6 100644 --- a/app/package.json +++ b/app/package.json @@ -3,7 +3,7 @@ "productName": "Standard Notes", "description": "A simple and private place for your notes, thoughts, and life's work.", "author": "Standard Notes ", - "version": "3.0.21", + "version": "3.0.22", "main": "./dist/index.js", "dependencies": { "adm-zip": "^0.4.7", diff --git a/package-lock.json b/package-lock.json index 037ac4c8..a85747f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "standard-notes", - "version": "3.0.21", + "version": "3.0.22", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 32640b9d..ba0690d8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "standard-notes", "main": "./app/dist/index.js", - "version": "3.0.21", + "version": "3.0.22", "license": "AGPL-3.0-or-later", "devDependencies": { "@babel/cli": "^7.6.4",