Consolidate
This commit is contained in:
parent
997debf924
commit
7fa9e924eb
12 changed files with 134 additions and 152 deletions
|
@ -1,5 +1,5 @@
|
|||
import log from "@/next/log";
|
||||
import { cached } from "@ente/shared/storage/cacheStorage/helpers";
|
||||
import { cached } from "@ente/shared/storage/cache";
|
||||
import { LS_KEYS, getData } from "@ente/shared/storage/localStorage";
|
||||
import { User } from "@ente/shared/user/types";
|
||||
import { Skeleton, styled } from "@mui/material";
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import log from "@/next/log";
|
||||
import { CACHES } from "@ente/shared/storage/cacheStorage/constants";
|
||||
import { CACHES } from "@ente/shared/storage/cache";
|
||||
import { styled } from "@mui/material";
|
||||
import { Legend } from "components/PhotoViewer/styledComponents/Legend";
|
||||
import { t } from "i18next";
|
||||
|
|
|
@ -4,9 +4,11 @@ import ComlinkCryptoWorker from "@ente/shared/crypto";
|
|||
import { DedicatedCryptoWorker } from "@ente/shared/crypto/internal/crypto.worker";
|
||||
import { CustomError } from "@ente/shared/error";
|
||||
import { Events, eventBus } from "@ente/shared/events";
|
||||
import { CacheStorageService } from "@ente/shared/storage/cacheStorage";
|
||||
import { CACHES } from "@ente/shared/storage/cacheStorage/constants";
|
||||
import { LimitedCache } from "@ente/shared/storage/cacheStorage/types";
|
||||
import {
|
||||
CACHES,
|
||||
CacheStorageService,
|
||||
type LimitedCache,
|
||||
} from "@ente/shared/storage/cache";
|
||||
import { Remote } from "comlink";
|
||||
import { FILE_TYPE } from "constants/file";
|
||||
import isElectron from "is-electron";
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
import { CacheStorageService } from "@ente/shared/storage/cacheStorage";
|
||||
import { CACHES } from "@ente/shared/storage/cacheStorage/constants";
|
||||
import { CACHES, CacheStorageService } from "@ente/shared/storage/cache";
|
||||
import { BlobOptions } from "types/image";
|
||||
import {
|
||||
FaceAlignment,
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
import log from "@/next/log";
|
||||
import { CACHES } from "@ente/shared/storage/cacheStorage/constants";
|
||||
import { cached } from "@ente/shared/storage/cacheStorage/helpers";
|
||||
import { CACHES, cached } from "@ente/shared/storage/cache";
|
||||
import { FILE_TYPE } from "constants/file";
|
||||
import PQueue from "p-queue";
|
||||
import DownloadManager from "services/download";
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import log from "@/next/log";
|
||||
import { Events, eventBus } from "@ente/shared/events";
|
||||
import InMemoryStore from "@ente/shared/storage/InMemoryStore";
|
||||
import { deleteAllCache } from "@ente/shared/storage/cacheStorage/helpers";
|
||||
import { clearCaches } from "@ente/shared/storage/cache";
|
||||
import { clearFiles } from "@ente/shared/storage/localForage/helpers";
|
||||
import { clearData } from "@ente/shared/storage/localStorage";
|
||||
import { clearKeys } from "@ente/shared/storage/sessionStorage";
|
||||
|
@ -31,7 +31,7 @@ export const logoutUser = async () => {
|
|||
log.error("Ignoring error when clearing data", e);
|
||||
}
|
||||
try {
|
||||
await deleteAllCache();
|
||||
await clearCaches();
|
||||
} catch (e) {
|
||||
log.error("Ignoring error when clearing caches", e);
|
||||
}
|
||||
|
|
123
web/packages/shared/storage/cache.ts
Normal file
123
web/packages/shared/storage/cache.ts
Normal file
|
@ -0,0 +1,123 @@
|
|||
import log from "@/next/log";
|
||||
|
||||
export enum CACHES {
|
||||
THUMBS = "thumbs",
|
||||
FACE_CROPS = "face-crops",
|
||||
// Desktop app only
|
||||
FILES = "files",
|
||||
}
|
||||
|
||||
export interface LimitedCacheStorage {
|
||||
open: (
|
||||
cacheName: string,
|
||||
cacheLimitInBytes?: number,
|
||||
) => Promise<LimitedCache>;
|
||||
delete: (cacheName: string) => Promise<boolean>;
|
||||
}
|
||||
|
||||
export interface LimitedCache {
|
||||
match: (
|
||||
key: string,
|
||||
options?: { sizeInBytes?: number },
|
||||
) => Promise<Response>;
|
||||
put: (key: string, data: Response) => Promise<void>;
|
||||
delete: (key: string) => Promise<boolean>;
|
||||
}
|
||||
|
||||
class cacheStorageFactory {
|
||||
getCacheStorage(): LimitedCacheStorage {
|
||||
return transformBrowserCacheStorageToLimitedCacheStorage(caches);
|
||||
}
|
||||
}
|
||||
|
||||
export const CacheStorageFactory = new cacheStorageFactory();
|
||||
|
||||
function transformBrowserCacheStorageToLimitedCacheStorage(
|
||||
caches: CacheStorage,
|
||||
): LimitedCacheStorage {
|
||||
return {
|
||||
async open(cacheName) {
|
||||
const cache = await caches.open(cacheName);
|
||||
return {
|
||||
match: (key) => {
|
||||
// options are not supported in the browser
|
||||
return cache.match(key);
|
||||
},
|
||||
put: cache.put.bind(cache),
|
||||
delete: cache.delete.bind(cache),
|
||||
};
|
||||
},
|
||||
delete: caches.delete.bind(caches),
|
||||
};
|
||||
}
|
||||
|
||||
const SecurityError = "SecurityError";
|
||||
const INSECURE_OPERATION = "The operation is insecure.";
|
||||
|
||||
async function openCache(cacheName: string, cacheLimit?: number) {
|
||||
try {
|
||||
return await CacheStorageFactory.getCacheStorage().open(
|
||||
cacheName,
|
||||
cacheLimit,
|
||||
);
|
||||
} catch (e) {
|
||||
// ignoring insecure operation error, as it is thrown in incognito mode in firefox
|
||||
if (e.name === SecurityError && e.message === INSECURE_OPERATION) {
|
||||
// no-op
|
||||
} else {
|
||||
// log and ignore, we don't want to break the caller flow, when cache is not available
|
||||
log.error("openCache failed", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
async function deleteCache(cacheName: string) {
|
||||
try {
|
||||
return await CacheStorageFactory.getCacheStorage().delete(cacheName);
|
||||
} catch (e) {
|
||||
// ignoring insecure operation error, as it is thrown in incognito mode in firefox
|
||||
if (e.name === SecurityError && e.message === INSECURE_OPERATION) {
|
||||
// no-op
|
||||
} else {
|
||||
// log and ignore, we don't want to break the caller flow, when cache is not available
|
||||
log.error("deleteCache failed", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const CacheStorageService = { open: openCache, delete: deleteCache };
|
||||
|
||||
export async function cached(
|
||||
cacheName: string,
|
||||
id: string,
|
||||
get: () => Promise<Blob>,
|
||||
): Promise<Blob> {
|
||||
const cache = await CacheStorageService.open(cacheName);
|
||||
const cacheResponse = await cache.match(id);
|
||||
|
||||
let result: Blob;
|
||||
if (cacheResponse) {
|
||||
result = await cacheResponse.blob();
|
||||
} else {
|
||||
result = await get();
|
||||
|
||||
try {
|
||||
await cache.put(id, new Response(result));
|
||||
} catch (e) {
|
||||
// TODO: handle storage full exception.
|
||||
console.error("Error while storing file to cache: ", id);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete all cached data.
|
||||
*
|
||||
* Meant for use during logout, to reset the state of the user's account.
|
||||
*/
|
||||
export const clearCaches = async () => {
|
||||
await CacheStorageService.delete(CACHES.THUMBS);
|
||||
await CacheStorageService.delete(CACHES.FACE_CROPS);
|
||||
await CacheStorageService.delete(CACHES.FILES);
|
||||
};
|
|
@ -1,6 +0,0 @@
|
|||
export enum CACHES {
|
||||
THUMBS = "thumbs",
|
||||
FACE_CROPS = "face-crops",
|
||||
// Desktop app only
|
||||
FILES = "files",
|
||||
}
|
|
@ -1,28 +0,0 @@
|
|||
import { LimitedCacheStorage } from "./types";
|
||||
|
||||
class cacheStorageFactory {
|
||||
getCacheStorage(): LimitedCacheStorage {
|
||||
return transformBrowserCacheStorageToLimitedCacheStorage(caches);
|
||||
}
|
||||
}
|
||||
|
||||
export const CacheStorageFactory = new cacheStorageFactory();
|
||||
|
||||
function transformBrowserCacheStorageToLimitedCacheStorage(
|
||||
caches: CacheStorage,
|
||||
): LimitedCacheStorage {
|
||||
return {
|
||||
async open(cacheName) {
|
||||
const cache = await caches.open(cacheName);
|
||||
return {
|
||||
match: (key) => {
|
||||
// options are not supported in the browser
|
||||
return cache.match(key);
|
||||
},
|
||||
put: cache.put.bind(cache),
|
||||
delete: cache.delete.bind(cache),
|
||||
};
|
||||
},
|
||||
delete: caches.delete.bind(caches),
|
||||
};
|
||||
}
|
|
@ -1,55 +0,0 @@
|
|||
import log from "@/next/log";
|
||||
import { CacheStorageService } from ".";
|
||||
import { CACHES } from "./constants";
|
||||
import { LimitedCache } from "./types";
|
||||
|
||||
export async function cached(
|
||||
cacheName: string,
|
||||
id: string,
|
||||
get: () => Promise<Blob>,
|
||||
): Promise<Blob> {
|
||||
const cache = await CacheStorageService.open(cacheName);
|
||||
const cacheResponse = await cache.match(id);
|
||||
|
||||
let result: Blob;
|
||||
if (cacheResponse) {
|
||||
result = await cacheResponse.blob();
|
||||
} else {
|
||||
result = await get();
|
||||
|
||||
try {
|
||||
await cache.put(id, new Response(result));
|
||||
} catch (e) {
|
||||
// TODO: handle storage full exception.
|
||||
console.error("Error while storing file to cache: ", id);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
let thumbCache: LimitedCache;
|
||||
|
||||
export async function getBlobFromCache(
|
||||
cacheName: string,
|
||||
url: string,
|
||||
): Promise<Blob> {
|
||||
if (!thumbCache) {
|
||||
thumbCache = await CacheStorageService.open(cacheName);
|
||||
}
|
||||
const response = await thumbCache.match(url);
|
||||
if (!response) {
|
||||
return undefined;
|
||||
}
|
||||
return response.blob();
|
||||
}
|
||||
|
||||
export async function deleteAllCache() {
|
||||
try {
|
||||
await CacheStorageService.delete(CACHES.THUMBS);
|
||||
await CacheStorageService.delete(CACHES.FACE_CROPS);
|
||||
await CacheStorageService.delete(CACHES.FILES);
|
||||
} catch (e) {
|
||||
log.error("deleteAllCache failed", e); // log and ignore
|
||||
}
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
import log from "@/next/log";
|
||||
import { CacheStorageFactory } from "./factory";
|
||||
|
||||
const SecurityError = "SecurityError";
|
||||
const INSECURE_OPERATION = "The operation is insecure.";
|
||||
async function openCache(cacheName: string, cacheLimit?: number) {
|
||||
try {
|
||||
return await CacheStorageFactory.getCacheStorage().open(
|
||||
cacheName,
|
||||
cacheLimit,
|
||||
);
|
||||
} catch (e) {
|
||||
// ignoring insecure operation error, as it is thrown in incognito mode in firefox
|
||||
if (e.name === SecurityError && e.message === INSECURE_OPERATION) {
|
||||
// no-op
|
||||
} else {
|
||||
// log and ignore, we don't want to break the caller flow, when cache is not available
|
||||
log.error("openCache failed", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
async function deleteCache(cacheName: string) {
|
||||
try {
|
||||
return await CacheStorageFactory.getCacheStorage().delete(cacheName);
|
||||
} catch (e) {
|
||||
// ignoring insecure operation error, as it is thrown in incognito mode in firefox
|
||||
if (e.name === SecurityError && e.message === INSECURE_OPERATION) {
|
||||
// no-op
|
||||
} else {
|
||||
// log and ignore, we don't want to break the caller flow, when cache is not available
|
||||
log.error("deleteCache failed", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const CacheStorageService = { open: openCache, delete: deleteCache };
|
|
@ -1,16 +0,0 @@
|
|||
export interface LimitedCacheStorage {
|
||||
open: (
|
||||
cacheName: string,
|
||||
cacheLimitInBytes?: number,
|
||||
) => Promise<LimitedCache>;
|
||||
delete: (cacheName: string) => Promise<boolean>;
|
||||
}
|
||||
|
||||
export interface LimitedCache {
|
||||
match: (
|
||||
key: string,
|
||||
options?: { sizeInBytes?: number },
|
||||
) => Promise<Response>;
|
||||
put: (key: string, data: Response) => Promise<void>;
|
||||
delete: (key: string) => Promise<boolean>;
|
||||
}
|
Loading…
Add table
Reference in a new issue