Skip to content

Commit d70ed8e

Browse files
author
edencoder
committed
fix offline caching
1 parent e1ee899 commit d70ed8e

File tree

3 files changed

+115
-38
lines changed

3 files changed

+115
-38
lines changed

bundles/serviceworker/controllers/serviceworker.js renamed to bundles/serviceworker/controllers/serviceworker.ts

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
// Require local class dependencies
2-
const Controller = require('controller');
2+
import config from 'config';
3+
import Controller from 'controller';
34

45
/**
56
* Create Serviceworker Controller
67
*
78
* @mount /
89
*/
9-
class ServiceworkerController extends Controller {
10+
export default class ServiceworkerController extends Controller {
1011
/**
1112
* Construct Admin Controller class
1213
*/
@@ -33,11 +34,17 @@ class ServiceworkerController extends Controller {
3334
// render offline page
3435
res.render();
3536
}
36-
}
3737

38-
/**
39-
* Exports Admin Controller class
40-
*
41-
* @type {ServiceworkerController}
42-
*/
43-
module.exports = ServiceworkerController;
38+
/**
39+
* config action
40+
* @route {get} /sw/config.json
41+
*
42+
* @param req
43+
* @param res
44+
* @param next
45+
*/
46+
configAction(req, res, next) {
47+
// get config
48+
res.json(config.get('serviceworker.config') || {});
49+
}
50+
}

bundles/serviceworker/public/js/serviceworker.js

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/* eslint-disable no-restricted-globals */
12

