fixed preloading and integrated vis

This commit is contained in:
2025-05-17 18:43:17 +02:00
parent 6ffa7e9c68
commit c6a3056dcd
7 changed files with 74 additions and 185 deletions

View File

@@ -29,13 +29,36 @@ export class AssetPreloaderService {
const url = URL.createObjectURL(blob);
if (entry.type === 'image') {
const img = new Image();
const loadedPromise = new Promise<void>((resolve, reject) => {
img.onload = () => {
URL.revokeObjectURL(url);
resolve();
};
img.onerror = (e) => {
console.error(`Failed to load image: ${entry.path}`, e);
URL.revokeObjectURL(url);
reject(e);
};
});
img.src = url;
this.images.set(entry.path, img);
return loadedPromise.then(() => {
this.images.set(entry.path, img);
});
} else if (entry.type === 'audio') {
const audio = new Audio();
const loadedPromise = new Promise<void>((resolve, reject) => {
audio.oncanplaythrough = () => resolve();
audio.onerror = (e) => {
console.error(`Failed to load audio: ${entry.path}`, e);
resolve(); // Don't reject to avoid blocking all
};
});
audio.src = url;
this.audio.set(entry.path, audio);
return loadedPromise.then(() => {
this.audio.set(entry.path, audio);
});
}
return Promise.resolve();
})
);
@@ -44,21 +67,24 @@ export class AssetPreloaderService {
private async loadAsset(entry: AssetEntry): Promise<Blob> {
const response = await fetch(`/assets/${entry.path}`);
if (!response.ok) {
throw new Error(`Failed to fetch asset: ${entry.path}`);
}
const contentType = response.headers.get('Content-Type') || undefined;
const reader = response.body?.getReader();
let loaded = 0;
const chunks = [];
while (true) {
const { done, value } = await reader!.read();
if (done)
break;
if (done) break;
chunks.push(value);
loaded += value.length;
this.loadedBytes += value.length;
this._progress.next(this.loadedBytes / this.totalBytes);
}
return new Blob(chunks);
return new Blob(chunks, contentType ? { type: contentType } : undefined);
}
getImage(name: string): HTMLImageElement {