fix: correctly fetch marka pi in background
This commit is contained in:
@@ -28,5 +28,5 @@ export const MainLayout = (
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return <>{children}</>;
|
return children;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ const duration = Deno.env.get("SESSION_DURATION");
|
|||||||
export const SESSION_DURATION = duration ? +duration : (60 * 60 * 24);
|
export const SESSION_DURATION = duration ? +duration : (60 * 60 * 24);
|
||||||
|
|
||||||
export const MARKA_API_KEY = Deno.env.get("MARKA_API_KEY");
|
export const MARKA_API_KEY = Deno.env.get("MARKA_API_KEY");
|
||||||
|
export const MARKA_API_URL = Deno.env.get("MARKA_API_URL");
|
||||||
|
|
||||||
export const JWT_SECRET = Deno.env.get("JWT_SECRET");
|
export const JWT_SECRET = Deno.env.get("JWT_SECRET");
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,8 @@
|
|||||||
import { createCache } from "../cache.ts";
|
import { createCache } from "../cache.ts";
|
||||||
import { MARKA_API_KEY } from "../env.ts";
|
import { MARKA_API_KEY, MARKA_API_URL } from "../env.ts";
|
||||||
import { getImage } from "../image.ts";
|
import { getImage } from "../image.ts";
|
||||||
import { GenericResource } from "./schema.ts";
|
import { GenericResource } from "./schema.ts";
|
||||||
|
|
||||||
const url = `https://marka.max-richter.dev`;
|
|
||||||
//const url = "http://localhost:8080";
|
|
||||||
|
|
||||||
async function addImageToResource<T extends GenericResource>(
|
async function addImageToResource<T extends GenericResource>(
|
||||||
resource: GenericResource,
|
resource: GenericResource,
|
||||||
): Promise<T> {
|
): Promise<T> {
|
||||||
@@ -15,7 +12,7 @@ async function addImageToResource<T extends GenericResource>(
|
|||||||
const absoluteImageUrl = (imageUrl.startsWith("https://") ||
|
const absoluteImageUrl = (imageUrl.startsWith("https://") ||
|
||||||
imageUrl.startsWith("http://"))
|
imageUrl.startsWith("http://"))
|
||||||
? imageUrl
|
? imageUrl
|
||||||
: `${url}/${imageUrl}`;
|
: `${MARKA_API_URL}/${imageUrl}`;
|
||||||
const image = await getImage(absoluteImageUrl);
|
const image = await getImage(absoluteImageUrl);
|
||||||
return { ...resource, image } as T;
|
return { ...resource, image } as T;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -31,29 +28,29 @@ type Resource = GenericResource & {
|
|||||||
|
|
||||||
const fetchCache = createCache<Resource>("marka");
|
const fetchCache = createCache<Resource>("marka");
|
||||||
const cacheLock = new Map<string, Promise<Resource>>();
|
const cacheLock = new Map<string, Promise<Resource>>();
|
||||||
|
|
||||||
|
async function fetchAndStoreUrl(url: string) {
|
||||||
|
const response = await fetch(url);
|
||||||
|
const res = await response.json();
|
||||||
|
fetchCache.set(url, res);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
async function cachedFetch(
|
async function cachedFetch(
|
||||||
url: string,
|
url: string,
|
||||||
): Promise<Resource | undefined> {
|
): Promise<Resource | undefined> {
|
||||||
if (fetchCache.has(url)) {
|
if (fetchCache.has(url)) {
|
||||||
|
fetchAndStoreUrl(url); // Fetch the url in the background
|
||||||
return fetchCache.get(url);
|
return fetchCache.get(url);
|
||||||
}
|
}
|
||||||
if (cacheLock.has(url)) {
|
|
||||||
return cacheLock.get(url);
|
if (cacheLock.has(url)) return cacheLock.get(url);
|
||||||
}
|
|
||||||
const response = (async () => {
|
const response = fetchAndStoreUrl(url);
|
||||||
const response = await fetch(url);
|
cacheLock.set(url, response);
|
||||||
const res = await response.json();
|
|
||||||
fetchCache.set(url, res);
|
|
||||||
return res;
|
|
||||||
})();
|
|
||||||
cacheLock.set(
|
|
||||||
url,
|
|
||||||
response,
|
|
||||||
);
|
|
||||||
const res = await response;
|
const res = await response;
|
||||||
if (!res) {
|
cacheLock.delete(url);
|
||||||
cacheLock.delete(url);
|
|
||||||
}
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,7 +58,7 @@ export async function fetchResource<T extends Resource>(
|
|||||||
resource: string,
|
resource: string,
|
||||||
): Promise<T | undefined> {
|
): Promise<T | undefined> {
|
||||||
try {
|
try {
|
||||||
const d = `${url}/resources/${resource}`;
|
const d = `${MARKA_API_URL}/resources/${resource}`;
|
||||||
const res = await cachedFetch(d);
|
const res = await cachedFetch(d);
|
||||||
if (!res) return;
|
if (!res) return;
|
||||||
return addImageToResource<T>(res);
|
return addImageToResource<T>(res);
|
||||||
@@ -74,7 +71,7 @@ export async function listResources<T extends GenericResource>(
|
|||||||
resource: string,
|
resource: string,
|
||||||
): Promise<T[]> {
|
): Promise<T[]> {
|
||||||
try {
|
try {
|
||||||
const d = `${url}/resources/${resource}`;
|
const d = `${MARKA_API_URL}/resources/${resource}`;
|
||||||
const list = await cachedFetch(d);
|
const list = await cachedFetch(d);
|
||||||
if (!list) return [];
|
if (!list) return [];
|
||||||
return Promise.all(
|
return Promise.all(
|
||||||
@@ -93,7 +90,7 @@ export async function createResource(
|
|||||||
) {
|
) {
|
||||||
const isJson = typeof content === "object" &&
|
const isJson = typeof content === "object" &&
|
||||||
!(content instanceof ArrayBuffer);
|
!(content instanceof ArrayBuffer);
|
||||||
const fetchUrl = `${url}/resources/${path}`;
|
const fetchUrl = `${MARKA_API_URL}/resources/${path}`;
|
||||||
const headers = new Headers();
|
const headers = new Headers();
|
||||||
headers.append("Content-Type", isJson ? "application/json" : "");
|
headers.append("Content-Type", isJson ? "application/json" : "");
|
||||||
if (MARKA_API_KEY) {
|
if (MARKA_API_KEY) {
|
||||||
|
|||||||
Reference in New Issue
Block a user