Skip to content

Instantly share code, notes, and snippets.

@mizchi
Last active September 3, 2018 14:02
Show Gist options
  • Save mizchi/53868a920c1a3b3ba720b1b20a4e9923 to your computer and use it in GitHub Desktop.
Save mizchi/53868a920c1a3b3ba720b1b20a4e9923 to your computer and use it in GitHub Desktop.
/*
This serivec-worker is proxy to browserfs on fetch/import
Example.
// write via browserfs
fs.writeFile('/dir/a.js', 'console.log("xxx")')
// import via service-worker
import('/fs/dir/a.js');
*/
importScripts("/assets/browserfs.min.js")
let _fs = null
const ensureFS = () =>
new Promise((resolve, reject) => {
if (_fs != null) {
resolve(fs)
return
}
BrowserFS.install(self)
BrowserFS.configure(
{
fs: "IndexedDB",
options: {}
},
err => {
if (err) {
reject(err)
} else {
_fs = BrowserFS.BFSRequire("fs")
resolve(_fs)
}
}
)
})
ensureFS()
const FS_PREFIX = "/fs/"
self.addEventListener("fetch", event => {
const parsedUrl = new URL(event.request.url)
const withFS = parsedUrl.pathname.startsWith(FS_PREFIX)
if (withFS) {
const filepath = parsedUrl.pathname.replace(FS_PREFIX, "/")
event.respondWith(
ensureFS().then(fs => {
return new Promise((resolve, reject) => {
fs.readFile(filepath, (err, ret) => {
if (err) {
console.error(err)
return reject(err)
}
const content = ret.toString()
const res = new Response(content, {
mode: "no-cors",
headers: { "Content-Type": "text/javascript" }
})
resolve(res)
})
})
})
)
}
})
self.addEventListener("install", e => e.waitUntil(self.skipWaiting()))
self.addEventListener("activate", e => e.waitUntil(self.clients.claim()))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment