mirror of
https://github.com/leporello-js/leporello-js
synced 2026-01-13 13:04:30 -08:00
loading external modules from FileSystem access API
This commit is contained in:
@@ -13,18 +13,51 @@ self.addEventListener('activate', function(event) {
|
||||
});
|
||||
*/
|
||||
|
||||
let data
|
||||
let dir_handle
|
||||
|
||||
self.addEventListener('message', async function(e) {
|
||||
const msg = e.data
|
||||
let reply
|
||||
if(msg.type == 'SET') {
|
||||
data = msg.data
|
||||
dir_handle = msg.data
|
||||
reply = null
|
||||
} else if(msg.type == 'GET') {
|
||||
reply = data
|
||||
reply = dir_handle
|
||||
} else {
|
||||
throw new Error('unknown message type: ' + msg.type)
|
||||
}
|
||||
e.ports[0].postMessage(reply)
|
||||
})
|
||||
|
||||
// Fake URL base prepended by code responsible for module loading
|
||||
const FAKE_URL_BASE = 'https://leporello.import/'
|
||||
|
||||
self.addEventListener("fetch", event => {
|
||||
if(event.request.url.startsWith(FAKE_URL_BASE)) {
|
||||
if(dir_handle != null) {
|
||||
const headers = new Headers([
|
||||
['Content-Type', 'text/javascript']
|
||||
])
|
||||
const path = event.request.url.replace(FAKE_URL_BASE, '')
|
||||
const response = read_file(dir_handle, path).then(file =>
|
||||
new Response(file, {headers})
|
||||
)
|
||||
event.respondWith(response)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
const read_file = async (dir_handle, filename) => {
|
||||
if(typeof(filename) == 'string') {
|
||||
filename = filename.split('/')
|
||||
}
|
||||
const [first, ...rest] = filename
|
||||
if(rest.length == 0) {
|
||||
const fhandle = await dir_handle.getFileHandle(first)
|
||||
const file_data = await fhandle.getFile()
|
||||
return await file_data.text()
|
||||
} else {
|
||||
const nested_dir_handle = await dir_handle.getDirectoryHandle(first)
|
||||
return read_file(nested_dir_handle, rest)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user