haskell / haskell/hackage-server
Cache docs with service worker
- 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.