diff --git a/src/lib/components/molecules/Categories/service.ts b/src/lib/components/molecules/Categories/service.ts index 683d516..2a2a3e0 100644 --- a/src/lib/components/molecules/Categories/service.ts +++ b/src/lib/components/molecules/Categories/service.ts @@ -1,5 +1,7 @@ +import type { DataKey } from "$lib/modules/filesystem"; + export interface SelectedCategory { id: number; - dataKey?: { key: CryptoKey; version: Date }; + dataKey?: DataKey; name: string; } diff --git a/src/lib/modules/file/download.svelte.ts b/src/lib/modules/file/download.svelte.ts index e80fe31..bea8316 100644 --- a/src/lib/modules/file/download.svelte.ts +++ b/src/lib/modules/file/download.svelte.ts @@ -18,7 +18,7 @@ export interface FileDownloadState { result?: ArrayBuffer; } -export type LiveFileDownloadState = FileDownloadState & { +type LiveFileDownloadState = FileDownloadState & { status: "download-pending" | "downloading" | "decryption-pending" | "decrypting"; }; @@ -34,9 +34,7 @@ export const getFileDownloadState = (fileId: number) => { }; export const getDownloadingFiles = () => { - return downloadingFiles.filter((file): file is LiveFileDownloadState => - isFileDownloading(file.status), - ); + return downloadingFiles.filter((file) => isFileDownloading(file.status)); }; export const clearDownloadedFiles = () => { diff --git a/src/lib/modules/filesystem/internal.svelte.ts b/src/lib/modules/filesystem/internal.svelte.ts index 7bfe60d..f5e5e1f 100644 --- a/src/lib/modules/filesystem/internal.svelte.ts +++ b/src/lib/modules/filesystem/internal.svelte.ts @@ -3,7 +3,7 @@ import { unwrapDataKey, decryptString } from "$lib/modules/crypto"; export class FilesystemCache { private map = new Map>(); - get(key: K, loader: (isInitial: boolean, resolve: (value: RV) => void) => void) { + get(key: K, loader: (isInitial: boolean, resolve: (value: RV | undefined) => void) => void) { const info = this.map.get(key); if (info instanceof Promise) { return info; @@ -15,6 +15,8 @@ export class FilesystemCache { } loader(!info, (loadedInfo) => { + if (!loadedInfo) return; + let info = this.map.get(key)!; if (info instanceof Promise) { const state = $state(loadedInfo); diff --git a/src/lib/modules/filesystem/types.ts b/src/lib/modules/filesystem/types.ts index fe3254f..6374474 100644 --- a/src/lib/modules/filesystem/types.ts +++ b/src/lib/modules/filesystem/types.ts @@ -1,4 +1,4 @@ -type DataKey = { key: CryptoKey; version: Date }; +export type DataKey = { key: CryptoKey; version: Date }; interface LocalDirectoryInfo { id: number; @@ -13,7 +13,6 @@ interface RootDirectoryInfo { id: "root"; parentId?: undefined; dataKey?: undefined; - dataKeyVersion?: undefined; name?: undefined; subDirectories: SubDirectoryInfo[]; files: SummarizedFileInfo[]; @@ -39,7 +38,7 @@ export type CategoryFileInfo = SummarizedFileInfo & { isRecursive: boolean }; interface LocalCategoryInfo { id: number; - dataKey?: DataKey | undefined; + dataKey?: DataKey; name: string; subCategories: SubCategoryInfo[]; files: CategoryFileInfo[]; diff --git a/src/lib/utils/promise.ts b/src/lib/utils/promise.ts index a4b0fb2..9e841c8 100644 --- a/src/lib/utils/promise.ts +++ b/src/lib/utils/promise.ts @@ -1,16 +1,16 @@ export const monotonicResolve = ( - promises: (Promise | false)[], + promises: (Promise | false)[], callback: (value: T) => void, ) => { let latestResolvedIndex = -1; - - promises.forEach((promise, index) => { - if (!promise) return; - promise.then((value) => { - if (value !== undefined && index > latestResolvedIndex) { - latestResolvedIndex = index; - callback(value); - } + promises + .filter((promise) => !!promise) + .forEach((promise, index) => { + promise.then((value) => { + if (index > latestResolvedIndex) { + latestResolvedIndex = index; + callback(value); + } + }); }); - }); }; diff --git a/src/routes/(main)/directory/[[id]]/service.svelte.ts b/src/routes/(main)/directory/[[id]]/service.svelte.ts index 0dc69d9..f83bbaf 100644 --- a/src/routes/(main)/directory/[[id]]/service.svelte.ts +++ b/src/routes/(main)/directory/[[id]]/service.svelte.ts @@ -8,13 +8,14 @@ import { deleteFileThumbnailCache, uploadFile, } from "$lib/modules/file"; +import type { DataKey } from "$lib/modules/filesystem"; import { hmacSecretStore, type MasterKey, type HmacSecret } from "$lib/stores"; import { trpc } from "$trpc/client"; export interface SelectedEntry { type: "directory" | "file"; id: number; - dataKey: { key: CryptoKey; version: Date } | undefined; + dataKey: DataKey | undefined; name: string; }