From e1e23ea6bb9894f8393a6b50dc5c8eaa8b6d658c Mon Sep 17 00:00:00 2001 From: Dominik Pfennig <dominik@suma-ev.de> Date: Fri, 3 Aug 2018 16:33:24 +0200 Subject: [PATCH] First changes for the service workers --- config/tileserver.php | 6 +++ public/service-worker.js | 70 +++++++++++++++++++++++++++++++++++ resources/views/map.blade.php | 15 +++++++- routes/web.php | 33 +++++++++-------- 4 files changed, 108 insertions(+), 16 deletions(-) create mode 100644 config/tileserver.php create mode 100644 public/service-worker.js diff --git a/config/tileserver.php b/config/tileserver.php new file mode 100644 index 0000000..1a6cc8a --- /dev/null +++ b/config/tileserver.php @@ -0,0 +1,6 @@ +<?php + +return [ + 'TILESERVER_HOST'=> 'maps.metager.de', + 'TILESERVER_PORT'=> 63825 +]; \ No newline at end of file diff --git a/public/service-worker.js b/public/service-worker.js new file mode 100644 index 0000000..918b87e --- /dev/null +++ b/public/service-worker.js @@ -0,0 +1,70 @@ +var CACHE_NAME = "maps-cache-v1"; +var TILE_CACHE_LOW_RES = "tile-cache-low-res-v1"; + +// URLs that always need to be cached +var urlsToCache = [ + 'img/ajax-loader.gif', + 'img/silhouette-walk.png', + 'img/bike.png', + 'img/car.png', + 'img/start-navigation.png' +]; + +function fetchWrapper(url, timeout) { + return new Promise((resolve, reject) => { + fetch(url).then(resolve).catch(reject); + + if (timeout) { + const e = new Error("Connection timed out"); + setTimeout(reject, timeout, e); + } + }); + } + + +self.addEventListener('install', function(event){ + event.waitUntil( + caches.open(CACHE_NAME) + .then(function(cache){ + console.log("Cache opened"); + return cache.addAll(urlsToCache); + }) + ); +}); + +// Add the event Listener when resources get fetched +self.addEventListener('fetch', function(event){ + event.respondWith( + caches.match(event.request).then(function(response){ + if(response){ + return response; + } + if(event.request.url.indexOf("/tile_cache/") > -1){ + // The request is a Tile + return fetch(event.request) + .then(function(response){ + return caches.open(TILE_CACHE_LOW_RES) + .then(function(cache){ + cache.put(event.request.url, response.clone()); + return response; + }); + }) + .error(function(error){ + console.log(error); + }); + }else{ + return fetch(event.request) + .then(function(response){ + return caches.open(CACHE_NAME).then(function(cache){ + if(event.request.url.indexOf("tile_cache") < 0){ + cache.put(event.request.url, response.clone()); + } + return response; + }); + }); + } + }) + ); +}); + + diff --git a/resources/views/map.blade.php b/resources/views/map.blade.php index 030bd94..bda63f7 100644 --- a/resources/views/map.blade.php +++ b/resources/views/map.blade.php @@ -267,10 +267,22 @@ <span>MetaGer konnte Ihren genauen Standort nicht ermitteln.</span> <a href="/hilfe" target="_blank">Warum?</a> </div> </main> + <script> + // Script for Serviceworker management + if( 'serviceWorker' in navigator ){ + window.addEventListener('load', function(){ + navigator.serviceWorker.register('/service-worker.js').then(function(registration){ + console.log('ServiceWorker registered succesfully!'); + }, function(err){ + console.log('ServiceWorker could not be registered:', err); + }); + }); + } + </script> @if(isset($vars)) <script type="text/javascript"> @if(isset($vars["center"])) - var pos = [{!!$vars["center"][0]!!}, {!!$vars["center"][1]!!}]; + var pos = [{!! $vars["center"][0] !!}, {!! $vars["center"][1]!!}]; @endif @if(isset($vars["center"])) var zoom = {!!$vars["zoom"]!!}; @@ -284,6 +296,7 @@ @endif </script> @endif + <script src="{{ mix('/js/modules.js') }}" type="text/javascript" defer></script> <script src="{{ mix('js/map.js') }}" type="text/javascript" defer></script> </body> diff --git a/routes/web.php b/routes/web.php index 6dab9d9..56347fc 100644 --- a/routes/web.php +++ b/routes/web.php @@ -29,22 +29,25 @@ Route::group(['prefix' => 'download'], function(){ Route::get('tile_cache/{z}/{x}/{y}.png', function($z, $x, $y){ $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); - socket_connect($socket, env("TILESERVER_HOST"), env("TILESERVER_PORT")); - - socket_write($socket, "generate-tile;$z;$x;$y\n", strlen("generate-tile;$z;$x,$y\n")); - - $content = ""; - while(true){ - $tmp = socket_read($socket, 4096); - if($tmp == "") break; - else $content .= $tmp; + $fp = stream_socket_client("tcp://" . config("tileserver.TILESERVER_HOST") . ":" . config("tileserver.TILESERVER_PORT") . "/" . getmypid(), $errno, $errstr, 30); + #socket_connect($socket, env("TILESERVER_HOST") . "/" . getmypid(), env("TILESERVER_PORT")); + + if(!$fp){ + abort(404); + }else{ + fwrite($fp, "generate-tile;$z;$x;$y\n"); + $content = ""; + while(!feof($fp)){ + $content .= fgets($fp, 1024); + } + fclose($fp); + $response = Response::make($content, 200); + $response->header('Content-Type', 'image/png'); + $response->header('Cache-Control', 'max-age=0, no-cache, no-store, must-revalidate'); + $response->header('Pragma', 'no-cache'); + $response->header('Expires', 'Wed, 11 Jan 1984 05:00:00 GMT'); + return $response; } - $response = Response::make($content, 200); - $response->header('Content-Type', 'image/png'); - $response->header('Cache-Control', 'max-age=0, no-cache, no-store, must-revalidate'); - $response->header('Pragma', 'no-cache'); - $response->header('Expires', 'Wed, 11 Jan 1984 05:00:00 GMT'); - return $response; }); Route::group(['prefix' => 'map'], function () { -- GitLab