diff --git a/public/index.html b/public/index.html index e9b47dc..6dadad0 100644 --- a/public/index.html +++ b/public/index.html @@ -418,17 +418,22 @@ // handle success if(nomadnetPageDownload.status === "success" && nomadnetPageDownloadCallback.onSuccessCallback){ nomadnetPageDownloadCallback.onSuccessCallback(nomadnetPageDownload.page_content); + delete this.nomadnetPageDownloadCallbacks[getNomadnetPageDownloadCallbackKey]; return; } // handle failure if(nomadnetPageDownload.status === "failure" && nomadnetPageDownloadCallback.onFailureCallback){ nomadnetPageDownloadCallback.onFailureCallback(nomadnetPageDownload.failure_reason); + delete this.nomadnetPageDownloadCallbacks[getNomadnetPageDownloadCallbackKey]; return; } - // forget callbacks for this page download - delete this.nomadnetPageDownloadCallbacks[getNomadnetPageDownloadCallbackKey]; + // handle progress + if(nomadnetPageDownload.status === "progress" && nomadnetPageDownloadCallback.onProgressCallback){ + nomadnetPageDownloadCallback.onProgressCallback(nomadnetPageDownload.progress); + return; + } break; @@ -449,17 +454,22 @@ // handle success if(nomadnetFileDownload.status === "success" && nomadnetFileDownloadCallback.onSuccessCallback){ nomadnetFileDownloadCallback.onSuccessCallback(nomadnetFileDownload.file_name, nomadnetFileDownload.file_bytes); + delete this.nomadnetFileDownloadCallbacks[getNomadnetFileDownloadCallbackKey]; return; } // handle failure if(nomadnetFileDownload.status === "failure" && nomadnetFileDownloadCallback.onFailureCallback){ nomadnetFileDownloadCallback.onFailureCallback(nomadnetFileDownload.failure_reason); + delete this.nomadnetFileDownloadCallbacks[getNomadnetFileDownloadCallbackKey]; return; } - // forget callbacks for this file download - delete this.nomadnetFileDownloadCallbacks[getNomadnetFileDownloadCallbackKey]; + // handle progress + if(nomadnetFileDownload.status === "progress" && nomadnetFileDownloadCallback.onProgressCallback){ + nomadnetFileDownloadCallback.onProgressCallback(nomadnetFileDownload.progress); + return; + } break; @@ -567,7 +577,7 @@ "display_name": this.displayName, }); }, - async downloadNomadNetFile(destinationHash, filePath, onSuccessCallback, onFailureCallback) { + async downloadNomadNetFile(destinationHash, filePath, onSuccessCallback, onFailureCallback, onProgressCallback) { // do nothing if not connected to websocket if(!this.isWebsocketConnected){ @@ -581,6 +591,7 @@ this.nomadnetFileDownloadCallbacks[this.getNomadnetFileDownloadCallbackKey(destinationHash, filePath)] = { onSuccessCallback: onSuccessCallback, onFailureCallback: onFailureCallback, + onProgressCallback: onProgressCallback, }; // ask reticulum to download file from nomadnet @@ -597,7 +608,7 @@ } }, - async downloadNomadNetPage(destinationHash, pagePath, onSuccessCallback, onFailureCallback) { + async downloadNomadNetPage(destinationHash, pagePath, onSuccessCallback, onFailureCallback, onProgressCallback) { // do nothing if not connected to websocket if(!this.isWebsocketConnected){ @@ -611,6 +622,7 @@ this.nomadnetPageDownloadCallbacks[this.getNomadnetPageDownloadCallbackKey(destinationHash, pagePath)] = { onSuccessCallback: onSuccessCallback, onFailureCallback: onFailureCallback, + onProgressCallback: onProgressCallback, }; // ask reticulum to download page from nomadnet diff --git a/web.py b/web.py index 383473f..37214c4 100644 --- a/web.py +++ b/web.py @@ -226,10 +226,22 @@ class ReticulumWebChat: }, }))) + # handle file download progress + def on_file_download_progress(progress): + asyncio.run(client.send(json.dumps({ + "type": "nomadnet.file.download", + "nomadnet_file_download": { + "status": "progress", + "progress": progress, + "destination_hash": destination_hash.hex(), + "file_path": file_path, + }, + }))) + # todo: handle file download progress # download the file - NomadnetFileDownloader(destination_hash, file_path, on_file_download_success, on_file_download_failure) + NomadnetFileDownloader(destination_hash, file_path, on_file_download_success, on_file_download_failure, on_file_download_progress) # handle downloading a page from a nomadnet node elif _type == "nomadnet.page.download": @@ -265,10 +277,22 @@ class ReticulumWebChat: }, }))) + # handle page download progress + def on_page_download_progress(progress): + asyncio.run(client.send(json.dumps({ + "type": "nomadnet.page.download", + "nomadnet_page_download": { + "status": "progress", + "progress": progress, + "destination_hash": destination_hash.hex(), + "page_path": page_path, + }, + }))) + # todo: handle page download progress # download the page - NomadnetPageDownloader(destination_hash, page_path, on_page_download_success, on_page_download_failure) + NomadnetPageDownloader(destination_hash, page_path, on_page_download_success, on_page_download_failure, on_page_download_progress) # unhandled type else: @@ -536,7 +560,7 @@ class LXMFAnnounceHandler: class NomadnetDownloader: - def __init__(self, destination_hash: bytes, path: str, on_download_success: Callable[[bytes], None], on_download_failure: Callable[[str], None], timeout: int|None = None, auto_download=True): + def __init__(self, destination_hash: bytes, path: str, on_download_success: Callable[[bytes], None], on_download_failure: Callable[[str], None], on_progress_update: Callable[[float], None], timeout: int|None = None, auto_download=True): self.app_name = "nomadnetwork" self.aspects = "node" self.destination_hash = destination_hash @@ -544,6 +568,7 @@ class NomadnetDownloader: self.timeout = timeout self.on_download_success = on_download_success self.on_download_failure = on_download_failure + self.on_progress_update = on_progress_update if auto_download: self.download() @@ -595,16 +620,15 @@ class NomadnetDownloader: # handle download progress def on_progress(self, request_receipt): - print("response_progressed") - print(request_receipt) + self.on_progress_update(request_receipt.progress) class NomadnetPageDownloader(NomadnetDownloader): - def __init__(self, destination_hash: bytes, page_path: str, on_page_download_success: Callable[[str], None], on_page_download_failure: Callable[[str], None], timeout: int|None = None, auto_download=True): + def __init__(self, destination_hash: bytes, page_path: str, on_page_download_success: Callable[[str], None], on_page_download_failure: Callable[[str], None], on_progress_update: Callable[[float], None], timeout: int|None = None, auto_download=True): self.on_page_download_success = on_page_download_success self.on_page_download_failure = on_page_download_failure - super().__init__(destination_hash, page_path, self.on_download_success, self.on_download_failure, timeout, auto_download) + super().__init__(destination_hash, page_path, self.on_download_success, self.on_download_failure, on_progress_update, timeout, auto_download) # page download was successful, decode the response and send to provided callback def on_download_success(self, response_bytes): @@ -618,10 +642,10 @@ class NomadnetPageDownloader(NomadnetDownloader): class NomadnetFileDownloader(NomadnetDownloader): - def __init__(self, destination_hash: bytes, page_path: str, on_file_download_success: Callable[[str, bytes], None], on_file_download_failure: Callable[[str], None], timeout: int|None = None, auto_download=True): + def __init__(self, destination_hash: bytes, page_path: str, on_file_download_success: Callable[[str, bytes], None], on_file_download_failure: Callable[[str], None], on_progress_update: Callable[[float], None], timeout: int|None = None, auto_download=True): self.on_file_download_success = on_file_download_success self.on_file_download_failure = on_file_download_failure - super().__init__(destination_hash, page_path, self.on_download_success, self.on_download_failure, timeout, auto_download) + super().__init__(destination_hash, page_path, self.on_download_success, self.on_download_failure, on_progress_update, timeout, auto_download) # file download was successful, decode the response and send to provided callback def on_download_success(self, response):