From b19a1217ffb37051f9e506cca218e8d9ae8721c3 Mon Sep 17 00:00:00 2001 From: martin Date: Fri, 25 May 2018 15:21:42 +0100 Subject: [PATCH] some stuff --- gulp/backbone.js | 3 +- package-lock.json | 8 +-- package.json | 2 +- serverHTTP2.js | 19 +++++++ src/service-worker.js | 122 +++++++++++++++++++++--------------------- src/v1/js/Nearby.js | 42 ++++++++------- src/v1/js/Traffic.js | 2 +- src/v1/js/app.js | 42 +++++++++++---- 8 files changed, 143 insertions(+), 97 deletions(-) create mode 100644 serverHTTP2.js diff --git a/gulp/backbone.js b/gulp/backbone.js index 4909391..7165024 100644 --- a/gulp/backbone.js +++ b/gulp/backbone.js @@ -35,7 +35,8 @@ gulp.task('bundleBackbone', function () { gulp.task('bump', function() { gulp.src('src/service-worker.js') .pipe(bump({ 'key': 'version' })) - .pipe(gulp.dest('src')); + .pipe(gulp.dest('src')) + .pipe(gulp.dest('live')); }); gulp.task('buildBackbone', ['bump', 'bundleBackbone'], function() { diff --git a/package-lock.json b/package-lock.json index b3ed402..f50c4eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,7 +52,7 @@ }, "@sinonjs/formatio": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", + "resolved": "http://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", "dev": true, "requires": { @@ -11959,9 +11959,9 @@ } }, "whatwg-fetch": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", - "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" }, "when": { "version": "3.7.8", diff --git a/package.json b/package.json index 60d71e7..0731001 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,6 @@ "vinyl-buffer": "^1.0.1", "vinyl-source-stream": "^2.0.0", "watchify": "^3.11.0", - "whatwg-fetch": "^2.0.3" + "whatwg-fetch": "^2.0.4" } } diff --git a/serverHTTP2.js b/serverHTTP2.js new file mode 100644 index 0000000..3ded013 --- /dev/null +++ b/serverHTTP2.js @@ -0,0 +1,19 @@ +const http2 = require('http2'); +const fs = require('fs'); + +const server = http2.createSecureServer({ + key: fs.readFileSync('localhost-privkey.pem'), + cert: fs.readFileSync('localhost-cert.pem') +}); +server.on('error', (err) => console.error(err)); + +server.on('stream', (stream, headers) => { + // stream is a Duplex + stream.respond({ + 'content-type': 'text/html', + ':status': 200 + }); + stream.end('

Hello World

'); +}); + +server.listen(8110); diff --git a/src/service-worker.js b/src/service-worker.js index 67961ca..c425891 100644 --- a/src/service-worker.js +++ b/src/service-worker.js @@ -11,10 +11,11 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -const CACHE_VERSION = { 'version': '0.0.707' }; -const dataCacheName = 'jubileeData-v1'; -const cacheName = 'jubilee-final-1'; -const filesToCache = [ +const CACHE_VERSION = { 'version': '0.0.771' }; +const PRECACHE = `jubileeData-${CACHE_VERSION.version}`; +const RUNTIME = 'runtime'; + +const PRECACHE_URLS = [ '/', '/index.html', '/service-worker.js', @@ -66,77 +67,76 @@ const filesToCache = [ ]; -self.addEventListener('install', function(e) { - console.log('[ServiceWorker] Install'); - e.waitUntil( - caches.open(cacheName).then(function(cache) { - console.log('[ServiceWorker] Caching app shell'); +const liveData = ['news', 'agenda']; - return cache.addAll(filesToCache); - }) +self.addEventListener('install', event => { + console.warn('Installing...'); + event.waitUntil( + caches.open(PRECACHE) + .then(cache => cache.addAll(PRECACHE_URLS)) + .then(self.skipWaiting()) ); }); -self.addEventListener('activate', function(e) { - console.log('[ServiceWorker] Activate'); - e.waitUntil( - caches.keys().then(function(keyList) { - return Promise.all(keyList.map(function(key) { - if (key !== cacheName && key !== dataCacheName) { - console.log('[ServiceWorker] Removing old cache', key); - - return caches.delete(key); - } +// The activate handler takes care of cleaning up old caches. +self.addEventListener('activate', event => { + console.warn('Activate...'); + const currentCaches = [PRECACHE, RUNTIME]; + event.waitUntil( + caches.keys().then(cacheNames => { + return cacheNames.filter(cacheName => !currentCaches.includes(cacheName)); + }).then(cachesToDelete => { + return Promise.all(cachesToDelete.map(cacheToDelete => { + return caches.delete(cacheToDelete); })); - }) + }).then(() => self.clients.claim()) ); - - /* - * Fixes a corner case in which the app wasn't returning the latest data. - * You can reproduce the corner case by commenting out the line below and - * then doing the following steps: 1) load app for first time so that the - * initial New York City data is shown 2) press the refresh button on the - * app 3) go offline 4) reload the app. You expect to see the newer NYC - * data, but you actually see the initial data. This happens because the - * service worker is not yet activated. The code below essentially lets - * you activate the service worker faster. - */ - return self.clients.claim(); }); -self.addEventListener('fetch', function(e) { - console.warn('[Service Worker] Fetch', e.request.url); - const dataUrl = '/getnexttraintimes?'; - if (e.request.url.indexOf(dataUrl) > -1) { - console.log('!'); +// The fetch handler serves responses for same-origin resources from a cache. +// If no response is found, it populates the runtime cache with the response +// from the network before returning it to the page. +self.addEventListener('fetch', event => { + console.warn('Fetch', event.request.url); + // Skip cross-origin requests, like those for Google Analytics. + if (event.request.url.startsWith(self.location.origin)) { + console.log('One of our requests..'); + event.respondWith( + caches.match(event.request).then(cachedResponse => { + if (cachedResponse) { + return cachedResponse; + } - /* - * When the request URL contains dataUrl, the app is asking for fresh - * weather data. In this case, the service worker always goes to the - * network and then caches the response. This is called the "Cache then - * network" strategy: - * https://jakearchibald.com/2014/offline-cookbook/#cache-then-network - */ - e.respondWith( - caches.open(dataCacheName).then(function(cache) { - return fetch(e.request).then(function(response) { - cache.put(e.request.url, response.clone()); - - return response; + return caches.open(RUNTIME).then(cache => { + return fetch(event.request).then(response => { + // Put a copy of the response in the runtime cache. + return cache.put(event.request, response.clone()).then(() => { + return response; + }); + }); }); }) ); } - else - /* - * The app is asking for app shell files. In this scenario the app uses the - * "Cache, falling back to the network" offline strategy: - * https://jakearchibald.com/2014/offline-cookbook/#cache-falling-back-to-network - */ - e.respondWith( - caches.match(e.request).then(function(response) { - return response || fetch(e.request); + if (event.request.url.startsWith('https://maps.googleapis.com')) { + const url = new URL(event.request.url); + const locCache = `loc-${url.searchParams.get('latlng')}`; + event.respondWith( + caches.match(locCache).then(cachedResponse => { + if (cachedResponse) { + return cachedResponse; + } + + return caches.open(RUNTIME).then(cache => { + return fetch(event.request).then(response => { + // Put a copy of the response in the runtime cache. + return cache.put(locCache, response.clone()).then(() => { + return response; + }); + }); + }); }) ); + } }); diff --git a/src/v1/js/Nearby.js b/src/v1/js/Nearby.js index f811c6c..8475f94 100644 --- a/src/v1/js/Nearby.js +++ b/src/v1/js/Nearby.js @@ -24,6 +24,7 @@ const NearbyModel = Backbone.Model.extend({ this.tick(); this.set('totalResults', 0); this.listenTo(this, 'change:llFixed change:atHome change:section change:update', this.onChange); + this.throttledGetNearby = _.throttle(this.getNearby, 6000); }, 'tick': function() { const hour = parseInt((new Date()).getHours().toString(), 10); @@ -41,8 +42,8 @@ const NearbyModel = Backbone.Model.extend({ console.log('At home, so no fetching...'); this.logUpdate(); } - else - this.getNearby(); + else + this.throttledGetNearby(); }, 'getNearby': function() { const llFixed = this.get('llFixed'); @@ -54,22 +55,24 @@ const NearbyModel = Backbone.Model.extend({ const lastUpdate = time - (this.get('time') || 0); console.log('>> Nearby section:', hour, section); - console.info('>> Nearby:request'); + console.info('>> Nearby:request V2'); console.log(`>> Nearby last fetch: ${TimeFormat.fromMs(lastUpdate, 'hh:mm')} ago`); - if (lastUpdate > 120000) - request({ - 'url': `${window.loc}/fsexplore`, - 'method': 'GET', - 'qs': { - 'll': llFixed, - 'section': section - } - }, function(err, res, body) { - if (err) - console.error(err); - else { + if (lastUpdate > 120000) { + const url = new URL(`${window.loc}/fsexplore`); + + url.searchParams.append('ll', llFixed); + url.searchParams.append('section', section); + + fetch(url) + .then(res => { console.log('statusCode', res.statusCode); + + console.warn(res.status); + + return res.text(); + }) + .then(function(body) { const fsJSON = JSON.parse(body); const groups = get(fsJSON, 'response.groups'); const items = groups[0].items; @@ -80,8 +83,11 @@ const NearbyModel = Backbone.Model.extend({ this.fsCollection.reset(newItems); this.logUpdate(); - } - }.bind(this)); + }.bind(this)) + .catch(function(error) { + console.error(error); + }); + } }, 'logUpdate': function() { console.log('Nearby logging:'); @@ -184,7 +190,7 @@ const NearbyView = Backbone.View.extend({ const section = this.model.get('section'); const data = { llFixed, section, 'limit':20 }; - // console.log('Data', data); + // console.log('Data', data); this.eventBus.trigger('showNearbyList', data); } diff --git a/src/v1/js/Traffic.js b/src/v1/js/Traffic.js index ed16715..d56d64c 100644 --- a/src/v1/js/Traffic.js +++ b/src/v1/js/Traffic.js @@ -55,7 +55,7 @@ const TrafficModel = Backbone.Model.extend({ 'getTraffic': function() { console.log('Get Traffic'); // olat, olon, dlat, dlon - const override = true; + const override = false; const time = new Date().getTime() ; const hour = (new Date()).getHours(); const latlong = this.get('latlong'); diff --git a/src/v1/js/app.js b/src/v1/js/app.js index 0dd446c..9f24af4 100644 --- a/src/v1/js/app.js +++ b/src/v1/js/app.js @@ -21,23 +21,43 @@ const { NearbyListModel, NearbyListView } = require('./NearbyList'); const { NearbyPlacesView } = require('./NearbyPlaces'); var app = app || {}; -const live = false; +const live = true; if (live) { window.loc = 'https://jubilee.silvrtree.co.uk'; - if ('serviceWorker' in navigator) - navigator.serviceWorker - .register('./service-worker.js') - .then(function() { - console.log('Service Worker Registered'); - }); -} -else window.loc = 'http://localhost:8110'; + if ('serviceWorker' in navigator) { + // + navigator.serviceWorker.ready.then(function(reg) { + console.warn('Ready??', reg); + main(); + }); -(function () { + window.addEventListener('load', function() { + navigator.serviceWorker + .register('./service-worker.js') + .then(function(r) { + console.warn('Service Worker Registered', r.scope); + }) + .catch(function(error) { + // registration failed + console.error(`Registration failed with ${ error}`); + }); + }); + + // + } +} +else { + window.loc = 'http://localhost:8110'; + main(); +} + +function main() { const offline = false; + console.log('>>> START!!! <<<'); + /* var myRouter = Backbone.Router.extend({ // @@ -102,4 +122,4 @@ else window.addEventListener('online', app.updateOnlineStatus); window.addEventListener('offline', app.updateOnlineStatus); -})(); +}