* initial commit federation * more federation * more federation * more federation * completes follow, accept, undo * add trail create activity * process trail create activity * more trail create activity * adds missing endpoints * adds update and delete activity * adds comment activities * adds activities back * adds summit logs activities * deletes follow counts table * fixes migrations * fixes migrations * fixes migrations * fixes migrations * adds remote profiles * ctd * ctd * we are getting closer... * adds public summit logs * fixes federated trails in lists * adds remote lists * adds list activites * fixes lists * adds notifications * adds iri redirect * fixes comments and summitlogs * fixes follows and profiles * adds asynchronous send * fixes list search * adds encryption key * bug fixes * fixes activity signing * removes custon activity object types * adds html editor * fixes html editor * fixes display issues on mastodon * adds federated sharing * finishes announcements * fixes small summit log issues * adds trail likes * finalizes likes * fixes images for komoot * add disable federation option * adds private profiles * updates docs * adds federated comments * adds trail and comments actvitiypub routes * adds mentions to editor * adds mentions to trails, comments, summit logs * updates theme * updates theme * update docs * update docs * updates docs * fixes various frontend problems * fixes activitypub follows api * updates docs * updates docs --------- Co-authored-by: Christian Beutel <>
57 lines
1.9 KiB
TypeScript
57 lines
1.9 KiB
TypeScript
import { APIError } from "$lib/util/api_util";
|
|
|
|
export type Upload = {
|
|
file: File;
|
|
status: "enqueued" | "uploading" | "cancelled" | "success" | "error" | "duplicate";
|
|
error?: string;
|
|
duplicate?: { id: string, domain: string, name: string };
|
|
progress: number;
|
|
function: (f: File, ignoreDuplicates?: boolean, onProgress?: (p: number) => void) => Promise<unknown>
|
|
};
|
|
|
|
class UploadStore {
|
|
enqueuedUploads: Upload[] = $state([]);
|
|
completedUploads: Upload[] = $state([]);
|
|
uploading: boolean = $state(false);
|
|
}
|
|
|
|
export const uploadStore = new UploadStore();
|
|
|
|
|
|
export async function processUploadQueue(batchSize: number = 3, ignoreDuplicates: boolean = false) {
|
|
if (uploadStore.uploading) {
|
|
return;
|
|
}
|
|
uploadStore.uploading = true;
|
|
|
|
while (uploadStore.enqueuedUploads.length > 0) {
|
|
const batch = uploadStore.enqueuedUploads.slice(0, batchSize);
|
|
const uploadPromises: Promise<unknown>[] = [];
|
|
for (const b of batch) {
|
|
b.status = "uploading";
|
|
uploadPromises.push(
|
|
b.function(b.file, ignoreDuplicates, (p: number) => {
|
|
b.progress = p
|
|
})
|
|
);
|
|
}
|
|
const results = await Promise.all(
|
|
uploadPromises.map((p) => p.catch((e) => e)),
|
|
);
|
|
results.forEach((r, i) => {
|
|
const u = batch[i];
|
|
if (r instanceof APIError && r.message == "Duplicate trail") {
|
|
u.status = "duplicate"
|
|
u.duplicate = { id: r.detail.id, domain: r.detail.domain, name: r.detail.name };
|
|
} else if (r instanceof APIError) {
|
|
u.status = "error"
|
|
u.error = r.message
|
|
} else {
|
|
u.status = "success"
|
|
}
|
|
uploadStore.completedUploads.push(u);
|
|
});
|
|
uploadStore.enqueuedUploads.splice(0, batchSize)
|
|
}
|
|
uploadStore.uploading = false;
|
|
} |