haskell / haskell/hackage-server

Cache docs with service worker

Open
#990 3 comments 0 reactions 0 assignees View on GitHub
Dominant language
Haskell
Stars
467
Forks
225
PR merge metrics
No merged PRs in 30d

Description

Hi,

Today I noticed that hackage.haskell.org was down for quiet awhile.

I wasn't able to use doc packages opened by vscode+HLS.

I propose to enable service worker browser caching.
This way docs would be available offline after user visit package docs once.

```
#!/bin/sh

DOC_ROOT=
CACHEABLE_EXTS='[.](js|css|json|png|gif|html)$'
HTML_EXT='[.]html$'

err() {
echo "Error: $@" 1>&2
exit 1
}

while [ $# -ne 0 ] ; do
case "$1" in
-h|--help)
cat< [ ]
Adds service-worker for caching all HTML pages in the folder.

Options:
--help -h
--doc-root -r haddoc root
EOF
exit 1
;;
-r|--doc-root) shift; DOC_ROOT="$1";;
*) err "Bad option [$1]" ;;
esac
shift
done

[ -n "$DOC_ROOT" ] || err "document root is not set"
[ -d "$DOC_ROOT" ] || err "document root doesnt not exist: [$DOC_ROOT]"

# generate service worker
cat< $DOC_ROOT/offline-service-worker.js
self.addEventListener("fetch", (event) => {
console.log("Service Worker Fetch event " + event.request.url);
event.respondWith(
caches.open("cache1").then(
cache => cache.match(event.request, {ignoreSearch: true}).then(
response => {
if (response) {
console.log("Found in cache: " + event.request.url);
return response;
} else {
console.log("Network request: " + event.request.url);
return fetch(event.request).then(
ok => ok,
(e) => {
console.log("Offline fallback with 404", e);
return cache.match("/404.html");
});
}
}))
);
});

self.addEventListener('install', (event) => {
console.log("Start install worker " + new Date());
event.waitUntil(
caches.delete("cache1")
.then(ok => {
console.log("Previous cache is cleaned: " + ok);
caches.open("cache1").then(cache => {
return cache.addAll(
[
EOF

ls -1 $DOC_ROOT | grep -E "$CACHEABLE_EXTS" | while read FILE_PATH ; do
echo "'$(basename $FILE_PATH)',"
done >> $DOC_ROOT/offline-service-worker.js

# generate manifest
cat< $DOC_ROOT/manifest.json
{
"short_name": "MyPackage-Haddocks",
"name": "My Package Haddocks",
"description": "My Package Haddocks",
"version": "0.1",
"display": "standalone",
"orientation": "landscape",
"icons": [],
"scope": ".",
"start_url": "./"
}
EOF

cat<> $DOC_ROOT/offline-service-worker.js
'manifest.json'
]);});}));});
EOF

cat<swReg.html

window.addEventListener("load", () => {
navigator.serviceWorker.register('offline-service-worker.js')
.then(
(registration) =>
console.log('ServiceWorker registration successful with scope: ',
registration.scope)
).catch(
(err) =>
console.log('ServiceWorker registration failed: ', err)
);
});

EOF

ls -1 $DOC_ROOT | grep -E "$HTML_EXT" | while read HTML_FILE ; do
HTML_FILE=$DOC_ROOT/$HTML_FILE
perl -pi -e 's/()/\n$1\n/' $HTML_FILE
sed -i.b '// r swReg.html' $HTML_FILE
rm $HTML_FILE.b
done

rm swReg.html

```

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.