aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Wilkins <samwilkins333@gmail.com>2019-09-18 04:22:54 -0400
committerSam Wilkins <samwilkins333@gmail.com>2019-09-18 04:22:54 -0400
commit960b5babede63780bf91ce8fe8658e8c41925ecb (patch)
tree9a44d626751f2f0f0f914039dcc6d8f5b325f249
parent3f6f0a878b15aa5c569a8b522d1b24915749498e (diff)
final batching expansion
-rw-r--r--src/client/northstar/utils/Extensions.ts28
-rw-r--r--src/client/util/Import & Export/DirectoryImportBox.tsx2
-rw-r--r--src/client/util/UtilExtensions.ts135
-rw-r--r--src/server/apis/google/GooglePhotosUploadUtils.ts2
-rw-r--r--src/server/apis/google/existing_uploads.json1
-rw-r--r--src/server/credentials/google_docs_token.json2
-rw-r--r--src/server/index.ts7
7 files changed, 146 insertions, 31 deletions
diff --git a/src/client/northstar/utils/Extensions.ts b/src/client/northstar/utils/Extensions.ts
index 65af7ea87..3722bfd52 100644
--- a/src/client/northstar/utils/Extensions.ts
+++ b/src/client/northstar/utils/Extensions.ts
@@ -23,7 +23,6 @@ String.prototype.Truncate = function (length: number, replacement: string): Stri
interface BatchContext {
completedBatches: number;
remainingBatches: number;
- isFullBatch: boolean;
}
type BatchConverterSync<I, O> = (batch: I[], context: BatchContext) => O[];
type BatchHandlerSync<I> = (batch: I[], context: BatchContext) => void;
@@ -31,20 +30,43 @@ type BatchConverterAsync<I, O> = (batch: I[], context: BatchContext) => Promise<
type BatchHandlerAsync<I> = (batch: I[], context: BatchContext) => Promise<void>;
type BatchConverter<I, O> = BatchConverterSync<I, O> | BatchConverterAsync<I, O>;
type BatchHandler<I> = BatchHandlerSync<I> | BatchHandlerAsync<I>;
-type Batcher<I, A> = number | ((element: I, accumulator: A) => boolean | Promise<boolean>);
+type FixedBatcher = { batchSize: number } | { batchCount: number, mode?: Mode };
+interface PredicateBatcher<I, A> {
+ executor: (element: I, accumulator: A | undefined) => A | undefined;
+ initial: A;
+}
+interface PredicateBatcherAsync<I, A> {
+ executor: (element: I, accumulator: A | undefined) => Promise<A | undefined>;
+ initial: A;
+}
+type Batcher<I, A> = FixedBatcher | PredicateBatcher<I, A>;
+type BatcherAsync<I, A> = Batcher<I, A> | PredicateBatcherAsync<I, A>;
interface Array<T> {
- batch(batchSize: undefined): T[][];
+ fixedBatch<T>(batcher: FixedBatcher): T[][];
+ predicateBatch<T, A = undefined>(batcher: PredicateBatcher<T, A>): T[][];
+ predicateBatchAsync<T, A = undefined>(batcher: PredicateBatcherAsync<T, A>): Promise<T[][]>;
+ batch<A = undefined>(batcher: Batcher<T, A>): T[][];
+ batchAsync<A = undefined>(batcher: BatcherAsync<T, A>): Promise<T[][]>;
+
batchedForEach<A = undefined>(batcher: Batcher<T, A>, handler: BatchHandlerSync<T>): void;
batchedMap<O, A = undefined>(batcher: Batcher<T, A>, handler: BatchConverterSync<T, O>): O[];
+
batchedForEachAsync<A = undefined>(batcher: Batcher<T, A>, handler: BatchHandler<T>): Promise<void>;
batchedMapAsync<O, A = undefined>(batcher: Batcher<T, A>, handler: BatchConverter<T, O>): Promise<O[]>;
+
batchedForEachInterval<A = undefined>(batcher: Batcher<T, A>, handler: BatchHandler<T>, interval: number): Promise<void>;
batchedMapInterval<O, A = undefined>(batcher: Batcher<T, A>, handler: BatchConverter<T, O>, interval: number): Promise<O[]>;
+
lastElement(): T;
}
+Array.prototype.fixedBatch = extensions.FixedBatch;
+Array.prototype.predicateBatch = extensions.PredicateBatch;
+Array.prototype.predicateBatchAsync = extensions.PredicateBatchAsync;
Array.prototype.batch = extensions.Batch;
+Array.prototype.batchAsync = extensions.BatchAsync;
+
Array.prototype.batchedForEach = extensions.ExecuteInBatches;
Array.prototype.batchedMap = extensions.ConvertInBatches;
Array.prototype.batchedForEachAsync = extensions.ExecuteInBatchesAsync;
diff --git a/src/client/util/Import & Export/DirectoryImportBox.tsx b/src/client/util/Import & Export/DirectoryImportBox.tsx
index a86ef9a31..e3958e3a4 100644
--- a/src/client/util/Import & Export/DirectoryImportBox.tsx
+++ b/src/client/util/Import & Export/DirectoryImportBox.tsx
@@ -103,7 +103,7 @@ export default class DirectoryImportBox extends React.Component<FieldViewProps>
runInAction(() => this.phase = `Internal: uploading ${this.quota - this.completed} files to Dash...`);
- const uploads = await validated.batchedMapAsync<FileResponse>(15, async batch => {
+ const uploads = await validated.batchedMapAsync<FileResponse>({ batchSize: 15 }, async batch => {
const formData = new FormData();
const parameters = { method: 'POST', body: formData };
diff --git a/src/client/util/UtilExtensions.ts b/src/client/util/UtilExtensions.ts
index 792cd00a1..8bd8fd581 100644
--- a/src/client/util/UtilExtensions.ts
+++ b/src/client/util/UtilExtensions.ts
@@ -1,24 +1,118 @@
-module.exports.Batch = function <T>(batchSize: number): T[][] {
+module.exports.Batch = function <T, A>(batcher: Batcher<T, A>): T[][] {
+ if ("executor" in batcher) {
+ return this.predicateBatch(batcher);
+ } else {
+ return this.fixedBatch(batcher);
+ }
+};
+
+module.exports.BatchAsync = async function <T, A>(batcher: BatcherAsync<T, A>): Promise<T[][]> {
+ if ("executor" in batcher) {
+ return this.predicateBatchAsync(batcher);
+ } else {
+ return this.fixedBatch(batcher);
+ }
+};
+
+module.exports.PredicateBatch = function <T, A>(batcher: PredicateBatcher<T, A>): T[][] {
+ const batches: T[][] = [];
+ let batch: T[] = [];
+ const { executor, initial } = batcher;
+ let accumulator: A | undefined = initial;
+ for (let element of this) {
+ if ((accumulator = executor(element, accumulator)) !== undefined) {
+ batch.push(element);
+ } else {
+ batches.push(batch);
+ batch = [element];
+ }
+ }
+ batches.push(batch);
+ return batches;
+};
+
+module.exports.PredicateBatchAsync = async function <T, A>(batcher: PredicateBatcherAsync<T, A>): Promise<T[][]> {
+ const batches: T[][] = [];
+ let batch: T[] = [];
+ const { executor, initial } = batcher;
+ let accumulator: A | undefined = initial;
+ for (let element of this) {
+ if ((accumulator = await executor(element, accumulator)) !== undefined) {
+ batch.push(element);
+ } else {
+ batches.push(batch);
+ batch = [element];
+ }
+ }
+ batches.push(batch);
+ return batches;
+};
+
+enum Mode {
+ Balanced,
+ Even
+}
+
+module.exports.FixedBatch = function <T>(batcher: FixedBatcher): T[][] {
const batches: T[][] = [];
+ const length = this.length;
let i = 0;
- while (i < this.length) {
- const cap = Math.min(i + batchSize, this.length);
- batches.push(this.slice(i, cap));
- i = cap;
+ if ("batchSize" in batcher) {
+ const { batchSize } = batcher;
+ while (i < this.length) {
+ const cap = Math.min(i + batchSize, length);
+ batches.push(this.slice(i, i = cap));
+ }
+ } else if ("batchCount" in batcher) {
+ let { batchCount, mode } = batcher;
+ const resolved = mode || Mode.Balanced;
+ if (batchCount < 1) {
+ throw new Error("Batch count must be a positive integer!");
+ }
+ if (batchCount === 1) {
+ return [this];
+ }
+ if (batchCount >= this.length) {
+ return this.map((element: T) => [element]);
+ }
+
+ let length = this.length;
+ let size: number;
+
+ if (length % batchCount === 0) {
+ size = Math.floor(length / batchCount);
+ while (i < length) {
+ batches.push(this.slice(i, i += size));
+ }
+ } else if (resolved === Mode.Balanced) {
+ while (i < length) {
+ size = Math.ceil((length - i) / batchCount--);
+ batches.push(this.slice(i, i += size));
+ }
+ } else {
+ batchCount--;
+ size = Math.floor(length / batchCount);
+ if (length % size === 0) {
+ size--;
+ }
+ while (i < size * batchCount) {
+ batches.push(this.slice(i, i += size));
+ }
+ batches.push(this.slice(size * batchCount));
+ }
}
return batches;
};
-module.exports.ExecuteBatches = function <I>(batchSize: number, handler: BatchHandlerSync<I>): void {
+module.exports.ExecuteBatches = function <I, A>(batcher: Batcher<I, A>, handler: BatchHandlerSync<I>): void {
if (this.length) {
let completed = 0;
- const batches = this.batch(batchSize);
+ const batches = this.batch(batcher);
const quota = batches.length;
for (let batch of batches) {
const context: BatchContext = {
completedBatches: completed,
remainingBatches: quota - completed,
- isFullBatch: batch.length === batchSize
};
handler(batch, context);
completed++;
@@ -26,19 +120,18 @@ module.exports.ExecuteBatches = function <I>(batchSize: number, handler: BatchHa
}
};
-module.exports.ConvertInBatches = function <I, O>(batchSize: number, handler: BatchConverterSync<I, O>): O[] {
+module.exports.ConvertInBatches = function <I, O, A>(batcher: Batcher<I, A>, handler: BatchConverterSync<I, O>): O[] {
if (!this.length) {
return [];
}
let collector: O[] = [];
let completed = 0;
- const batches = this.batch(batchSize);
+ const batches = this.batch(batcher);
const quota = batches.length;
for (let batch of batches) {
const context: BatchContext = {
completedBatches: completed,
remainingBatches: quota - completed,
- isFullBatch: batch.length === batchSize
};
collector.push(...handler(batch, context));
completed++;
@@ -46,16 +139,15 @@ module.exports.ConvertInBatches = function <I, O>(batchSize: number, handler: Ba
return collector;
};
-module.exports.ExecuteInBatchesAsync = async function <I>(batchSize: number, handler: BatchHandler<I>): Promise<void> {
+module.exports.ExecuteInBatchesAsync = async function <I, A>(batcher: BatcherAsync<I, A>, handler: BatchHandler<I>): Promise<void> {
if (this.length) {
let completed = 0;
- const batches = this.batch(batchSize);
+ const batches = await this.batchAsync(batcher);
const quota = batches.length;
for (let batch of batches) {
const context: BatchContext = {
completedBatches: completed,
remainingBatches: quota - completed,
- isFullBatch: batch.length === batchSize
};
await handler(batch, context);
completed++;
@@ -63,19 +155,18 @@ module.exports.ExecuteInBatchesAsync = async function <I>(batchSize: number, han
}
};
-module.exports.ConvertInBatchesAsync = async function <I, O>(batchSize: number, handler: BatchConverter<I, O>): Promise<O[]> {
+module.exports.ConvertInBatchesAsync = async function <I, O, A>(batcher: BatcherAsync<I, A>, handler: BatchConverter<I, O>): Promise<O[]> {
if (!this.length) {
return [];
}
let collector: O[] = [];
let completed = 0;
- const batches = this.batch(batchSize);
+ const batches = await this.batchAsync(batcher);
const quota = batches.length;
for (let batch of batches) {
const context: BatchContext = {
completedBatches: completed,
remainingBatches: quota - completed,
- isFullBatch: batch.length === batchSize
};
collector.push(...(await handler(batch, context)));
completed++;
@@ -83,11 +174,11 @@ module.exports.ConvertInBatchesAsync = async function <I, O>(batchSize: number,
return collector;
};
-module.exports.ExecuteInBatchesAtInterval = async function <I>(batchSize: number, handler: BatchHandler<I>, interval: number): Promise<void> {
+module.exports.ExecuteInBatchesAtInterval = async function <I, A>(batcher: BatcherAsync<I, A>, handler: BatchHandler<I>, interval: number): Promise<void> {
if (!this.length) {
return;
}
- const batches = this.batch(batchSize);
+ const batches = await this.batchAsync(batcher);
const quota = batches.length;
return new Promise<void>(async resolve => {
const iterator = batches[Symbol.iterator]();
@@ -100,7 +191,6 @@ module.exports.ExecuteInBatchesAtInterval = async function <I>(batchSize: number
const context: BatchContext = {
completedBatches: completed,
remainingBatches: quota - completed,
- isFullBatch: batch.length === batchSize
};
await handler(batch, context);
resolve();
@@ -114,12 +204,12 @@ module.exports.ExecuteInBatchesAtInterval = async function <I>(batchSize: number
});
};
-module.exports.ConvertInBatchesAtInterval = async function <I, O>(batchSize: number, handler: BatchConverter<I, O>, interval: number): Promise<O[]> {
+module.exports.ConvertInBatchesAtInterval = async function <I, O, A>(batcher: BatcherAsync<I, A>, handler: BatchConverter<I, O>, interval: number): Promise<O[]> {
if (!this.length) {
return [];
}
let collector: O[] = [];
- const batches = this.batch(batchSize);
+ const batches = await this.batchAsync(batcher);
const quota = batches.length;
return new Promise<O[]>(async resolve => {
const iterator = batches[Symbol.iterator]();
@@ -132,7 +222,6 @@ module.exports.ConvertInBatchesAtInterval = async function <I, O>(batchSize: num
const context: BatchContext = {
completedBatches: completed,
remainingBatches: quota - completed,
- isFullBatch: batch.length === batchSize
};
collector.push(...(await handler(batch, context)));
resolve();
diff --git a/src/server/apis/google/GooglePhotosUploadUtils.ts b/src/server/apis/google/GooglePhotosUploadUtils.ts
index 734d77fd7..9733c7ec5 100644
--- a/src/server/apis/google/GooglePhotosUploadUtils.ts
+++ b/src/server/apis/google/GooglePhotosUploadUtils.ts
@@ -80,7 +80,7 @@ export namespace GooglePhotosUploadUtils {
});
})).newMediaItemResults;
};
- const newMediaItemResults = await newMediaItems.batchedMapInterval(50, createFromUploadTokens, 0.1);
+ const newMediaItemResults = await newMediaItems.batchedMapInterval({ batchSize: 50 }, createFromUploadTokens, 0.1);
return { newMediaItemResults };
};
diff --git a/src/server/apis/google/existing_uploads.json b/src/server/apis/google/existing_uploads.json
index e3cca7a97..e69de29bb 100644
--- a/src/server/apis/google/existing_uploads.json
+++ b/src/server/apis/google/existing_uploads.json
@@ -1 +0,0 @@
-{"23394":{"mediaPaths":["C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_9d5ae803-8c10-4e85-8751-53d2fe71277f_o.png","C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_9d5ae803-8c10-4e85-8751-53d2fe71277f_s.png","C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_9d5ae803-8c10-4e85-8751-53d2fe71277f_m.png","C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_9d5ae803-8c10-4e85-8751-53d2fe71277f_l.png"],"fileNames":{"clean":"upload_9d5ae803-8c10-4e85-8751-53d2fe71277f.png","_o":"upload_9d5ae803-8c10-4e85-8751-53d2fe71277f_o.png","_s":"upload_9d5ae803-8c10-4e85-8751-53d2fe71277f_s.png","_m":"upload_9d5ae803-8c10-4e85-8751-53d2fe71277f_m.png","_l":"upload_9d5ae803-8c10-4e85-8751-53d2fe71277f_l.png"},"contentSize":23394,"contentType":"image/jpeg"},"23406":{"mediaPaths":["C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_fd27edc4-99a0-4405-b1f6-4c70924667c8_o.png","C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_fd27edc4-99a0-4405-b1f6-4c70924667c8_s.png","C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_fd27edc4-99a0-4405-b1f6-4c70924667c8_m.png","C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_fd27edc4-99a0-4405-b1f6-4c70924667c8_l.png"],"fileNames":{"clean":"upload_fd27edc4-99a0-4405-b1f6-4c70924667c8.png","_o":"upload_fd27edc4-99a0-4405-b1f6-4c70924667c8_o.png","_s":"upload_fd27edc4-99a0-4405-b1f6-4c70924667c8_s.png","_m":"upload_fd27edc4-99a0-4405-b1f6-4c70924667c8_m.png","_l":"upload_fd27edc4-99a0-4405-b1f6-4c70924667c8_l.png"},"contentSize":23406,"contentType":"image/jpeg"},"45210":{"mediaPaths":["C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_e46cf381-3841-48bc-833b-019a5c6157e3_o.png","C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_e46cf381-3841-48bc-833b-019a5c6157e3_s.png","C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_e46cf381-3841-48bc-833b-019a5c6157e3_m.png","C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_e46cf381-3841-48bc-833b-019a5c6157e3_l.png"],"fileNames":{"clean":"upload_e46cf381-3841-48bc-833b-019a5c6157e3.png","_o":"upload_e46cf381-3841-48bc-833b-019a5c6157e3_o.png","_s":"upload_e46cf381-3841-48bc-833b-019a5c6157e3_s.png","_m":"upload_e46cf381-3841-48bc-833b-019a5c6157e3_m.png","_l":"upload_e46cf381-3841-48bc-833b-019a5c6157e3_l.png"},"contentSize":45210,"contentType":"image/jpeg"},"45229":{"mediaPaths":["C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_ba4f46ea-f2ab-4dcd-8da0-4f89916e665b_o.png","C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_ba4f46ea-f2ab-4dcd-8da0-4f89916e665b_s.png","C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_ba4f46ea-f2ab-4dcd-8da0-4f89916e665b_m.png","C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_ba4f46ea-f2ab-4dcd-8da0-4f89916e665b_l.png"],"fileNames":{"clean":"upload_ba4f46ea-f2ab-4dcd-8da0-4f89916e665b.png","_o":"upload_ba4f46ea-f2ab-4dcd-8da0-4f89916e665b_o.png","_s":"upload_ba4f46ea-f2ab-4dcd-8da0-4f89916e665b_s.png","_m":"upload_ba4f46ea-f2ab-4dcd-8da0-4f89916e665b_m.png","_l":"upload_ba4f46ea-f2ab-4dcd-8da0-4f89916e665b_l.png"},"contentSize":45229,"contentType":"image/jpeg"},"45230":{"mediaPaths":["C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_2d39b115-4fcb-4bef-abbe-cdaa029c11f5_o.png","C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_2d39b115-4fcb-4bef-abbe-cdaa029c11f5_s.png","C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_2d39b115-4fcb-4bef-abbe-cdaa029c11f5_m.png","C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_2d39b115-4fcb-4bef-abbe-cdaa029c11f5_l.png"],"fileNames":{"clean":"upload_2d39b115-4fcb-4bef-abbe-cdaa029c11f5.png","_o":"upload_2d39b115-4fcb-4bef-abbe-cdaa029c11f5_o.png","_s":"upload_2d39b115-4fcb-4bef-abbe-cdaa029c11f5_s.png","_m":"upload_2d39b115-4fcb-4bef-abbe-cdaa029c11f5_m.png","_l":"upload_2d39b115-4fcb-4bef-abbe-cdaa029c11f5_l.png"},"contentSize":45230,"contentType":"image/jpeg"},"45286":{"mediaPaths":["C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_3c726016-3c72-4a4a-8dfd-ce7a6977c8e0_o.png","C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_3c726016-3c72-4a4a-8dfd-ce7a6977c8e0_s.png","C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_3c726016-3c72-4a4a-8dfd-ce7a6977c8e0_m.png","C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_3c726016-3c72-4a4a-8dfd-ce7a6977c8e0_l.png"],"fileNames":{"clean":"upload_3c726016-3c72-4a4a-8dfd-ce7a6977c8e0.png","_o":"upload_3c726016-3c72-4a4a-8dfd-ce7a6977c8e0_o.png","_s":"upload_3c726016-3c72-4a4a-8dfd-ce7a6977c8e0_s.png","_m":"upload_3c726016-3c72-4a4a-8dfd-ce7a6977c8e0_m.png","_l":"upload_3c726016-3c72-4a4a-8dfd-ce7a6977c8e0_l.png"},"contentSize":45286,"contentType":"image/jpeg"},"45585":{"mediaPaths":["C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_7e097c1d-1c8b-433b-ae3b-25beafe95a64_o.png","C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_7e097c1d-1c8b-433b-ae3b-25beafe95a64_s.png","C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_7e097c1d-1c8b-433b-ae3b-25beafe95a64_m.png","C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_7e097c1d-1c8b-433b-ae3b-25beafe95a64_l.png"],"fileNames":{"clean":"upload_7e097c1d-1c8b-433b-ae3b-25beafe95a64.png","_o":"upload_7e097c1d-1c8b-433b-ae3b-25beafe95a64_o.png","_s":"upload_7e097c1d-1c8b-433b-ae3b-25beafe95a64_s.png","_m":"upload_7e097c1d-1c8b-433b-ae3b-25beafe95a64_m.png","_l":"upload_7e097c1d-1c8b-433b-ae3b-25beafe95a64_l.png"},"contentSize":45585,"contentType":"image/jpeg"},"74829":{"mediaPaths":["C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_8eacbcc4-b350-4767-9808-01d5b46e9b6a_o.png","C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_8eacbcc4-b350-4767-9808-01d5b46e9b6a_s.png","C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_8eacbcc4-b350-4767-9808-01d5b46e9b6a_m.png","C:\\Users\\avd\\Desktop\\Sam\\Dash-Web\\src\\server\\public\\files\\upload_8eacbcc4-b350-4767-9808-01d5b46e9b6a_l.png"],"fileNames":{"clean":"upload_8eacbcc4-b350-4767-9808-01d5b46e9b6a.png","_o":"upload_8eacbcc4-b350-4767-9808-01d5b46e9b6a_o.png","_s":"upload_8eacbcc4-b350-4767-9808-01d5b46e9b6a_s.png","_m":"upload_8eacbcc4-b350-4767-9808-01d5b46e9b6a_m.png","_l":"upload_8eacbcc4-b350-4767-9808-01d5b46e9b6a_l.png"},"contentSize":74829,"contentType":"image/jpeg"}} \ No newline at end of file
diff --git a/src/server/credentials/google_docs_token.json b/src/server/credentials/google_docs_token.json
index 9765dd4e3..be50f4dd2 100644
--- a/src/server/credentials/google_docs_token.json
+++ b/src/server/credentials/google_docs_token.json
@@ -1 +1 @@
-{"access_token":"ya29.ImCGB4LCtQF4V2mY1S4ANuTSrclZ6R4QYDq5RGezUwTnk381Fg9b-oZYtJTdkW2zwryoFDjCRXaMGJqPvzIBYZvsFm1Zdwi_AH1by2bDAEOl0GqFlZukxa2W036ujGDv8tY","refresh_token":"1/HTv_xFHszu2Nf3iiFrUTaeKzC_Vp2-6bpIB06xW_WHI","scope":"https://www.googleapis.com/auth/presentations.readonly https://www.googleapis.com/auth/documents.readonly https://www.googleapis.com/auth/drive.file https://www.googleapis.com/auth/documents https://www.googleapis.com/auth/photoslibrary https://www.googleapis.com/auth/photoslibrary.appendonly https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/presentations https://www.googleapis.com/auth/photoslibrary.sharing","token_type":"Bearer","expiry_date":1568708539924} \ No newline at end of file
+{"access_token":"ya29.ImCHB-QNh-blUK7Ajw1Dk1yNBZ7w5JAKcrgzW4xYE3sfNTLdq_gXEQOK0ZZeJBPL1_WcJbbX7EKuMxWN-fwWMuhAG6-IHk1TpkOG1KZpSGo3myT7xiZDnONxLfVuodT0Nlc","refresh_token":"1/HTv_xFHszu2Nf3iiFrUTaeKzC_Vp2-6bpIB06xW_WHI","scope":"https://www.googleapis.com/auth/presentations.readonly https://www.googleapis.com/auth/documents.readonly https://www.googleapis.com/auth/drive.file https://www.googleapis.com/auth/documents https://www.googleapis.com/auth/photoslibrary https://www.googleapis.com/auth/photoslibrary.appendonly https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/presentations https://www.googleapis.com/auth/photoslibrary.sharing","token_type":"Bearer","expiry_date":1568797587975} \ No newline at end of file
diff --git a/src/server/index.ts b/src/server/index.ts
index 9da6a8b38..7fe2ba132 100644
--- a/src/server/index.ts
+++ b/src/server/index.ts
@@ -835,7 +835,12 @@ export interface NewMediaItem {
};
}
+Array.prototype.fixedBatch = extensions.FixedBatch;
+Array.prototype.predicateBatch = extensions.PredicateBatch;
+Array.prototype.predicateBatchAsync = extensions.PredicateBatchAsync;
Array.prototype.batch = extensions.Batch;
+Array.prototype.batchAsync = extensions.BatchAsync;
+
Array.prototype.batchedForEach = extensions.ExecuteInBatches;
Array.prototype.batchedMap = extensions.ConvertInBatches;
Array.prototype.batchedForEachAsync = extensions.ExecuteInBatchesAsync;
@@ -865,7 +870,7 @@ app.post(RouteStore.googlePhotosMediaUpload, async (req, res) => {
return newMediaItems;
};
- const newMediaItems = await mediaInput.batchedMapInterval(25, dispatchUpload, 0.1);
+ const newMediaItems = await mediaInput.batchedMapInterval({ batchSize: 25 }, dispatchUpload, 0.1);
if (failed) {
return _error(res, tokenError);