23
// Require events
34
const Events = require('events');
@@ -21,6 +22,7 @@ class EdenServiceworker extends Events {
2122
// Bind methods
2223
this.send = this.send.bind(this);
2324
this.build = this.build.bind(this);
25+
this.config = this.config.bind(this);
2426
this.endpoint = this.endpoint.bind(this);
2527

2628
// Build this
@@ -32,20 +34,41 @@ class EdenServiceworker extends Events {
3234
*/
3335
build() {
3436
// Emit on message
35-
// eslint-disable-next-line no-restricted-globals
3637
self.addEventListener('message', (event) => {
3738
// On message
3839
this.emit(event.data.type, event.ports[0], ...(event.data.args || []));
3940
});
4041

4142
// require offline
42-
// eslint-disable-next-line no-restricted-globals
43-
if ((self.config || {}).offline) {
43+
if (self.config.offline) {
4444
// require offline
4545
this.offline = new EdenOffline(this);
4646
}
4747
}
4848

49+
/**
50+
* return config
51+
*
52+
* @param {*} noCache
53+
*/
54+
async config(noCache = false) {
55+
// return config
56+
if (!noCache && self.config) return self.config;
57+
58+
// await fetch
59+
const res = await fetch(`https://${self.config.domain}/sw/config.json`);
60+
const data = await res.json();
61+
62+
// keys
63+
Object.keys(data).forEach((key) => {
64+
// set config
65+
self.config[key] = data[key];
66+
});
67+
68+
// return config
69+
return self.config;
70+
}
71+
4972
/**
5073
* log message
5174
*

bundles/serviceworker/public/js/serviceworker/offline.js

Lines changed: 73 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,18 @@ class EdenOffline extends Events {
4040

4141
// build routes
4242
this._routes = [];
43+
this._installing = false;
4344

4445
// loop routes
45-
for (const route of self.config.routes) {
46+
for (const route of self.config.routes || []) {
4647
// test route
47-
route.test = toRegex(route.route);
48+
const test = toRegex(route);
4849

4950
// push route
50-
this._routes.push(route);
51+
this._routes.push({
52+
route,
53+
test,
54+
});
5155
}
5256

5357
// Adding `install` event listener
@@ -65,11 +69,14 @@ class EdenOffline extends Events {
6569
// Adding `fetch` event listener
6670
self.addEventListener('fetch', (event) => {
6771
// await install
68-
event.respondWith(this.fetch(event));
72+
if (!this._installing) event.respondWith(this.fetch(event));
6973
});
7074

7175
// install offline cache
7276
this.eden.log('info', 'enabled offline');
77+
78+
// install
79+
this.install();
7380
}
7481

7582
/**
@@ -82,8 +89,9 @@ class EdenOffline extends Events {
8289
async fetch(event) {
8390
// get request
8491
const { request } = event;
92+
8593
// eslint-disable-next-line max-len
86-
const path = request.url.includes(self.config.domain) ? request.url.split(self.config.domain).pop() : null;
94+
const path = request.url.includes(self.config.domain) ? request.url.split(self.config.domain).pop() : request.url;
8795

8896
// match cache
8997
let response = await caches.match(request);
@@ -96,7 +104,7 @@ class EdenOffline extends Events {
96104
// find offline route
97105
const offline = this._routes.find((route) => {
98106
// test route
99-
return route.test.test(path);
107+
return route.route === path ? true : route.test.test(path);
100108
});
101109

102110
// create offline response
@@ -105,7 +113,7 @@ class EdenOffline extends Events {
105113
url : path,
106114
page : offline ? offline.view : 'offline-page',
107115
path : offline ? offline.path : path,
108-
layout : `${(offline || {}).layout || 'main'}-layout`,
116+
layout : 'main-layout',
109117
},
110118
page : {
111119
title : offline ? offline.title : 'Offline',
@@ -136,27 +144,36 @@ class EdenOffline extends Events {
136144
* @param {Event} event
137145
*/
138146
async install() {
139-
// install offline cache
140-
this.eden.log('info', 'installing offline cache');
147+
// check installing
148+
if (this._installing) return;
141149

142-
// open cache
143-
const cache = await caches.open(self.config.version);
144-
const files = self.config.offline.files || [];
150+
// installing
151+
this._installing = true;
145152

146-
// unshift files
147-
files.unshift('/');
148-
files.unshift('/offline');
149-
files.unshift(`/public/js/app.min.js?v=${self.config.version}`);
150-
files.unshift(`/public/css/app.min.css?v=${self.config.version}`);
153+
// try/catch
154+
try {
155+
// skip waiting
156+
self.skipWaiting();
151157

152-
// add all
153-
await cache.addAll(files);
158+
// config
159+
const config = await this.eden.config(true);
154160

155-
// skip waiting
156-
self.skipWaiting();
161+
// install offline cache
162+
this.eden.log('info', 'installing offline cache');
157163

158-
// install offline cache
159-
this.eden.log('info', 'installed offline cache');
164+
// open cache
165+
const cache = await caches.open(config.version);
166+
const files = config.routes || [];
167+
168+
// add all
169+
await cache.addAll(files);
170+
171+
// install offline cache
172+
this.eden.log('info', 'installed offline cache');
173+
} catch (e) {}
174+
175+
// installing
176+
this._installing = false;
160177
}
161178

162179
/**
@@ -167,20 +184,50 @@ class EdenOffline extends Events {
167184
* @return {Promise}
168185
*/
169186
async activate() {
187+
// config
188+
const config = await this.eden.config(true);
189+
190+
// build routes
191+
this._routes = [];
192+
193+
// loop routes
194+
for (const route of self.config.routes || []) {
195+
// test route
196+
const test = toRegex(route);
197+
198+
// push route
199+
this._routes.push({
200+
route,
201+
test,
202+
});
203+
}
204+
205+
// install
206+
await this.install();
207+
170208
// install offline cache
171-
this.eden.log('info', 'removing depricated offline cache');
209+
this.eden.log('info', 'checking offline cache');
172210

173211
// get cache keys
174212
const keys = await caches.keys();
175213

176214
// loop keys
177215
for (const key of keys) {
178216
// delete cache
179-
if (key !== self.config.version) await caches.delete(key);
217+
if (key !== config.version) {
218+
// install offline cache
219+
this.eden.log('info', `removing offline cache ${key}`);
220+
221+
// delete
222+
await caches.delete(key);
223+
224+
// install offline cache
225+
this.eden.log('info', `removed offline cache ${key}`);
226+
}
180227
}
181228

182229
// install offline cache
183-
this.eden.log('info', 'removed depricated offline cache');
230+
this.eden.log('info', 'checked offline cache');
184231

185232
// claim clients
186233
self.clients.claim();

0 commit comments

Comments
 (0)