From 53bd7da0632d96e0513c77de8fb8a876087bc389 Mon Sep 17 00:00:00 2001 From: Felix Rieseberg Date: Sat, 11 Feb 2017 06:43:09 -0800 Subject: [PATCH] :rocket: Allow ServiceWorker /ghost/ scope (#7967) ServiceWorkers can only control the scope from which they have been served. Our service workers live, like all other files, in an `asset` folder - and could in theory only work on other files in there. This commit fake-serves our service workers from `/ghost/`, thus allowing them to give everything offline powers. --- core/server/admin/app.js | 3 +++ core/server/admin/serviceworker.js | 16 ++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 core/server/admin/serviceworker.js diff --git a/core/server/admin/app.js b/core/server/admin/app.js index 9093b952b2..0d116698f1 100644 --- a/core/server/admin/app.js +++ b/core/server/admin/app.js @@ -41,6 +41,9 @@ module.exports = function setupAdminApp() { {maxAge: utils.ONE_YEAR_MS, fallthrough: false} )); + // Service Worker for offline support + adminApp.get(/^\/(sw.js|sw-registration.js)$/, require('./serviceworker')); + // Render error page in case of maintenance adminApp.use(maintenance); diff --git a/core/server/admin/serviceworker.js b/core/server/admin/serviceworker.js new file mode 100644 index 0000000000..66f1498d0d --- /dev/null +++ b/core/server/admin/serviceworker.js @@ -0,0 +1,16 @@ +var debug = require('debug')('ghost:admin:serviceworker'), + path = require('path'); + +// Route: index +// Path: /ghost/sw.js|sw-registration.js +// Method: GET +module.exports = function adminController(req, res) { + /*jslint unparam:true*/ + debug('serviceworker called'); + + var sw = path.join(__dirname, '..', '..', 'built', 'assets', 'sw.js'), + swr = path.join(__dirname, '..', '..', 'built', 'assets', 'sw-registration.js'), + fileToSend = req.url === '/sw.js' ? sw : swr; + + res.sendFile(fileToSend); +};