2022-02-20 13:06:01 +01:00
|
|
|
import LRU from "lru-cache";
|
|
|
|
import { UpListing, UpObject } from "upend";
|
|
|
|
import type {
|
|
|
|
Address,
|
|
|
|
IJob,
|
|
|
|
InEntry,
|
|
|
|
IValue,
|
|
|
|
ListingResult,
|
|
|
|
PutResult,
|
2022-02-21 21:27:46 +01:00
|
|
|
VaultInfo,
|
|
|
|
StoreInfo,
|
2022-03-02 22:39:05 +01:00
|
|
|
AttributeListingResult,
|
2022-02-20 13:06:01 +01:00
|
|
|
} from "upend/types";
|
|
|
|
import type { EntityListing } from "./entity";
|
|
|
|
|
2022-09-08 19:32:36 +02:00
|
|
|
export const API_URL = "api";
|
|
|
|
|
2022-02-20 13:06:01 +01:00
|
|
|
export async function fetchEntity(address: string): Promise<UpObject> {
|
2022-09-08 19:32:36 +02:00
|
|
|
const entityFetch = await fetch(`${API_URL}/obj/${address}`);
|
2022-02-20 13:06:01 +01:00
|
|
|
const entityResult = (await entityFetch.json()) as EntityListing;
|
|
|
|
const entityListing = new UpListing(entityResult.entries);
|
|
|
|
return entityListing.getObject(address);
|
|
|
|
}
|
|
|
|
|
|
|
|
export async function fetchEntry(address: string) {
|
2022-09-08 19:32:36 +02:00
|
|
|
const response = await fetch(`${API_URL}/raw/${address}`);
|
2022-02-20 13:06:01 +01:00
|
|
|
const data = await response.json();
|
|
|
|
const listing = new UpListing({ address: data });
|
|
|
|
return listing.entries[0];
|
|
|
|
}
|
|
|
|
|
|
|
|
const queryOnceLRU = new LRU<string, UpListing>(128);
|
|
|
|
const inFlightRequests: { [key: string]: Promise<UpListing> } = {};
|
|
|
|
|
|
|
|
export async function queryOnce(query: string): Promise<UpListing> {
|
|
|
|
const cacheResult = queryOnceLRU.get(query);
|
|
|
|
if (!cacheResult) {
|
|
|
|
if (!inFlightRequests[query]) {
|
|
|
|
console.debug(`Querying: ${query}`);
|
|
|
|
inFlightRequests[query] = new Promise((resolve, reject) => {
|
2022-09-08 19:32:36 +02:00
|
|
|
fetch(`${API_URL}/query`, {
|
|
|
|
method: "POST",
|
|
|
|
body: query,
|
|
|
|
keepalive: true,
|
|
|
|
})
|
2022-02-20 13:06:01 +01:00
|
|
|
.then(async (response) => {
|
2023-01-24 19:18:11 +01:00
|
|
|
inFlightRequests[query] = null;
|
2022-02-20 13:06:01 +01:00
|
|
|
resolve(new UpListing(await response.json()));
|
|
|
|
})
|
|
|
|
.catch((err) => reject(err));
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
console.debug(`Chaining request for ${query}...`);
|
|
|
|
}
|
|
|
|
return await inFlightRequests[query];
|
|
|
|
} else {
|
|
|
|
console.debug(`Returning cached: ${query}`);
|
|
|
|
return cacheResult;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export async function putEntry(entry: InEntry): Promise<PutResult> {
|
2022-09-08 19:32:36 +02:00
|
|
|
const response = await fetch(`${API_URL}/obj`, {
|
2022-02-20 13:06:01 +01:00
|
|
|
method: "PUT",
|
|
|
|
headers: { "Content-Type": "application/json" },
|
|
|
|
body: JSON.stringify(entry),
|
|
|
|
});
|
|
|
|
|
|
|
|
return await response.json();
|
|
|
|
}
|
|
|
|
|
|
|
|
export async function putEntityAttribute(
|
|
|
|
entity: Address,
|
|
|
|
attribute: string,
|
|
|
|
value: IValue
|
|
|
|
): Promise<Address> {
|
2022-09-08 19:32:36 +02:00
|
|
|
const response = await fetch(`${API_URL}/obj/${entity}/${attribute}`, {
|
2022-02-20 13:06:01 +01:00
|
|
|
method: "PUT",
|
|
|
|
headers: { "Content-Type": "application/json" },
|
|
|
|
body: JSON.stringify(value),
|
|
|
|
});
|
|
|
|
|
|
|
|
return await response.json();
|
|
|
|
}
|
|
|
|
|
|
|
|
export async function uploadFile(file: File): Promise<PutResult> {
|
|
|
|
const formData = new FormData();
|
|
|
|
formData.append("file", file);
|
|
|
|
|
2023-04-24 19:25:02 +02:00
|
|
|
const response = await fetch(`${API_URL}/blob`, {
|
2022-02-20 13:06:01 +01:00
|
|
|
method: "PUT",
|
|
|
|
body: formData,
|
|
|
|
});
|
|
|
|
|
|
|
|
if (!response.ok) {
|
|
|
|
throw Error(await response.text());
|
|
|
|
}
|
|
|
|
|
|
|
|
return await response.json();
|
|
|
|
}
|
|
|
|
|
|
|
|
export async function deleteEntry(address: Address): Promise<void> {
|
2022-09-08 19:32:36 +02:00
|
|
|
await fetch(`${API_URL}/obj/${address}`, { method: "DELETE" });
|
2022-02-20 13:06:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
export async function getRaw(address: Address, preview = false) {
|
2022-09-08 19:32:36 +02:00
|
|
|
return await fetch(`${API_URL}/${preview ? "thumb" : "raw"}/${address}`);
|
2022-02-20 13:06:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
export async function refreshVault() {
|
2022-09-08 19:32:36 +02:00
|
|
|
return await fetch(`${API_URL}/refresh`, { method: "POST" });
|
2022-02-20 13:06:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
export async function nativeOpen(address: Address) {
|
2022-09-08 19:32:36 +02:00
|
|
|
return fetch(`${API_URL}/raw/${address}?native=1`);
|
2022-02-20 13:06:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
export async function fetchRoots(): Promise<ListingResult> {
|
2022-09-08 19:32:36 +02:00
|
|
|
const response = await fetch(`${API_URL}/hier_roots`);
|
2022-02-20 13:06:01 +01:00
|
|
|
return await response.json();
|
|
|
|
}
|
|
|
|
|
|
|
|
export async function fetchJobs(): Promise<IJob[]> {
|
2022-09-08 19:32:36 +02:00
|
|
|
const response = await fetch(`${API_URL}/jobs`);
|
2022-02-20 13:06:01 +01:00
|
|
|
return await response.json();
|
|
|
|
}
|
|
|
|
|
2022-03-02 22:39:05 +01:00
|
|
|
export async function fetchAllAttributes(): Promise<AttributeListingResult> {
|
2022-09-08 19:32:36 +02:00
|
|
|
const response = await fetch(`${API_URL}/all/attributes`);
|
2022-02-20 13:06:01 +01:00
|
|
|
return await response.json();
|
|
|
|
}
|
|
|
|
|
|
|
|
export async function fetchInfo(): Promise<VaultInfo> {
|
2022-09-08 19:32:36 +02:00
|
|
|
const response = await fetch(`${API_URL}/info`);
|
2022-02-20 13:06:01 +01:00
|
|
|
return await response.json();
|
|
|
|
}
|
2022-02-21 21:27:46 +01:00
|
|
|
|
2022-09-16 16:26:52 +02:00
|
|
|
export async function fetchStoreInfo(): Promise<{ [key: string]: StoreInfo }> {
|
2022-09-08 19:32:36 +02:00
|
|
|
const response = await fetch(`${API_URL}/store`);
|
2022-02-21 21:27:46 +01:00
|
|
|
return await response.json();
|
|
|
|
}
|
2023-01-07 11:00:55 +01:00
|
|
|
|
2023-04-24 19:25:02 +02:00
|
|
|
export async function getAddress(input: {
|
|
|
|
attribute: string;
|
|
|
|
}): Promise<string> {
|
2023-01-07 11:00:55 +01:00
|
|
|
const response = await fetch(
|
|
|
|
`${API_URL}/address?attribute=${input.attribute}`
|
|
|
|
);
|
|
|
|
return await response.json();
|
|
|
|
}
|