From 0d7a7304977b136941547713773d48e472ac91b2 Mon Sep 17 00:00:00 2001 From: Tudor-Ovidiu Avram Date: Mon, 12 Oct 2020 12:05:56 +0300 Subject: [PATCH] feat(pwa) add pwa specifics --- index.html | 3 ++ pwa-worker.js | 88 +++++++++++++++++++++++++++++++++++ static/offline.html | 64 +++++++++++++++++++++++++ static/pwa/icons/icon192.png | Bin 0 -> 7344 bytes static/pwa/icons/icon512.png | Bin 0 -> 20515 bytes static/pwa/manifest.json | 30 ++++++++++++ static/pwa/registrator.js | 12 +++++ 7 files changed, 197 insertions(+) create mode 100644 pwa-worker.js create mode 100644 static/offline.html create mode 100644 static/pwa/icons/icon192.png create mode 100644 static/pwa/icons/icon512.png create mode 100644 static/pwa/manifest.json create mode 100644 static/pwa/registrator.js diff --git a/index.html b/index.html index 2a222ae99..83c7380f6 100644 --- a/index.html +++ b/index.html @@ -8,6 +8,8 @@ + + + diff --git a/pwa-worker.js b/pwa-worker.js new file mode 100644 index 000000000..26143d964 --- /dev/null +++ b/pwa-worker.js @@ -0,0 +1,88 @@ +/* +Copyright 2015, 2019, 2020 Google LLC. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + 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_NAME = 'offline'; + +// Customize this with a different URL if needed. +const OFFLINE_URL = 'static/offline.html'; + +self.addEventListener('install', event => { + event.waitUntil( + (async () => { + const cache = await caches.open(CACHE_NAME); + + + // Setting {cache: 'reload'} in the new request will ensure that the + // response isn't fulfilled from the HTTP cache; i.e., it will be from + // the network. + await cache.add(new Request(OFFLINE_URL, { cache: 'reload' })); + })() + ); + + // Force the waiting service worker to become the active service worker. + self.skipWaiting(); +}); + +self.addEventListener('activate', event => { + event.waitUntil( + (async () => { + // Enable navigation preload if it's supported. + // See https://developers.google.com/web/updates/2017/02/navigation-preload + if ('navigationPreload' in self.registration) { + await self.registration.navigationPreload.enable(); + } + })() + ); + + // Tell the active service worker to take control of the page immediately. + self.clients.claim(); +}); + +self.addEventListener('fetch', event => { + // We only want to call event.respondWith() if this is a navigation request + // for an HTML page. + if (event.request.mode === 'navigate') { + event.respondWith((async () => { + try { + // First, try to use the navigation preload response if it's supported. + const preloadResponse = await event.preloadResponse; + + if (preloadResponse) { + return preloadResponse; + } + + // Always try the network first. + const networkResponse = await fetch(event.request); + + return networkResponse; + } catch (error) { + // catch is only triggered if an exception is thrown, which is likely + // due to a network error. + // If fetch() returns a valid HTTP response with a response code in + // the 4xx or 5xx range, the catch() will NOT be called. + console.log('Fetch failed; returning offline page instead.', error); + + const cache = await caches.open(CACHE_NAME); + const cachedResponse = await cache.match(OFFLINE_URL); + + return cachedResponse; + } + })()); + } + + // If our if() condition is false, then this fetch handler won't intercept the + // request. If there are any other fetch handlers registered, they will get a + // chance to call event.respondWith(). If no fetch handlers call + // event.respondWith(), the request will be handled by the browser as if there + // were no service worker involvement. +}); diff --git a/static/offline.html b/static/offline.html new file mode 100644 index 000000000..0aaf7c67c --- /dev/null +++ b/static/offline.html @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + +
+
+ + + +
+

Connection error

+ Your device may be offline or our servers may be experiencing problems. +
+ + + \ No newline at end of file diff --git a/static/pwa/icons/icon192.png b/static/pwa/icons/icon192.png new file mode 100644 index 0000000000000000000000000000000000000000..665d1a3140c37051e37f60ccebfa5c8b23d4f918 GIT binary patch literal 7344 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 Wl}SpR0(r&&0000O&WoeQ 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 bBTmRLg1yYUS5b}5a1*#Wd+omK#7O=>MnNxv literal 0 HcmV?d00001 diff --git a/static/pwa/manifest.json b/static/pwa/manifest.json new file mode 100644 index 000000000..fb16caf3f --- /dev/null +++ b/static/pwa/manifest.json @@ -0,0 +1,30 @@ +{ + "android_package_name": "org.jitsi.meet", + "prefer_related_applications": true, + "related_applications": [ + { + "id": "org.jitsi.meet", + "platform": "chromeos_play" + } + ], + "short_name": "Jitsi Meet", + "name": "Jitsi Meet", + "icons": [ + { + "src": "icons/icon192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "icons/icon512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": "/", + "background_color": "#2a3a4b", + "display": "standalone", + "scope": "/", + "theme_color": "#2a3a4b" + } + \ No newline at end of file diff --git a/static/pwa/registrator.js b/static/pwa/registrator.js new file mode 100644 index 000000000..3a0137468 --- /dev/null +++ b/static/pwa/registrator.js @@ -0,0 +1,12 @@ +if ('serviceWorker' in navigator) { + window.addEventListener('load', () => { + navigator.serviceWorker + .register('pwa-worker.js') + .then(reg => { + console.log('Service worker registered.', reg); + }) + .catch(err => { + console.log(err); + }); + }); +}