From 8c8445eb3bc6bc05343f9a9f6c40309fc0573585 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sat, 2 May 2020 13:35:42 +0200 Subject: [PATCH] improve receiver load times by concating javascript --- htdocs/index.html | 13 +------ owrx/controllers/assets.py | 71 +++++++++++++++++++++++++++++++++----- owrx/http.py | 4 ++- 3 files changed, 67 insertions(+), 21 deletions(-) diff --git a/htdocs/index.html b/htdocs/index.html index 3c706f3..07b9fcc 100644 --- a/htdocs/index.html +++ b/htdocs/index.html @@ -24,18 +24,7 @@ OpenWebRX | Open Source SDR Web App for Everyone! - - - - - - - - - - - - + diff --git a/owrx/controllers/assets.py b/owrx/controllers/assets.py index 9a8ab24..c8af2d8 100644 --- a/owrx/controllers/assets.py +++ b/owrx/controllers/assets.py @@ -4,13 +4,22 @@ from datetime import datetime import mimetypes import os import pkg_resources +from abc import ABCMeta, abstractmethod + +import logging + +logger = logging.getLogger(__name__) -class AssetsController(Controller): +class AssetsController(Controller, metaclass=ABCMeta): def getModified(self, file): - return None + return datetime.fromtimestamp(os.path.getmtime(self.getFilePath(file))) def openFile(self, file): + return open(self.getFilePath(file), "rb") + + @abstractmethod + def getFilePath(self, file): pass def serve_file(self, file, content_type=None): @@ -41,8 +50,8 @@ class AssetsController(Controller): class OwrxAssetsController(AssetsController): - def openFile(self, file): - return pkg_resources.resource_stream("htdocs", file) + def getFilePath(self, file): + return pkg_resources.resource_filename("htdocs", file) class AprsSymbolsController(AssetsController): @@ -57,8 +66,54 @@ class AprsSymbolsController(AssetsController): def getFilePath(self, file): return self.path + file - def getModified(self, file): - return datetime.fromtimestamp(os.path.getmtime(self.getFilePath(file))) - def openFile(self, file): - return open(self.getFilePath(file), "rb") +class CompiledAssetsController(Controller): + profiles = { + "receiver.js": [ + "openwebrx.js", + "lib/jquery-3.2.1.min.js", + "lib/jquery.nanoscroller.js", + "lib/Demodulator.js", + "lib/DemodulatorPanel.js", + "lib/BookmarkBar.js", + "lib/AudioEngine.js", + "lib/ProgressBar.js", + "lib/Measurement.js", + "lib/FrequencyDisplay.js", + "lib/Js8Threads.js", + "lib/Modes.js", + ] + } + + def indexAction(self): + profileName = self.request.matches.group(1) + if profileName not in CompiledAssetsController.profiles: + self.send_response("profile not found", code=404) + + files = CompiledAssetsController.profiles[profileName] + logger.debug(files) + files = [pkg_resources.resource_filename("htdocs", f) for f in files] + logger.debug(files) + + modified = self.getModified(files) + + if modified is not None and "If-Modified-Since" in self.handler.headers: + client_modified = datetime.strptime( + self.handler.headers["If-Modified-Since"], "%a, %d %b %Y %H:%M:%S %Z" + ) + if modified <= client_modified: + self.send_response("", code=304) + return + + contents = [self.getContents(f) for f in files] + + (content_type, encoding) = mimetypes.MimeTypes().guess_type(profileName) + self.send_response("\n".join(contents), content_type=content_type, last_modified=modified, max_age=3600) + + def getContents(self, file): + with open(file) as f: + return f.read() + + def getModified(self, files): + modified = [datetime.fromtimestamp(os.path.getmtime(f)) for f in files] + return max(*modified) diff --git a/owrx/http.py b/owrx/http.py index f7203a5..39e2bdf 100644 --- a/owrx/http.py +++ b/owrx/http.py @@ -6,7 +6,8 @@ from owrx.controllers.template import ( ) from owrx.controllers.assets import ( OwrxAssetsController, - AprsSymbolsController + AprsSymbolsController, + CompiledAssetsController ) from owrx.controllers.websocket import WebSocketController from owrx.controllers.api import ApiController @@ -91,6 +92,7 @@ class Router(object): StaticRoute("/status", StatusController), StaticRoute("/status.json", StatusController, options={"action": "jsonAction"}), RegexRoute("/static/(.+)", OwrxAssetsController), + RegexRoute("/compiled/(.+)", CompiledAssetsController), RegexRoute("/aprs-symbols/(.+)", AprsSymbolsController), StaticRoute("/ws/", WebSocketController), RegexRoute("(/favicon.ico)", OwrxAssetsController),