Initial
This commit is contained in:
1
resources/app/dist/files/downloader.mjs
vendored
Normal file
1
resources/app/dist/files/downloader.mjs
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import EventEmitter from"node:events";import fs from"node:fs";import path from"node:path";import{fetchWithTimeout}from"../../common/utils/http.mjs";export default class FileDownloader extends EventEmitter{constructor(e,t){super(),this._url=e,this._localPath=t}_url;_localPath;download=()=>new Promise((async e=>{const t=path.dirname(this._localPath);if(!fs.existsSync(t))return this.emit("error",new Error(`Local directory ${t} does not exist!`)),void e();try{fs.accessSync(t,fs.constants.W_OK)}catch(r){return this.emit("error",new Error(`You do not have permission to write content in ${t}: ${r.message}`)),void e()}let r;try{r=await this.#e()}catch(t){return t.message=`An unexpected error occurred when downloading file ${this._url}: ${t.message}`,this.emit("error",t),void e()}this.emit("fetched");const o=fs.createWriteStream(this._localPath);o.on("error",(e=>this.emit("error",e))),o.on("finish",(()=>{o.close(),e()}));const i=Number(r.headers.get("content-length")||1e8);let s=0;for await(const e of r.body)s+=e.length,o.write(e),this.emit("progress",s,i);o.end()}));async#e(){let e;try{e=await fetchWithTimeout(this._url,{referrerPolicy:"no-referrer"})}catch(t){if(406!==t.code)throw t;e=await fetchWithTimeout(this._url,{referrerPolicy:"no-referrer",mode:"same-origin",headers:{"sec-fetch-mode":"same-origin"}})}return e}}
|
||||
Reference in New Issue
Block a user