threepipe
Version:
A modern 3D viewer framework built on top of three.js, written in TypeScript, designed to make creating high-quality, modular, and extensible 3D experiences on the web simple and enjoyable.
50 lines (48 loc) • 2.26 kB
text/typescript
import {Cache as threeCache} from 'three'
export function overrideThreeCache(storage: Cache | Storage) {
const oldCache = {...threeCache}
threeCache.get = (url: string, responseType?: string, mimeType?: DOMParserSupportedType): Promise<any> | any => {
if (!responseType) return oldCache.get(url)
if (url.startsWith('data:') || url.startsWith('blob') || url.startsWith('chrome-extension')) return Promise.resolve(undefined)
return (storage as Cache).match(url).then(response => {
if (!response) return undefined
switch (responseType) {
case 'arraybuffer':
return response.arrayBuffer()
case 'blob':
return response.blob()
case 'document':
return response.text()
.then(text => {
const parser = new DOMParser()
return parser.parseFromString(text, mimeType ?? 'text/html')
})
case 'json':
return response.json()
default:
if (mimeType === undefined) {
return response.text()
} else {
// sniff encoding
const re = /charset="?([^;"\s]*)"?/i
const exec = re.exec(mimeType)
const label = exec && exec[1] ? exec[1].toLowerCase() : undefined
const decoder = new TextDecoder(label)
return response.arrayBuffer().then(ab => decoder.decode(ab))
}
}
})
}
threeCache.add = async(url: string, data: BodyInit, responseType?: string) => {
if (!responseType) return oldCache.add(url, data)
if (url.startsWith('data:') || url.startsWith('blob') || url.startsWith('chrome-extension')) return
// noinspection JSIgnoredPromiseFromCall
if (await storage.match(url)) await storage.delete(url)
await storage.put(url, new Response(data, {status: 200}))
}
threeCache.remove = (url: string, responseType?: string) => {
if (!responseType) return oldCache.remove(url)
// noinspection JSIgnoredPromiseFromCall
storage.delete(url)
}
}