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