From a5fca41176db7ee2920f6b9751ddb9e312e9e93c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Tue, 21 Feb 2017 19:16:09 +0100 Subject: [PATCH] add progressive web app stuff (manifest & service worker) --- README | 4 + img/launcher-icon-1x.png | Bin 0 -> 2502 bytes img/launcher-icon-2x.png | Bin 0 -> 5081 bytes img/launcher-icon-4x.png | Bin 0 -> 12522 bytes img/launcher-icon.svg | 168 +++++++++++++++++++++++++++++++++++++++ index.html | 1 + manifest.json | 25 ++++++ nanofun.js | 12 +++ service-worker.js | 117 +++++++++++++++++++++++++++ 9 files changed, 327 insertions(+) create mode 100644 img/launcher-icon-1x.png create mode 100644 img/launcher-icon-2x.png create mode 100644 img/launcher-icon-4x.png create mode 100644 img/launcher-icon.svg create mode 100644 manifest.json create mode 100644 service-worker.js diff --git a/README b/README index f998416..5891b17 100644 --- a/README +++ b/README @@ -26,5 +26,9 @@ A copy of the jQuery JavaScript library is included, it's Dual licensed under the MIT and GPL licenses. http://docs.jquery.com/License +Service worker support has been done using this example: + https://github.com/lyzadanger/serviceworker-example/ + MIT-licensed. + External led mode support is based on a sysex dump recorded by the Overtone project; MIT licensed; https://github.com/overtone/overtone/ diff --git a/img/launcher-icon-1x.png b/img/launcher-icon-1x.png new file mode 100644 index 0000000000000000000000000000000000000000..ca962396f48676cf0111a189d5ac83c8f38336a9 GIT binary patch literal 2502 zcmV;%2|4zOP)QLg|BV2?*7fs#pq2BNh>aifu8dU=*yRX-jGiVG=M&W0Ps~Gt>FI zbMHO(=d9(!+54Qm_t|GMdF+A9-TRz<)?VNG+iR@@e8Mks=GE%nk?)l@m-nGW6##%h z0zg2-AP55j0#kBN07yV!hA=nd`N8?s-}gT5T`1UZa_GRuBOuw#Ac25E2|WNpLW~ds z*7u2-AOSN|DeU#GcV_yR+Ghc94nSjfc_@d%_#=NdL}*L z=BwAEg_mYev`)_b5P+og4^2EZ^5oPvH-6);S~ykf0>T8u0>sHbv7)DFN(=;QE-bxR zqI1pi((&1kx^K)s-b1LHesDS*D{JOOF{l1XkM(_a#}pD*_l{6~ z|LCsnxn`;VLFa7%s2|w)#FiiLd3yBgTY_M?6aykaki7>8APgiLrF1_Lb&nAST;5vi z4Ih~-N0&SMJ8v!h0{{mAPZV~(+`&&;usrlw%pdA47&PMMAYL^Ar6tSi)jW=?ZJ zmXwP$zJnt5p`) zfm0u0TAv2&IXOVqVM^Iv4iN3Y9_BKd@HsGnh1N15Dh`?Hrivv;BgUqb*J5Tac65Qo zoaw-1tV`&S1yzC9YH22UQ}te8^El9RH=YaaQ=(=@u6q0n| zXwz}+-W!H3A0U@wa?Hg(sLV}mN#;Xn_Kd9PLXHWN1;ljVyvZ3+DFG0-x$QFR2jX*J zfiDye=KEa$O#m%k8T3-QrcMdC2UStXWRJ-W+HsTu=zkc!-afU^@i8aa+<4{!VLeEJ z^k!DB0O$hfbkDbDixM)|f!*8)mIEj2qM2qbo@t#+0rbu{U!VWc<-ZN)db-MTfVg9y zDP`|19KY7?zP0jmJ#U|0Jl=fmW~|5<0-$_!Nu?}~pptRiio^LAuU>AwyLc{HmtEE2 z!xKNNe`)+sec#9gH9}CLV_owKfmjGJ1WW*fh>3(nh)INdA4Z+dJ4=_NQ;W~H-&;Oo z&_?YGn;si}Z0x&3k8Rpoo~%JcIB^Mz0mKAiki-It6WYQe6cZs9k(dU;(fQTY_Q|=k z3%{QIEr6a2KwlLAp8`;Kq+j%}#|&T&z@mp{CRkuQl1j}-L!6&^Z=mRFe+2-P3N{J> zxK)}<)cucAbpX`y~hAL?jp;C8VAQ;7OBrz9dkcrtq z7z7qjOau{8X2jt5TGVNsUi@G8y``UY{?j~V?KIKYy5aEX(fR|UJHqjDEuf_HAdpz~ zfMSBMP$~>2P|O4&qL}(|zc(8#bxtq;YxU&ZD;i)5VEFK+KWzKm^pmB{6}PRT`ZjKF zD6?N!&nRAa;YxGqrT4$zIoo*$0P0)o+lRih?Ke|Lchyk}R6i+*MfHXf`Vu2)-RQZZ znXFd=jC=35!<)}ucz5NGH(mr(6sq38;cFAme)@5Pc~gz+EM~F@HU9LDM(v@AXY|U- zm&cAy9sBGMN`YEupRjjOm7#oZy*KvMj_K;XBfC-nr7e{wh8~~TVDp|owAKeCd9U)h zk?jC#0IK!ZdcHFn9E)+sLCwxW-ODk}!yHnOs$Zar0*IKGp2de?#TNgWh0lfIQV(VA@)(=tpTuDKLdWw4J( zP&FGSw`>HZH8qhBl z+IhBZ+Q`yC{EYw*7iz#U7r&j`n+jY>8j(jcBbqs}gpoP0uVYNgaf{1iEMpC!-r7!F{u>Z?U0*o9%vFFTSmN*44xY0d7 zxYa9Q?sghTfmzX|d$Bc-q%XA6|De5C4?-A;4nX`)M_O7+q>f`|YJaYZ}p;%l{l)kHWm&llwtKn~3+zj9$0+^3|yIms@WD zSrOhtSNA!5Juwnn5<>Qsp48WT%IFKP3~2dR*Lth3+&bR7+P@ z^ys&$Q`HBhL}gG?&=W}X7$OV`I4QOvfh0vf2r^jie>}Lb`f7K!dl8R07*qoM6N<$f`yo^DF6Tf literal 0 HcmV?d00001 diff --git a/img/launcher-icon-2x.png b/img/launcher-icon-2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a8a5eeeedca094478e609c8a32f9cf2758125379 GIT binary patch literal 5081 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 literal 0 HcmV?d00001 diff --git a/img/launcher-icon-4x.png b/img/launcher-icon-4x.png new file mode 100644 index 0000000000000000000000000000000000000000..0907d8cab933bdae1d7fd64f59aa53b2b9361a48 GIT binary patch literal 12522 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 literal 0 HcmV?d00001 diff --git a/img/launcher-icon.svg b/img/launcher-icon.svg new file mode 100644 index 0000000..18f717e --- /dev/null +++ b/img/launcher-icon.svg @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/index.html b/index.html index 674cd61..140c994 100644 --- a/index.html +++ b/index.html @@ -3,6 +3,7 @@ + nanoFUN diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..1c2af07 --- /dev/null +++ b/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "nanoFUN", + "name": "nanoFUN MIDI sampler", + "icons": [ + { + "src": "img/launcher-icon-1x.png", + "type": "image/png", + "sizes": "48x48" + }, + { + "src": "img/launcher-icon-2x.png", + "type": "image/png", + "sizes": "96x96" + }, + { + "src": "img/launcher-icon-4x.png", + "type": "image/png", + "sizes": "192x192" + } + ], + "start_url": "index.html", + "display": "standalone", + "background_color": "#2196F3", + "theme_color": "#2196F3" +} diff --git a/nanofun.js b/nanofun.js index 627a47b..3fd313d 100644 --- a/nanofun.js +++ b/nanofun.js @@ -407,3 +407,15 @@ var nanofun = function() { } $(function() { nanofun(); }); + +if ('serviceWorker' in navigator) { + window.addEventListener('load', function() { + navigator.serviceWorker.register('service-worker.js').then(function(registration) { + // Registration was successful + console.log('ServiceWorker registration successful with scope: ', registration.scope); + }).catch(function(err) { + // registration failed :( + console.log('ServiceWorker registration failed: ', err); + }); + }); +} diff --git a/service-worker.js b/service-worker.js new file mode 100644 index 0000000..4d25f26 --- /dev/null +++ b/service-worker.js @@ -0,0 +1,117 @@ +/* global self, caches, fetch, URL, Response */ +'use strict'; + +var config = { + version: 'v1', + staticCacheItems: [ + 'index.html', + 'jquery.min.js', + 'nanofun.js', + 'nanofun.css' + ] +}; + +function cacheName (key, opts) { + return `${opts.version}-${key}`; +} + +function addToCache (cacheKey, request, response) { + if (response.ok) { + var copy = response.clone(); + caches.open(cacheKey).then( cache => { + cache.put(request, copy); + }); + } + return response; +} + +function fetchFromCache (event) { + return caches.match(event.request).then(response => { + if (!response) { + throw Error(`${event.request.url} not found in cache`); + } + return response; + }); +} + +function offlineResponse (resourceType, opts) { + return undefined; +} + +self.addEventListener('install', event => { + function onInstall (event, opts) { + var cacheKey = cacheName('static', opts); + return caches.open(cacheKey) + .then(cache => cache.addAll(opts.staticCacheItems)); + } + + event.waitUntil( + onInstall(event, config).then( () => self.skipWaiting() ) + ); +}); + +self.addEventListener('activate', event => { + function onActivate (event, opts) { + return caches.keys() + .then(cacheKeys => { + var oldCacheKeys = cacheKeys.filter(key => key.indexOf(opts.version) !== 0); + var deletePromises = oldCacheKeys.map(oldKey => caches.delete(oldKey)); + return Promise.all(deletePromises); + }); + } + + event.waitUntil( + onActivate(event, config) + .then( () => self.clients.claim() ) + ); +}); + +self.addEventListener('fetch', event => { + + function shouldHandleFetch (event, opts) { + var request = event.request; + var url = new URL(request.url); + var criteria = { + isGETRequest : request.method === 'GET', + isFromMyOrigin : url.origin === self.location.origin + }; + var failingCriteria = Object.keys(criteria) + .filter(criteriaKey => !criteria[criteriaKey]); + return !failingCriteria.length; + } + + function onFetch (event, opts) { + var request = event.request; + var acceptHeader = request.headers.get('Accept'); + var resourceType = 'static'; + var cacheKey; + + if (acceptHeader.indexOf('text/html') !== -1) { + resourceType = 'content'; + } else if (acceptHeader.indexOf('image') !== -1) { + resourceType = 'image'; + } + + cacheKey = cacheName(resourceType, opts); + + if (resourceType === 'content') { + event.respondWith( + fetch(request) + .then(response => addToCache(cacheKey, request, response)) + .catch(() => fetchFromCache(event)) + .catch(() => offlineResponse(resourceType, opts)) + ); + } else { + event.respondWith( + fetchFromCache(event) + .catch(() => fetch(request)) + .then(response => addToCache(cacheKey, request, response)) + .catch(() => offlineResponse(resourceType, opts)) + ); + } + } + if (shouldHandleFetch(event, config)) { + onFetch(event, config); + } + +}); -- 2.39.2