From 042c9d9f6173dc7b649e2e450f5fe1d45d1c018c Mon Sep 17 00:00:00 2001 From: DivDE Date: Mon, 21 Aug 2023 08:18:22 +0200 Subject: [PATCH] Allow restarting an interrupted upload --- src/client/admin/EmitterInfo.svelte | 7 ++++--- src/client/model.ts | 2 +- src/client/storage/browserStorage.ts | 4 ++-- src/common/rpcInterface.ts | 4 ++-- src/server/clientConnection.ts | 2 ++ src/server/uploadManager.ts | 5 +++-- 6 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/client/admin/EmitterInfo.svelte b/src/client/admin/EmitterInfo.svelte index 026ca39..7b38403 100644 --- a/src/client/admin/EmitterInfo.svelte +++ b/src/client/admin/EmitterInfo.svelte @@ -103,13 +103,14 @@ {@const keyInFiles = `${emitter.emitterShortId}/${file.name}`} {@const valueInFiles = files?.[keyInFiles]}
- {@html iconFile}{file.name} ({formatSize(file.size, $_)}){file.name} ({formatSize(file.size, $_)}) {#if valueInFiles === file.size} {@html iconFileCheck} {:else if valueInFiles != null} - {formatSize(valueInFiles, $_)} + {formatSize(valueInFiles, $_)} {/if}
{/each} diff --git a/src/client/model.ts b/src/client/model.ts index 25cacba..7f1bace 100644 --- a/src/client/model.ts +++ b/src/client/model.ts @@ -296,7 +296,7 @@ export const createModel = () => { await removeFileByName(arg.fileName); }, async uploadFile(arg) { - await uploadFile(arg.fileName, arg.uploadURL); + await uploadFile(arg.fileName, arg.uploadURL, arg.startByte); }, async changeStreamConfig(arg) { emitterStreamConfig$.set(arg.streamConfig); diff --git a/src/client/storage/browserStorage.ts b/src/client/storage/browserStorage.ts index 3bf540b..2e49bc6 100644 --- a/src/client/storage/browserStorage.ts +++ b/src/client/storage/browserStorage.ts @@ -77,13 +77,13 @@ export const removeFileByName = async (name: string) => { refreshStorageFiles(); }; -export const uploadFile = async (name: string, url: string) => { +export const uploadFile = async (name: string, url: string, startByte: number) => { const directory = await navigator.storage.getDirectory(); const fileHandle = await directory.getFileHandle(name); const body = await fileHandle.getFile(); const res = await fetch(url, { method: "PUT", - body, + body: body.slice(startByte), }); console.log(res); }; diff --git a/src/common/rpcInterface.ts b/src/common/rpcInterface.ts index 3c51803..1f36faa 100644 --- a/src/common/rpcInterface.ts +++ b/src/common/rpcInterface.ts @@ -112,14 +112,14 @@ export interface RpcClientInterface { createAnswerRTCConnection(arg: { offer: RTCSessionDescriptionInit }): RTCSessionDescriptionInit; completeOfferRTCConnection(arg: { answer: RTCSessionDescriptionInit }): void; iceCandidate(arg: { candidate: RTCIceCandidateInit | null }): void; - uploadFile(arg: { fileName: string; uploadURL: string }): void; + uploadFile(arg: { fileName: string; uploadURL: string; startByte: number }): void; removeFile(arg: { fileName: string }): void; changeStreamConfig?(arg: { streamConfig: MediaStreamConstraints | undefined }): void; } export interface RpcServerInterface { iceCandidate?(arg: { candidate: RTCIceCandidateInit | null }): void; - uploadFile?(arg: { emitterId: string; fileName: string }): void; + uploadFile?(arg: { emitterId: string; fileName: string; startByte: number }): void; removeFile?(arg: { emitterId: string; fileName: string }): void; toggleRecording?(arg: { emitterId: string; action: "stop" | "start" | "newFile"; receiver?: boolean; emitter?: boolean }): void; transformImage?(arg: { emitterId: string; transformImage: TransformImage | undefined }): void; diff --git a/src/server/clientConnection.ts b/src/server/clientConnection.ts index 2451674..c84c10b 100644 --- a/src/server/clientConnection.ts +++ b/src/server/clientConnection.ts @@ -314,10 +314,12 @@ export const createClientsManager = ( const uploadURL = uploadManager.createUploadURL({ emitterShortId: emitter.shortId, fileName: arg.fileName, + startByte: arg.startByte, }); await emitter.api?.("uploadFile", { fileName: arg.fileName, uploadURL, + startByte: arg.startByte, }); } }, diff --git a/src/server/uploadManager.ts b/src/server/uploadManager.ts index 349d48c..e165270 100644 --- a/src/server/uploadManager.ts +++ b/src/server/uploadManager.ts @@ -11,6 +11,7 @@ import equal from "fast-deep-equal"; export interface FileInfo { emitterShortId: string; fileName: string; + startByte: number; } export const createUploadManager = (config: Pick, configFilePath: string) => { @@ -30,10 +31,10 @@ export const createUploadManager = (config: Pick receivedFiles$.update((receivedFiles) => { - receivedFiles[`${fileInfo.emitterShortId}/${fileInfo.fileName}`] = stream.bytesWritten; + receivedFiles[`${fileInfo.emitterShortId}/${fileInfo.fileName}`] = fileInfo.startByte + stream.bytesWritten; return receivedFiles; }); update();