From bbbd0d52e9944b1832c19c4c88cf86b81672fd49 Mon Sep 17 00:00:00 2001 From: Sergii Stotskyi Date: Wed, 7 Sep 2016 04:53:42 +0300 Subject: [PATCH] feat(file): adds chunked blob writing (#529) This prevents devices crashing when user picks a big file to write --- src/plugins/file.ts | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/plugins/file.ts b/src/plugins/file.ts index 7c2fd28a63..2ad7defa20 100644 --- a/src/plugins/file.ts +++ b/src/plugins/file.ts @@ -1119,6 +1119,10 @@ export class File { * @private */ private static write(writer: FileWriter, gu: string | Blob): Promise { + if (gu instanceof Blob) { + return this.writeFileInChunks(writer, gu); + } + return new Promise((resolve, reject) => { writer.onwriteend = (evt) => { if (writer.error) { @@ -1130,4 +1134,32 @@ export class File { writer.write(gu); }); } + + /** + * @private + */ + private static writeFileInChunks(writer: FileWriter, file: Blob) { + const BLOCK_SIZE = 1024 * 1024; + let writtenSize = 0; + + function writeNextChunk() { + const size = Math.min(BLOCK_SIZE, file.size - writtenSize); + const chunk = file.slice(writtenSize, writtenSize + size); + + writtenSize += size; + writer.write(chunk); + } + + return new Promise((resolve, reject) => { + writer.onerror = reject; + writer.onwrite = () => { + if (writtenSize < file.size) { + writeNextChunk(); + } else { + resolve(); + } + }; + writeNextChunk(); + }); + } }