Files
wanderer/web/src/lib/stores/upload_store.svelte.ts
Flomp 9276690d60 Federation (#327)
* 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 <>
2025-06-21 10:09:22 +02:00

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;
}