import localforage from "localforage"; import { SHA1 } from "crypto-js"; import { HttpNetworkError } from "../common"; export const mockStorage = localforage.createInstance({ name: "mock-backend", description: "Database for mock back end.", driver: localforage.INDEXEDDB, }); export async function sha1(data: Blob): Promise { const s = await new Promise((resolve) => { const fileReader = new FileReader(); fileReader.readAsBinaryString(data); fileReader.onload = () => { resolve(fileReader.result as string); }; }); return SHA1(s).toString(); } const disableNetworkKey = "mockServer.disableNetwork"; const networkLatencyKey = "mockServer.networkLatency"; let disableNetwork: boolean = localStorage.getItem(disableNetworkKey) === "true" ? true : false; const savedNetworkLatency = localStorage.getItem(networkLatencyKey); let networkLatency: number | null = savedNetworkLatency != null ? Number(savedNetworkLatency) : null; Object.defineProperty(window, "disableNetwork", { get: () => disableNetwork, set: (value) => { if (value) { disableNetwork = true; localStorage.setItem(disableNetworkKey, "true"); } else { disableNetwork = false; localStorage.setItem(disableNetworkKey, "false"); } }, }); Object.defineProperty(window, "networkLatency", { get: () => networkLatency, set: (value) => { if (typeof value === "number") { networkLatency = value; localStorage.setItem(networkLatencyKey, value.toString()); } else if (value == null) { networkLatency = null; localStorage.removeItem(networkLatencyKey); } }, }); export async function mockPrepare(key: string): Promise { console.log(`Recieve request: ${key}`); if (disableNetwork) { console.warn("Network is disabled for mock server."); throw new HttpNetworkError(); } if (networkLatency != null) { await new Promise((resolve) => { window.setTimeout(() => { resolve(); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion }, networkLatency! * 1000); }); } await Promise.resolve(); }