Skip to content

Commit

Permalink
Add service worker to cache feed icons
Browse files Browse the repository at this point in the history
  • Loading branch information
fguillot committed Jul 16, 2018
1 parent c926498 commit 6aa0268
Show file tree
Hide file tree
Showing 8 changed files with 94 additions and 35 deletions.
2 changes: 1 addition & 1 deletion daemon/routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ func routes(cfg *config.Config, store *storage.Storage, feedHandler *feed.Handle
uiRouter.Use(middleware.AppSession)
uiRouter.Use(middleware.UserSession)
uiRouter.HandleFunc("/stylesheets/{name}.css", uiController.Stylesheet).Name("stylesheet").Methods("GET")
uiRouter.HandleFunc("/js", uiController.Javascript).Name("javascript").Methods("GET")
uiRouter.HandleFunc("/{name}.js", uiController.Javascript).Name("javascript").Methods("GET")
uiRouter.HandleFunc("/favicon.ico", uiController.Favicon).Name("favicon").Methods("GET")
uiRouter.HandleFunc("/icon/{filename}", uiController.AppIcon).Name("appIcon").Methods("GET")
uiRouter.HandleFunc("/manifest.json", uiController.WebManifest).Name("webManifest").Methods("GET")
Expand Down
72 changes: 46 additions & 26 deletions generate.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,23 +96,33 @@ func concat(files []string) string {
return b.String()
}

func generateJSBundle(bundleFile string, srcFiles []string) {
var b strings.Builder
b.WriteString("(function() {'use strict';")
b.WriteString(concat(srcFiles))
b.WriteString("})();")

func generateJSBundle(bundleFile string, bundleFiles map[string][]string, prefixes, suffixes map[string]string) {
bundle := NewBundle("static", "Javascripts")
m := minify.New()
m.AddFunc("text/javascript", js.Minify)

output, err := m.String("text/javascript", b.String())
if err != nil {
panic(err)
for name, srcFiles := range bundleFiles {
var b strings.Builder

if prefix, found := prefixes[name]; found {
b.WriteString(prefix)
}

b.WriteString(concat(srcFiles))

if suffix, found := suffixes[name]; found {
b.WriteString(suffix)
}

minifiedData, err := m.String("text/javascript", b.String())
if err != nil {
panic(err)
}

bundle.Files[name] = minifiedData
bundle.Checksums[name] = checksum([]byte(minifiedData))
}

bundle := NewBundle("static", "Javascript")
bundle.Files["app"] = output
bundle.Checksums["app"] = checksum([]byte(output))
bundle.Write(bundleFile)
}

Expand Down Expand Up @@ -165,20 +175,30 @@ func generateBundle(bundleFile, pkg, mapName string, srcFiles []string) {
}

func main() {
generateJSBundle("ui/static/js.go", []string{
"ui/static/js/dom_helper.js",
"ui/static/js/touch_handler.js",
"ui/static/js/keyboard_handler.js",
"ui/static/js/mouse_handler.js",
"ui/static/js/form_handler.js",
"ui/static/js/request_builder.js",
"ui/static/js/unread_counter_handler.js",
"ui/static/js/entry_handler.js",
"ui/static/js/confirm_handler.js",
"ui/static/js/menu_handler.js",
"ui/static/js/modal_handler.js",
"ui/static/js/nav_handler.js",
"ui/static/js/bootstrap.js",
generateJSBundle("ui/static/js.go", map[string][]string{
"app": []string{
"ui/static/js/dom_helper.js",
"ui/static/js/touch_handler.js",
"ui/static/js/keyboard_handler.js",
"ui/static/js/mouse_handler.js",
"ui/static/js/form_handler.js",
"ui/static/js/request_builder.js",
"ui/static/js/unread_counter_handler.js",
"ui/static/js/entry_handler.js",
"ui/static/js/confirm_handler.js",
"ui/static/js/menu_handler.js",
"ui/static/js/modal_handler.js",
"ui/static/js/nav_handler.js",
"ui/static/js/bootstrap.js",
},
"sw": []string{
"ui/static/js/sw.js",
},
}, map[string]string{
"app": "(function(){'use strict';",
"sw": "'use strict';",
}, map[string]string{
"app": "})();",
})

generateCSSBundle("ui/static/css.go", map[string][]string{
Expand Down
6 changes: 4 additions & 2 deletions template/common.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion template/html/common/layout.html
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@
{{ else }}
<link rel="stylesheet" type="text/css" href="{{ route "stylesheet" "name" "default" }}">
{{ end }}
<script type="text/javascript" src="{{ route "javascript" }}" defer></script>

<script type="text/javascript" src="{{ route "javascript" "name" "app" }}" defer></script>
<script type="text/javascript" src="{{ route "javascript" "name" "sw" }}" defer id="service-worker-script"></script>
</head>
<body data-entries-status-url="{{ route "updateEntriesStatus" }}">
{{ if .user }}
Expand Down
11 changes: 7 additions & 4 deletions ui/static/js.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions ui/static/js/bootstrap.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,11 @@ document.addEventListener("DOMContentLoaded", function() {
mouseHandler.onClick(".logo", () => menuHandler.toggleMainMenu());
mouseHandler.onClick(".header nav li", (event) => menuHandler.clickMenuListItem(event));
}

if ("serviceWorker" in navigator) {
let scriptElement = document.getElementById("service-worker-script");
if (scriptElement) {
navigator.serviceWorker.register(scriptElement.src);
}
}
});
14 changes: 14 additions & 0 deletions ui/static/js/sw.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
self.addEventListener("fetch", (event) => {
if (event.request.url.includes("/feed/icon/")) {
event.respondWith(
caches.open("feed_icons").then((cache) => {
return cache.match(event.request).then((response) => {
return response || fetch(event.request).then((response) => {
cache.put(event.request, response.clone());
return response;
});
});
})
);
}
});
13 changes: 12 additions & 1 deletion ui/static_javascript.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,22 @@ import (
"net/http"
"time"

"github.com/miniflux/miniflux/http/request"
"github.com/miniflux/miniflux/http/response"
"github.com/miniflux/miniflux/http/response/html"
"github.com/miniflux/miniflux/ui/static"
)

// Javascript renders application client side code.
func (c *Controller) Javascript(w http.ResponseWriter, r *http.Request) {
response.Cache(w, r, "text/javascript; charset=utf-8", static.JavascriptChecksums["app"], []byte(static.Javascript["app"]), 48*time.Hour)
filename := request.Param(r, "name", "app")
if _, found := static.Javascripts[filename]; !found {
html.NotFound(w)
return
}

body := static.Javascripts[filename]
etag := static.JavascriptsChecksums[filename]

response.Cache(w, r, "text/javascript; charset=utf-8", etag, []byte(body), 48*time.Hour)
}

0 comments on commit 6aa0268

Please sign in to comment.