perf(frontend): parallelize video thumbs, batch owner-cache writes, minor tweaks
- photos: generate + upload the three video-thumbnail sizes in parallel via Promise.allSettled instead of a sequential await loop; previewData is still captured before its upload so the local preview survives a failed upload. - useOwnerCache: resolve the batch, then apply a single reactive assignment to `#names` instead of spread-copying the record once per id (fewer copies and fewer derive re-runs on large resolves). - admin: migration status polling slowed from 2s to 5s. - files store: soft cap (10k) on the per-item selection toggle. Bulk "select all" in the views is intentionally left uncapped.
This commit is contained in:
@@ -31,14 +31,16 @@ export class OwnerCache {
|
||||
|
||||
/** Resolve every not-yet-cached id in parallel; nullish ids are skipped. */
|
||||
async resolve(ids: Iterable<string | null | undefined>): Promise<void> {
|
||||
const unique = [...new Set([...ids].filter((id): id is string => !!id))];
|
||||
await Promise.all(
|
||||
unique.map(async (id) => {
|
||||
if (this.#names[id]) return;
|
||||
const name = await this.#resolver(id);
|
||||
this.#names = { ...this.#names, [id]: name };
|
||||
})
|
||||
const pending = [...new Set([...ids].filter((id): id is string => !!id))].filter(
|
||||
(id) => !this.#names[id]
|
||||
);
|
||||
if (pending.length === 0) return;
|
||||
const resolved = await Promise.all(
|
||||
pending.map(async (id) => [id, await this.#resolver(id)] as const)
|
||||
);
|
||||
// One reactive assignment for the whole batch instead of one per id, so a
|
||||
// large resolve doesn't spread-copy the record N times (and re-run derives N times).
|
||||
this.#names = { ...this.#names, ...Object.fromEntries(resolved) };
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user