async function loadImages(attachment, {
filter = null,
invalidation: invalidated = invalidation,
mimeType = name => `image/${name.split(".").at(-1)}`,
} = {}) {
const archive = await attachment.zip();
const _filter =
typeof filter === "string" ? d => d.includes(filter)
: typeof filter === "function" ? d => filter(d)
: filter instanceof RegExp ? d => d.match(filter)
: () => true;
const urls = archive.filenames.filter(_filter).map(async name => {
const data = await archive.file(name).arrayBuffer();
const url = URL.createObjectURL(new Blob([data], {type: mimeType(name)}));
invalidated.then(() => URL.revokeObjectURL(url));
return [name, url];
});
return Object.fromEntries(await Promise.all(urls));
}