From 75f6fac2845c9ead139a5938443d84dedf3226ed Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 18 Jun 2018 23:28:39 +0300 Subject: [PATCH] fix(sw) register when prefix changed --- client/client.js | 3 -- client/cloudcmd.js | 6 ++++ client/sw/register.js | 7 ++-- client/sw/register.spec.js | 69 +++++++++++++------------------------- server/cloudcmd.js | 4 --- 5 files changed, 33 insertions(+), 56 deletions(-) diff --git a/client/client.js b/client/client.js index 4150213f..0217cd0f 100644 --- a/client/client.js +++ b/client/client.js @@ -11,7 +11,6 @@ const exec = require('execon'); const Images = require('./dom/images'); const { - registerSW, unregisterSW, } = require('./sw/register'); @@ -46,8 +45,6 @@ function CloudCmdProto(Util, DOM) { console.log(str); }; - registerSW(); - Emitify.call(this); const CloudCmd = this; diff --git a/client/cloudcmd.js b/client/cloudcmd.js index 42d48eee..c88db38e 100644 --- a/client/cloudcmd.js +++ b/client/cloudcmd.js @@ -5,6 +5,10 @@ require('../css/nojs.css'); require('../css/columns/name-size-date.css'); require('../css/columns/name-size.css'); +const { + registerSW, +} = require('./sw/register'); + // prevent additional loading of emitify window.Emitify = require('emitify/legacy'); @@ -17,6 +21,8 @@ module.exports = window.CloudCmd = (config) => { window.DOM = DOM; window.CloudCmd = require('./client'); + + registerSW(config.prefix); const prefix = getPrefix(config.prefix); diff --git a/client/sw/register.js b/client/sw/register.js index 32904266..73019c30 100644 --- a/client/sw/register.js +++ b/client/sw/register.js @@ -1,11 +1,10 @@ 'use strict'; -const runtime = require('serviceworker-webpack-plugin/lib/runtime'); - module.exports.registerSW = registerSW; module.exports.unregisterSW = unregisterSW; -async function registerSW() { +async function registerSW(prefix) { + prefix = prefix ? `/${prefix}/` : `/`; if (!navigator.serviceWorker) return; @@ -15,7 +14,7 @@ async function registerSW() { if (!isHTTPS && !isLocalhost) return; - return runtime.register(); + return navigator.serviceWorker.register(`${prefix}sw.js`); } async function unregisterSW() { diff --git a/client/sw/register.spec.js b/client/sw/register.spec.js index a835aa70..9a83d341 100644 --- a/client/sw/register.spec.js +++ b/client/sw/register.spec.js @@ -4,27 +4,19 @@ const test = require('tape'); const sinon = require('sinon'); const mock = require('mock-require'); -const SERVICE_WORKER = 'serviceworker-webpack-plugin/lib/runtime'; - test('sw: register: registerSW: no serviceWorker', async (t) => { const {navigator} = global; global.navigator = {}; - const register = sinon.stub(); - - mock(SERVICE_WORKER, { - register - }); - const { registerSW, } = mock.reRequire('./register'); await registerSW(); - mock.stop(SERVICE_WORKER); + global.navigator = navigator; - t.notOk(register.called, 'should not call register'); + t.pass('should not call register'); t.end(); }); @@ -34,28 +26,22 @@ test('sw: register: registerSW: no https', async (t) => { location, } = global; - global.navigator = { - serviceWorker: true - }; + const register = sinon.stub(); + + global.navigator = getNavigator({ + register, + }); global.location = { protocol: 'http:' }; - const register = sinon.stub(); - - mock(SERVICE_WORKER, { - register - }); - const { registerSW, } = mock.reRequire('./register'); await registerSW(); - mock.stop(SERVICE_WORKER); - global.location = location; global.navigator = navigator; @@ -69,10 +55,6 @@ test('sw: register: registerSW: no localhost', async (t) => { location, } = global; - global.navigator = { - serviceWorker: true - }; - global.location = { protocol: 'http:', hostname: 'cloudcmd.io', @@ -80,8 +62,8 @@ test('sw: register: registerSW: no localhost', async (t) => { const register = sinon.stub(); - mock(SERVICE_WORKER, { - register + global.navigator = getNavigator({ + register, }); const { @@ -90,8 +72,6 @@ test('sw: register: registerSW: no localhost', async (t) => { await registerSW(); - mock.stop(SERVICE_WORKER); - global.location = location; global.navigator = navigator; @@ -105,18 +85,14 @@ test('sw: register: registerSW', async (t) => { location, } = global; - global.navigator = { - serviceWorker: true - }; - global.location = { hostname: 'localhost', }; const register = sinon.stub(); - mock(SERVICE_WORKER, { - register + global.navigator = getNavigator({ + register, }); const { @@ -125,8 +101,6 @@ test('sw: register: registerSW', async (t) => { await registerSW(); - mock.stop(SERVICE_WORKER); - global.location = location; global.navigator = navigator; @@ -140,10 +114,6 @@ test('sw: register: unregisterSW', async (t) => { location, } = global; - global.navigator = { - serviceWorker: true - }; - global.location = { hostname: 'localhost', }; @@ -155,8 +125,8 @@ test('sw: register: unregisterSW', async (t) => { const register = sinon.stub() .returns(Promise.resolve(reg)); - mock(SERVICE_WORKER, { - register + global.navigator = getNavigator({ + register, }); const { @@ -165,8 +135,6 @@ test('sw: register: unregisterSW', async (t) => { await unregisterSW(); - mock.stop(SERVICE_WORKER); - global.location = location; global.navigator = navigator; @@ -174,3 +142,14 @@ test('sw: register: unregisterSW', async (t) => { t.end(); }); + +function getNavigator({register, unregister}) { + unregister = unregister || sinon.stub(); + + return { + serviceWorker: { + register, + unregister, + } + }; +} diff --git a/server/cloudcmd.js b/server/cloudcmd.js index dbab837c..9bef0068 100644 --- a/server/cloudcmd.js +++ b/server/cloudcmd.js @@ -265,10 +265,6 @@ function _setUrl(pref, req, res, next) { function _setSW(pref, req, res, next) { const prefix = getPrefix(pref); - const is = !req.url.indexOf(prefix); - - if (!is) - return next(); const url = replacePrefix(req.url, prefix); const isSW = /^\/sw\.js(\.map)?$/.test(url);