aboutsummaryrefslogtreecommitdiff
path: root/src/client/util
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/util')
-rw-r--r--src/client/util/Import & Export/DirectoryImportBox.tsx33
-rw-r--r--src/client/util/UtilExtensions.ts39
2 files changed, 55 insertions, 17 deletions
diff --git a/src/client/util/Import & Export/DirectoryImportBox.tsx b/src/client/util/Import & Export/DirectoryImportBox.tsx
index 260c6a629..5915f3412 100644
--- a/src/client/util/Import & Export/DirectoryImportBox.tsx
+++ b/src/client/util/Import & Export/DirectoryImportBox.tsx
@@ -92,29 +92,28 @@ export default class DirectoryImportBox extends React.Component<FieldViewProps>
this.completed = 0;
});
- let sizes = [];
- let modifiedDates = [];
+ let sizes: number[] = [];
+ let modifiedDates: number[] = [];
- let i = 0;
const uploads: FileResponse[] = [];
- const batchSize = 15;
- while (i < validated.length) {
- const cap = Math.min(validated.length, i + batchSize);
- let formData = new FormData();
- const batch = validated.slice(i, cap);
+ await validated.batch({
+ size: 15,
+ action: {
+ handler: async (batch: File[]) => {
+ sizes.push(...batch.map(file => file.size));
+ modifiedDates.push(...batch.map(file => file.lastModified));
- sizes.push(...batch.map(file => file.size));
- modifiedDates.push(...batch.map(file => file.lastModified));
+ let formData = new FormData();
+ batch.forEach(file => formData.append(Utils.GenerateGuid(), file));
+ const parameters = { method: 'POST', body: formData };
- batch.forEach(file => formData.append(Utils.GenerateGuid(), file));
- const parameters = { method: 'POST', body: formData };
- uploads.push(...(await (await fetch(Utils.prepend(RouteStore.upload), parameters)).json()));
-
- runInAction(() => this.completed += batch.length);
- i = cap;
- }
+ uploads.push(...(await (await fetch(Utils.prepend(RouteStore.upload), parameters)).json()));
+ runInAction(() => this.completed += batch.length);
+ }
+ }
+ });
await Promise.all(uploads.map(async upload => {
const type = upload.type;
diff --git a/src/client/util/UtilExtensions.ts b/src/client/util/UtilExtensions.ts
new file mode 100644
index 000000000..1e277b242
--- /dev/null
+++ b/src/client/util/UtilExtensions.ts
@@ -0,0 +1,39 @@
+module.exports.Batch = async function <T>(parameters: BatchParameters<T>) {
+ const { size, action } = parameters;
+ const batches: T[][] = [];
+ let i = 0;
+ while (i < this.length) {
+ const cap = Math.min(i + size, this.length);
+ batches.push(this.slice(i, cap));
+ i = cap;
+ }
+ console.log(`Beginning action on ${this.length} elements, split into ${batches.length} groups => ${batches.map(batch => batch.length).join(", ")}`);
+ if (action) {
+ const { handler, interval } = action;
+ if (!interval || batches.length === 1) {
+ for (let batch of batches) {
+ await handler(batch);
+ }
+ } else {
+ return new Promise<T[][]>(resolve => {
+ const iterator = batches[Symbol.iterator]();
+ const quota = batches.length;
+ let completed = 0;
+ const tag = setInterval(async () => {
+ const next = iterator.next();
+ if (next.done) {
+ clearInterval(tag);
+ return;
+ }
+ const batch = next.value;
+ console.log(`Handling next batch with ${batch.length} elements`);
+ await handler(batch);
+ if (++completed === quota) {
+ resolve(batches);
+ }
+ }, interval);
+ });
+ }
+ }
+ return batches;
+}; \ No newline at end of file