diff --git a/src/pages/file/utils/fileMgr.ts b/src/pages/file/utils/fileMgr.ts index e4da670..ee109cb 100644 --- a/src/pages/file/utils/fileMgr.ts +++ b/src/pages/file/utils/fileMgr.ts @@ -1,4 +1,4 @@ -import { type DataConnection } from "peerjs"; +import type { DataConnection } from "peerjs"; import { FileTransfer, TransferStatus, TransferTask } from "./fileTransfer"; import { peer } from "./peer"; import { MessageType } from "./peer"; @@ -327,14 +327,12 @@ export class FileInfo { } if (offset > 0) { const fileHandler = await dir.getFileHandle(name, { create: true }); - const arrayBuffer = await (await fileHandler.getFile()).arrayBuffer(); - const newSize = buffer.byteLength + offset; - const newArrayBuffer = arrayBuffer.byteLength >= newSize ? new Uint8Array(arrayBuffer.byteLength) : new Uint8Array(newSize); - newArrayBuffer.set(new Uint8Array(arrayBuffer), 0); - newArrayBuffer.set(new Uint8Array(buffer), offset); - - const writable = await fileHandler.createWritable(); - await writable.write(newArrayBuffer); + const writable = await fileHandler.createWritable({ keepExistingData: true }); + await writable.write({ + type: 'write', + position: offset, + data: buffer, + }); await writable.close(); } else { @@ -365,15 +363,12 @@ export class FileInfo { }) } else { if (offset > 0) { - const file = await (this.fileDirHandler as FileSystemFileHandle).getFile(); - const arrayBuffer = await file.arrayBuffer(); - const newSize = buffer.byteLength + offset; - const newArrayBuffer = arrayBuffer.byteLength >= newSize ? new Uint8Array(arrayBuffer.byteLength) : new Uint8Array(newSize); - newArrayBuffer.set(new Uint8Array(arrayBuffer), 0); - newArrayBuffer.set(new Uint8Array(buffer), offset); - - const writable = await (this.fileDirHandler as FileSystemFileHandle).createWritable(); - await writable.write(newArrayBuffer); + const writable = await (this.fileDirHandler as FileSystemFileHandle).createWritable({ keepExistingData: true }); + await writable.write({ + type: 'write', + position: offset, + data: buffer, + }); await writable.close(); } else { const writable = await (this.fileDirHandler as FileSystemFileHandle).createWritable(); @@ -514,4 +509,4 @@ export interface FileData { totalSize: number; buffer: ArrayBuffer; } -} \ No newline at end of file +} diff --git a/src/pages/file/utils/fileTransfer.ts b/src/pages/file/utils/fileTransfer.ts index 5a71053..091261d 100644 --- a/src/pages/file/utils/fileTransfer.ts +++ b/src/pages/file/utils/fileTransfer.ts @@ -80,6 +80,7 @@ export class FileTransfer { this.pausePromise = undefined; this.pauseResolve = undefined; this.aborted = false; + this.receiveQueue = Promise.resolve(); } // 设置进度回调 @@ -117,6 +118,7 @@ export class FileTransfer { public offset: number = 0; public totalSize: number = 0; private fileBuffer: ArrayBuffer | null = null; + private receiveQueue: Promise = Promise.resolve(); private async waitForWritable(targetBufferedAmount = MAX_BUFFERED_AMOUNT) { const dc = this.conn.dataChannel; if (!dc) { @@ -222,6 +224,17 @@ export class FileTransfer { public async receiveFile( fData: FileData, preView: boolean = false, + ): Promise { + this.receiveQueue = this.receiveQueue.then( + () => this.receiveFileChunk(fData, preView), + () => this.receiveFileChunk(fData, preView), + ); + return this.receiveQueue; + } + + private async receiveFileChunk( + fData: FileData, + preView: boolean = false, ): Promise { try { let task = this.getTask(fData);