@lynker-desktop/electron-sdk 0.0.9-alpha.89 → 0.0.9-alpha.90

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-downloader-helper.js","sources":["../../src/main/node-downloader-helper.js"],"sourcesContent":["import * as fs from 'fs';\nimport { URL } from 'url';\nimport * as path from 'path';\nimport * as http from 'http';\nimport * as https from 'https';\nimport { EventEmitter } from 'events';\n\nexport const DH_STATES = {\n IDLE: 'IDLE',\n SKIPPED: 'SKIPPED',\n STARTED: 'STARTED',\n DOWNLOADING: 'DOWNLOADING',\n RETRY: 'RETRY',\n PAUSED: 'PAUSED',\n RESUMED: 'RESUMED',\n STOPPED: 'STOPPED',\n FINISHED: 'FINISHED',\n FAILED: 'FAILED'\n};\n\nexport class DownloaderHelper extends EventEmitter {\n\n /**\n * Creates an instance of DownloaderHelper.\n * @param {String} url\n * @param {String} destFolder\n * @param {Object} [options={}]\n * @memberof DownloaderHelper\n */\n constructor(url, destFolder, options = {}) {\n super({ captureRejections: true });\n\n if (!this.__validate(url, destFolder)) {\n return;\n }\n\n this.url = this.requestURL = url.trim();\n this.state = DH_STATES.IDLE;\n this.__defaultOpts = {\n body: null,\n retry: false, // { maxRetries: 3, delay: 3000 }\n method: 'GET',\n headers: {},\n fileName: '',\n timeout: -1, // -1 use default\n metadata: null,\n override: false, // { skip: false, skipSmaller: false }\n forceResume: false,\n removeOnStop: true,\n removeOnFail: true,\n progressThrottle: 1000,\n httpRequestOptions: {},\n httpsRequestOptions: {},\n resumeOnIncomplete: true,\n resumeIfFileExists: false,\n resumeOnIncompleteMaxRetry: 5,\n };\n this.__opts = Object.assign({}, this.__defaultOpts);\n this.__pipes = [];\n this.__total = 0;\n this.__downloaded = 0;\n this.__progress = 0;\n this.__retryCount = 0;\n this.__retryTimeout = null;\n this.__resumeRetryCount = 0;\n this.__states = DH_STATES;\n this.__promise = null;\n this.__request = null;\n this.__response = null;\n this.__isAborted = false;\n this.__isResumed = false;\n this.__isResumable = false;\n this.__isRedirected = false;\n this.__destFolder = destFolder;\n this.__statsEstimate = {\n time: 0,\n bytes: 0,\n prevBytes: 0,\n throttleTime: 0,\n };\n this.__fileName = '';\n this.__filePath = '';\n this.updateOptions(options);\n }\n\n /**\n *\n *\n * @returns {Promise<boolean>}\n * @memberof DownloaderHelper\n */\n start() {\n const startPromise = () => new Promise((resolve, reject) => {\n this.__promise = { resolve, reject };\n this.__start();\n });\n\n // this will determine the file path from the headers\n // and attempt to get the file size and resume if possible\n if (this.__opts.resumeIfFileExists && this.state !== this.__states.RESUMED) {\n return this.getTotalSize().then(({ name, total }) => {\n const override = this.__opts.override;\n this.__opts.override = true;\n this.__filePath = this.__getFilePath(name);\n this.__opts.override = override;\n if (this.__filePath && fs.existsSync(this.__filePath)) {\n const fileSize = this.__getFilesizeInBytes(this.__filePath);\n return fileSize !== total\n ? this.resumeFromFile(this.__filePath, { total, fileName: name })\n : startPromise();\n }\n return startPromise();\n });\n }\n return startPromise();\n }\n\n /**\n *\n *\n * @returns {Promise<boolean>}\n * @memberof DownloaderHelper\n */\n pause() {\n if (this.state === this.__states.STOPPED) {\n return Promise.resolve(true);\n }\n\n if (this.__response) {\n this.__response.unpipe();\n this.__pipes.forEach(pipe => pipe.stream.unpipe());\n }\n\n if (this.__fileStream) {\n this.__fileStream.removeAllListeners();\n }\n\n this.__requestAbort();\n\n return this.__closeFileStream().then(() => {\n this.__setState(this.__states.PAUSED);\n this.emit('pause');\n return true;\n });\n }\n\n /**\n *\n *\n * @returns {Promise<boolean>}\n * @memberof DownloaderHelper\n */\n resume() {\n // if the promise is null, the download was started using resume instead of start\n if (!this.__promise) {\n return this.start();\n }\n\n if (this.state === this.__states.STOPPED) {\n return Promise.resolve(false);\n }\n\n this.__setState(this.__states.RESUMED);\n if (this.__isResumable) {\n this.__isResumed = true;\n this.__reqOptions['headers']['range'] = `bytes=${this.__downloaded}-`;\n }\n this.emit('resume', this.__isResumed);\n return this.__start();\n }\n\n /**\n *\n *\n * @returns {Promise<boolean>}\n * @memberof DownloaderHelper\n */\n stop() {\n if (this.state === this.__states.STOPPED) {\n return Promise.resolve(true);\n }\n const removeFile = () => new Promise((resolve, reject) => {\n fs.access(this.__filePath, _accessErr => {\n // if can't access, probably is not created yet\n if (_accessErr) {\n this.__emitStop();\n return resolve(true);\n }\n\n fs.unlink(this.__filePath, _err => {\n if (_err) {\n this.__setState(this.__states.FAILED);\n this.emit('error', _err);\n return reject(_err);\n }\n this.__emitStop();\n resolve(true);\n });\n });\n });\n\n this.__requestAbort();\n\n return this.__closeFileStream().then(() => {\n if (this.__opts.removeOnStop) {\n return removeFile();\n }\n this.__emitStop();\n return Promise.resolve(true);\n });\n }\n\n /**\n * Add pipes to the pipe list that will be applied later when the download starts\n * @url https://nodejs.org/api/stream.html#stream_readable_pipe_destination_options\n * @param {stream.Readable} stream https://nodejs.org/api/stream.html#stream_class_stream_readable\n * @param {Object} [options=null]\n * @returns {stream.Readable}\n * @memberof DownloaderHelper\n */\n pipe(stream, options = null) {\n this.__pipes.push({ stream, options });\n return stream;\n }\n\n /**\n * Unpipe an stream , if a stream is not specified, then all pipes are detached.\n *\n * @url https://nodejs.org/api/stream.html#stream_readable_unpipe_destination\n * @param {stream.Readable} [stream=null]\n * @returns\n * @memberof DownloaderHelper\n */\n unpipe(stream = null) {\n const unpipeStream = _stream => (this.__response)\n ? this.__response.unpipe(_stream)\n : _stream.unpipe();\n\n\n if (stream) {\n const pipe = this.__pipes.find(p => p.stream === stream);\n if (pipe) {\n unpipeStream(stream);\n this.__pipes = this.__pipes.filter(p => p.stream !== stream);\n }\n return;\n }\n\n this.__pipes.forEach(p => unpipeStream(p.stream));\n this.__pipes = [];\n }\n\n /**\n * Where the download will be saved\n *\n * @returns {String}\n * @memberof DownloaderHelper\n */\n getDownloadPath() {\n return this.__filePath;\n }\n\n /**\n * Indicates if the download can be resumable (available after the start phase)\n *\n * @returns {Boolean}\n * @memberof DownloaderHelper\n */\n isResumable() {\n return this.__isResumable;\n }\n\n /**\n * Updates the options, can be use on pause/resume events\n *\n * @param {Object} [options={}]\n * @param {String} [url='']\n * @memberof DownloaderHelper\n */\n updateOptions(options, url = '') {\n this.__opts = Object.assign({}, this.__opts, options);\n this.__headers = this.__opts.headers;\n\n if (this.__opts.timeout > -1) {\n this.__opts.httpRequestOptions.timeout = this.__opts.timeout;\n this.__opts.httpsRequestOptions.timeout = this.__opts.timeout;\n }\n\n // validate the progressThrottle, if invalid, use the default\n if (typeof this.__opts.progressThrottle !== 'number' || this.__opts.progressThrottle < 0) {\n this.__opts.progressThrottle = this.__defaultOpts.progressThrottle;\n }\n\n this.url = url || this.url;\n this.__reqOptions = this.__getReqOptions(this.__opts.method, this.url, this.__opts.headers);\n this.__initProtocol(this.url);\n }\n\n /**\n *\n * @returns {Object}\n */\n getOptions() {\n return this.__opts;\n }\n\n /**\n *\n * @returns {Object| null}\n */\n getMetadata() {\n return this.__opts.metadata;\n }\n\n /**\n * Current download progress stats\n *\n * @returns {Stats}\n * @memberof DownloaderHelper\n */\n getStats() {\n return {\n total: this.__total,\n name: this.__fileName,\n downloaded: this.__downloaded,\n progress: this.__progress,\n speed: this.__statsEstimate.bytes\n };\n }\n\n /**\n * Gets the total file size from the server\n *\n * @returns {Promise<{name:string, total:number|null}>}\n * @memberof DownloaderHelper\n */\n getTotalSize() {\n return new Promise((resolve, reject) => {\n const getReqOptions = (url) => {\n this.__initProtocol(url);\n const headers = Object.assign({}, this.__headers);\n if (headers.hasOwnProperty('range')) {\n delete headers['range'];\n }\n const reqOptions = this.__getReqOptions('HEAD', url, headers);\n return Object.assign({}, this.__reqOptions, reqOptions);\n };\n\n let retryCount = 0;\n let retryTimeout = null;\n\n const retry = (err, url) => {\n if (!this.__opts.retry || typeof this.__opts.retry !== 'object') {\n return Promise.reject(err || new Error('wrong retry options'));\n }\n\n if (retryTimeout) {\n clearTimeout(retryTimeout);\n retryTimeout = null;\n }\n\n const { delay: retryDelay = 0, maxRetries = 999 } = this.__opts.retry;\n\n if (retryCount >= maxRetries) {\n return Promise.reject(err || new Error('reached the maximum retries'));\n }\n\n retryCount++;\n this.__setState(this.__states.RETRY);\n this.emit('retry', retryCount, this.__opts.retry, err);\n\n return new Promise((resolveRetry) => {\n retryTimeout = setTimeout(() => {\n this.__setState(this.__states.IDLE);\n getRequest(url, getReqOptions(url));\n resolveRetry();\n }, retryDelay);\n });\n };\n\n const getRequest = (url, options) => {\n if (retryTimeout) {\n clearTimeout(retryTimeout);\n retryTimeout = null;\n }\n const req = this.__protocol.request(options, response => {\n if (this.__isRequireRedirect(response)) {\n const redirectedURL = /^https?:\\/\\//.test(response.headers.location)\n ? response.headers.location\n : new URL(response.headers.location, url).href;\n this.emit('redirected', redirectedURL, url);\n return getRequest(redirectedURL, getReqOptions(redirectedURL));\n }\n if (response.statusCode < 200 || response.statusCode >= 400) {\n const err = new Error(`Response status was ${response.statusCode}`);\n // 5xx server errors\n if (this.__opts.retry &&\n response.statusCode >= 500 && response.statusCode < 600) {\n return retry(err, url).catch(reject);\n }\n return reject(err);\n }\n resolve({\n name: this.__getFileNameFromHeaders(response.headers, response),\n total: parseInt(response.headers['content-length']) || null\n });\n });\n\n req.on('error', (err) => {\n if (this.__opts.retry) {\n return retry(err, url).catch(reject);\n }\n reject(err);\n });\n\n req.on('timeout', () => {\n if (this.__opts.retry) {\n return retry(new Error('timeout'), url).catch(reject);\n }\n reject(new Error('timeout'));\n });\n\n req.on('uncaughtException', (err) => {\n if (this.__opts.retry) {\n return retry(err, url).catch(reject);\n }\n reject(err);\n });\n\n req.end();\n };\n getRequest(this.url, getReqOptions(this.url));\n });\n }\n\n /**\n * Get the state required to resume the download after restart. This state\n * can be passed back to `resumeFromFile()` to resume a download\n *\n * @returns {Object} Returns the state required to resume\n * @memberof DownloaderHelper\n */\n getResumeState() {\n return {\n downloaded: this.__downloaded,\n filePath: this.__filePath,\n fileName: this.__fileName,\n total: this.__total,\n };\n }\n\n /**\n * Resume the download from a previous file path\n *\n * @param {string} filePath - The path to the file to resume from ex: C:\\Users\\{user}\\Downloads\\file.txt\n * @param {Object} state - (optionl) resume download state, if not provided it will try to fetch from the headers and filePath\n *\n * @returns {Promise<boolean>} - Returns the same result as `start()`\n * @memberof DownloaderHelper\n */\n resumeFromFile(filePath, state = {}) {\n this.__opts.override = true;\n this.__filePath = filePath;\n return ((state.total && state.fileName)\n ? Promise.resolve({ name: state.fileName, total: state.total })\n : this.getTotalSize())\n .then(({ name, total }) => {\n this.__total = state.total || total;\n this.__fileName = state.fileName || name;\n this.__downloaded = state.downloaded || this.__getFilesizeInBytes(this.__filePath);\n this.__reqOptions['headers']['range'] = `bytes=${this.__downloaded}-`;\n this.__isResumed = true;\n this.__isResumable = true;\n this.__setState(this.__states.RESUMED);\n this.emit('resume', this.__isResumed);\n return new Promise((resolve, reject) => {\n this.__promise = { resolve, reject };\n this.__start();\n });\n });\n }\n\n __start() {\n if (!this.__isRedirected &&\n this.state !== this.__states.RESUMED) {\n this.emit('start');\n this.__setState(this.__states.STARTED);\n this.__initProtocol(this.url);\n }\n\n // Start the Download\n this.__response = null;\n this.__isAborted = false;\n\n if (this.__request && !this.__request.destroyed) {\n this.__request.destroy()\n }\n\n if (this.__retryTimeout) {\n clearTimeout(this.__retryTimeout);\n this.__retryTimeout = null;\n }\n\n this.__request = this.__downloadRequest(this.__promise.resolve, this.__promise.reject);\n\n // Error Handling\n this.__request.on('error', this.__onError(this.__promise.resolve, this.__promise.reject));\n this.__request.on('timeout', this.__onTimeout(this.__promise.resolve, this.__promise.reject));\n this.__request.on('uncaughtException', this.__onError(this.__promise.resolve, this.__promise.reject, true));\n\n if (this.__opts.body) {\n this.__request.write(this.__opts.body);\n }\n\n this.__request.end();\n }\n\n /**\n * Resolve pending promises from Start method\n *\n * @memberof DownloaderHelper\n */\n __resolvePending() {\n if (!this.__promise) {\n return;\n }\n const { resolve } = this.__promise;\n this.__promise = null;\n return resolve(true);\n }\n\n /**\n *\n *\n * @param {Promise.resolve} resolve\n * @param {Promise.reject} reject\n * @returns {http.ClientRequest}\n * @memberof DownloaderHelper\n */\n __downloadRequest(resolve, reject) {\n return this.__protocol.request(this.__reqOptions, response => {\n this.__response = response;\n\n //Stats\n if (!this.__isResumed) {\n this.__total = parseInt(response.headers['content-length']) || null;\n this.__resetStats();\n }\n\n // Handle Redirects\n if (this.__isRequireRedirect(response)) {\n const redirectedURL = /^https?:\\/\\//.test(response.headers.location)\n ? response.headers.location\n : new URL(response.headers.location, this.url).href;\n this.__isRedirected = true;\n this.__initProtocol(redirectedURL);\n this.emit('redirected', redirectedURL, this.url);\n return this.__start();\n }\n\n // check if response wans't a success\n if (response.statusCode < 200 || response.statusCode >= 400) {\n const err = new Error(`Response status was ${response.statusCode}`);\n err.status = response.statusCode || 0;\n err.body = response.body || '';\n\n // 5xx server errors\n if (response.statusCode >= 500 && response.statusCode < 600) {\n return this.__onError(resolve, reject)(err);\n }\n this.__setState(this.__states.FAILED);\n this.emit('error', err);\n return reject(err);\n }\n\n if (this.__opts.forceResume) {\n this.__isResumable = true;\n } else if (response.headers.hasOwnProperty('accept-ranges') &&\n response.headers['accept-ranges'] !== 'none') {\n this.__isResumable = true;\n }\n\n this.__startDownload(response, resolve, reject);\n });\n }\n\n /**\n *\n *\n * @param {http.IncomingMessage} response\n * @param {Promise.resolve} resolve\n * @param {Promise.reject} reject\n * @memberof DownloaderHelper\n */\n __startDownload(response, resolve, reject) {\n let readable = response;\n\n if (!this.__isResumed) {\n const _fileName = this.__getFileNameFromHeaders(response.headers);\n this.__filePath = this.__getFilePath(_fileName);\n this.__fileName = this.__filePath.split(path.sep).pop();\n if (fs.existsSync(this.__filePath)) {\n const downloadedSize = this.__getFilesizeInBytes(this.__filePath);\n const totalSize = this.__total ? this.__total : 0;\n if (typeof this.__opts.override === 'object' &&\n this.__opts.override.skip && (\n this.__opts.override.skipSmaller ||\n downloadedSize >= totalSize)) {\n this.emit('skip', {\n totalSize: this.__total,\n fileName: this.__fileName,\n filePath: this.__filePath,\n downloadedSize: downloadedSize\n });\n this.__setState(this.__states.SKIPPED);\n return resolve(true);\n }\n }\n this.__fileStream = fs.createWriteStream(this.__filePath, {});\n } else {\n this.__fileStream = fs.createWriteStream(this.__filePath, { 'flags': 'a' });\n }\n\n // Start Downloading\n this.emit('download', {\n fileName: this.__fileName,\n filePath: this.__filePath,\n totalSize: this.__total,\n isResumed: this.__isResumed,\n downloadedSize: this.__downloaded\n });\n this.__retryCount = 0;\n this.__isResumed = false;\n this.__isRedirected = false;\n this.__setState(this.__states.DOWNLOADING);\n this.__statsEstimate.time = new Date();\n this.__statsEstimate.throttleTime = new Date();\n\n // Add externals pipe\n readable.on('data', chunk => this.__calculateStats(chunk.length));\n this.__pipes.forEach(pipe => {\n readable.pipe(pipe.stream, pipe.options);\n readable = pipe.stream;\n });\n readable.pipe(this.__fileStream);\n readable.on('error', this.__onError(resolve, reject));\n\n this.__fileStream.on('finish', this.__onFinished(resolve, reject));\n this.__fileStream.on('error', this.__onError(resolve, reject));\n }\n\n\n /**\n *\n *\n * @returns\n * @memberof DownloaderHelper\n */\n __hasFinished() {\n return !this.__isAborted && [\n this.__states.PAUSED,\n this.__states.STOPPED,\n this.__states.RETRY,\n this.__states.FAILED,\n this.__states.RESUMED\n ].indexOf(this.state) === -1;\n }\n\n\n /**\n *\n *\n * @param {IncomingMessage} response\n * @returns {Boolean}\n * @memberof DownloaderHelper\n */\n __isRequireRedirect(response) {\n return (response.statusCode > 300 &&\n response.statusCode < 400 &&\n response.headers.hasOwnProperty('location') &&\n response.headers.location);\n }\n\n /**\n *\n *\n * @param {Promise.resolve} resolve\n * @param {Promise.reject} reject\n * @returns {Function}\n * @memberof DownloaderHelper\n */\n __onFinished(resolve, reject) {\n return () => {\n this.__fileStream.close(_err => {\n if (_err) {\n return reject(_err);\n }\n if (this.__hasFinished()) {\n const isIncomplete = !this.__total ? false : this.__downloaded !== this.__total;\n\n if (isIncomplete && this.__isResumable && this.__opts.resumeOnIncomplete &&\n this.__resumeRetryCount <= this.__opts.resumeOnIncompleteMaxRetry) {\n this.__resumeRetryCount++;\n this.emit('warning', new Error('uncomplete download, retrying'));\n return this.resume();\n }\n\n this.__setState(this.__states.FINISHED);\n this.__pipes = [];\n this.emit('end', {\n fileName: this.__fileName,\n filePath: this.__filePath,\n totalSize: this.__total,\n incomplete: isIncomplete,\n onDiskSize: this.__getFilesizeInBytes(this.__filePath),\n downloadedSize: this.__downloaded,\n });\n }\n return resolve(this.__downloaded === this.__total);\n });\n };\n }\n\n /**\n *\n *\n * @returns\n * @memberof DownloaderHelper\n */\n __closeFileStream() {\n if (!this.__fileStream) {\n return Promise.resolve(true);\n }\n return new Promise((resolve, reject) => {\n this.__fileStream.close(err => {\n if (err) {\n return reject(err);\n }\n return resolve(true);\n });\n });\n }\n\n /**\n *\n * @param {Promise.resolve} resolve\n * @param {Promise.reject} reject\n * @param {boolean} abortReq\n * @returns {Function}\n * @memberof DownloaderHelper\n */\n __onError(resolve, reject, abortReq = false) {\n return err => {\n this.__pipes = [];\n\n if (abortReq) {\n this.__requestAbort();\n }\n\n if (this.state === this.__states.STOPPED ||\n this.state === this.__states.FAILED) {\n return;\n }\n if (!this.__opts.retry) {\n return this.__removeFile().finally(() => {\n this.__setState(this.__states.FAILED);\n this.emit('error', err);\n reject(err);\n });\n }\n return this.__retry(err)\n .catch(_err => {\n this.__removeFile().finally(() => {\n this.__setState(this.__states.FAILED);\n this.emit('error', _err ? _err : err);\n reject(_err ? _err : err);\n });\n });\n };\n }\n\n /**\n *\n *\n * @returns {Promise<boolean>}\n * @memberof DownloaderHelper\n */\n __retry(err = null) {\n if (!this.__opts.retry || typeof this.__opts.retry !== 'object') {\n return Promise.reject(err || new Error('wrong retry options'));\n }\n\n const { delay: retryDelay = 0, maxRetries = 999 } = this.__opts.retry;\n\n // reached the maximum retries\n if (this.__retryCount >= maxRetries) {\n return Promise.reject(err || new Error('reached the maximum retries'));\n }\n\n this.__retryCount++;\n this.__setState(this.__states.RETRY);\n this.emit('retry', this.__retryCount, this.__opts.retry, err);\n\n if (this.__response) {\n this.__response.unpipe();\n this.__pipes.forEach(pipe => pipe.stream.unpipe());\n }\n\n if (this.__fileStream) {\n this.__fileStream.removeAllListeners();\n }\n\n this.__requestAbort();\n\n return this.__closeFileStream().then(() =>\n new Promise((resolve) =>\n this.__retryTimeout = setTimeout(\n () => resolve(this.__downloaded > 0 ?\n this.resume() :\n this.__start()),\n retryDelay\n )\n )\n );\n }\n\n /**\n *\n * @param {Promise.resolve} resolve\n * @param {Promise.reject} reject\n * @returns {Function}\n * @memberof DownloaderHelper\n */\n __onTimeout(resolve, reject) {\n return () => {\n this.__requestAbort();\n\n if (!this.__opts.retry) {\n return this.__removeFile().finally(() => {\n this.__setState(this.__states.FAILED);\n this.emit('timeout');\n reject(new Error('timeout'));\n });\n }\n\n return this.__retry(new Error('timeout'))\n .catch(_err => {\n this.__removeFile().finally(() => {\n this.__setState(this.__states.FAILED);\n if (_err) {\n reject(_err);\n } else {\n this.emit('timeout');\n reject(new Error('timeout'));\n }\n });\n });\n };\n }\n\n /**\n *\n *\n * @memberof DownloaderHelper\n */\n __resetStats() {\n this.__retryCount = 0;\n this.__downloaded = 0;\n this.__progress = 0;\n this.__resumeRetryCount = 0;\n this.__statsEstimate = {\n time: 0,\n bytes: 0,\n prevBytes: 0,\n throttleTime: 0,\n };\n }\n\n /**\n *\n *\n * @param {Object} headers\n * @returns {String}\n * @memberof DownloaderHelper\n */\n __getFileNameFromHeaders(headers, response) {\n let fileName = '';\n\n const fileNameAndEncodingRegExp = /.*filename\\*=.*?'.*?'([^\"].+?[^\"])(?:(?:;)|$)/i // match everything after the specified encoding behind a case-insensitive `filename*=`\n const fileNameWithQuotesRegExp = /.*filename=\"(.*?)\";?/i // match everything inside the quotes behind a case-insensitive `filename=`\n const fileNameWithoutQuotesRegExp = /.*filename=([^\"].+?[^\"])(?:(?:;)|$)/i // match everything immediately after `filename=` that isn't surrounded by quotes and is followed by either a `;` or the end of the string\n\n const ContentDispositionHeaderExists = headers.hasOwnProperty('content-disposition')\n const fileNameAndEncodingMatch = !ContentDispositionHeaderExists ? null : headers['content-disposition'].match(fileNameAndEncodingRegExp)\n const fileNameWithQuotesMatch = (!ContentDispositionHeaderExists || fileNameAndEncodingMatch) ? null : headers['content-disposition'].match(fileNameWithQuotesRegExp)\n const fileNameWithoutQuotesMatch = (!ContentDispositionHeaderExists || fileNameAndEncodingMatch || fileNameWithQuotesMatch) ? null : headers['content-disposition'].match(fileNameWithoutQuotesRegExp)\n\n // Get Filename\n if (ContentDispositionHeaderExists && (fileNameAndEncodingMatch || fileNameWithQuotesMatch || fileNameWithoutQuotesMatch)) {\n\n fileName = headers['content-disposition'];\n fileName = fileName.trim();\n\n if (fileNameAndEncodingMatch) {\n fileName = fileNameAndEncodingMatch[1];\n } else if (fileNameWithQuotesMatch) {\n fileName = fileNameWithQuotesMatch[1];\n } else if (fileNameWithoutQuotesMatch) {\n fileName = fileNameWithoutQuotesMatch[1];\n }\n\n fileName = fileName.replace(/[/\\\\]/g, '');\n\n } else {\n\n if (path.basename(new URL(this.requestURL).pathname).length > 0) {\n fileName = path.basename(new URL(this.requestURL).pathname);\n } else {\n fileName = `${new URL(this.requestURL).hostname}.html`;\n }\n }\n\n return (\n (this.__opts.fileName)\n ? this.__getFileNameFromOpts(fileName, response)\n : fileName.replace(/\\.*$/, '') // remove any potential trailing '.' (just to be sure)\n )\n }\n\n /**\n *\n *\n * @param {String} fileName\n * @returns {String}\n * @memberof DownloaderHelper\n */\n __getFilePath(fileName) {\n const currentPath = path.join(this.__destFolder, fileName);\n let filePath = currentPath;\n\n if (!this.__opts.override && this.state !== this.__states.RESUMED) {\n filePath = this.__uniqFileNameSync(filePath);\n\n if (currentPath !== filePath) {\n this.emit('renamed', {\n 'path': filePath,\n 'fileName': filePath.split(path.sep).pop(),\n 'prevPath': currentPath,\n 'prevFileName': currentPath.split(path.sep).pop()\n });\n }\n }\n\n return filePath;\n }\n\n\n /**\n *\n *\n * @param {String} fileName\n * @returns {String}\n * @memberof DownloaderHelper\n */\n __getFileNameFromOpts(fileName, response) {\n\n if (!this.__opts.fileName) {\n return fileName;\n } else if (typeof this.__opts.fileName === 'string') {\n return this.__opts.fileName;\n } else if (typeof this.__opts.fileName === 'function') {\n const currentPath = path.join(this.__destFolder, fileName);\n if ((response && response.headers) || (this.__response && this.__response.headers)) {\n return this.__opts.fileName(fileName, currentPath, (response ? response : this.__response).headers['content-type']);\n } else {\n return this.__opts.fileName(fileName, currentPath);\n }\n } else if (typeof this.__opts.fileName === 'object') {\n\n const fileNameOpts = this.__opts.fileName; // { name:string, ext:true|false|string}\n const name = fileNameOpts.name;\n const ext = fileNameOpts.hasOwnProperty('ext')\n ? fileNameOpts.ext : false;\n\n if (typeof ext === 'string') {\n return `${name}.${ext}`;\n } else if (typeof ext === 'boolean') {\n // true: use the 'name' as full file name\n // false (default) only replace the name\n if (ext) {\n return name;\n } else {\n const _ext = fileName.includes('.') ? fileName.split('.').pop() : ''; // make sure there is a '.' in the fileName string\n return _ext !== '' ? `${name}.${_ext}` : name; // if there is no extension, replace the whole file name\n }\n }\n }\n\n return fileName;\n }\n\n /**\n *\n *\n * @param {Number} receivedBytes\n * @memberof DownloaderHelper\n */\n __calculateStats(receivedBytes) {\n const currentTime = new Date();\n const elaspsedTime = currentTime - this.__statsEstimate.time;\n const throttleElapseTime = currentTime - this.__statsEstimate.throttleTime;\n const total = this.__total || 0;\n\n if (!receivedBytes) {\n return;\n }\n\n this.__downloaded += receivedBytes;\n this.__progress = total === 0 ? 0 : (this.__downloaded / total) * 100;\n\n // Calculate the speed every second or if finished\n if (this.__downloaded === total || elaspsedTime > 1000) {\n this.__statsEstimate.time = currentTime;\n this.__statsEstimate.bytes = this.__downloaded - this.__statsEstimate.prevBytes;\n this.__statsEstimate.prevBytes = this.__downloaded;\n }\n\n if (this.__downloaded === total || throttleElapseTime > this.__opts.progressThrottle) {\n this.__statsEstimate.throttleTime = currentTime;\n this.emit('progress.throttled', this.getStats());\n }\n\n // emit the progress\n this.emit('progress', this.getStats());\n }\n\n /**\n *\n *\n * @param {String} state\n * @memberof DownloaderHelper\n */\n __setState(state) {\n this.state = state;\n this.emit('stateChanged', this.state);\n }\n\n /**\n *\n *\n * @param {String} method\n * @param {String} url\n * @param {Object} [headers={}]\n * @returns {Object}\n * @memberof DownloaderHelper\n */\n __getReqOptions(method, url, headers = {}) {\n const urlParse = new URL(url);\n const options = {\n protocol: urlParse.protocol,\n host: urlParse.hostname,\n port: urlParse.port,\n path: urlParse.pathname + urlParse.search,\n method,\n };\n\n if (headers) {\n options['headers'] = headers;\n }\n\n return options;\n }\n\n /**\n *\n *\n * @param {String} filePath\n * @returns {Number}\n * @memberof DownloaderHelper\n */\n __getFilesizeInBytes(filePath) {\n try {\n // 'throwIfNoEntry' was implemented on Node.js v14.17.0\n // so we added try/catch in case is using an older version\n const stats = fs.statSync(filePath, { throwIfNoEntry: false });\n const fileSizeInBytes = stats.size || 0;\n return fileSizeInBytes;\n } catch (err) {\n // mostly probably the file doesn't exist\n this.emit('warning', err);\n }\n return 0;\n }\n\n /**\n *\n *\n * @param {String} url\n * @param {String} destFolder\n * @returns {Boolean|Error}\n * @memberof DownloaderHelper\n */\n __validate(url, destFolder) {\n\n if (typeof url !== 'string') {\n throw new Error('URL should be an string');\n }\n\n if (url.trim() === '') {\n throw new Error(\"URL couldn't be empty\");\n }\n\n if (typeof destFolder !== 'string') {\n throw new Error('Destination Folder should be an string');\n }\n\n if (destFolder.trim() === '') {\n throw new Error(\"Destination Folder couldn't be empty\");\n }\n\n if (!fs.existsSync(destFolder)) {\n throw new Error('Destination Folder must exist');\n }\n return true;\n const stats = fs.statSync(destFolder);\n if (!stats.isDirectory()) {\n throw new Error('Destination Folder must be a directory');\n }\n\n try {\n fs.accessSync(destFolder, fs.constants.W_OK);\n } catch (e) {\n throw new Error('Destination Folder must be writable');\n }\n\n return true;\n }\n\n /**\n *\n *\n * @param {String} url\n * @memberof DownloaderHelper\n */\n __initProtocol(url) {\n const defaultOpts = this.__getReqOptions(this.__opts.method, url, this.__headers);\n this.requestURL = url;\n\n if (url.indexOf('https://') > -1) {\n this.__protocol = https;\n defaultOpts.agent = new https.Agent({ keepAlive: false });\n this.__reqOptions = Object.assign({}, defaultOpts, this.__opts.httpsRequestOptions);\n } else {\n this.__protocol = http;\n defaultOpts.agent = new http.Agent({ keepAlive: false });\n this.__reqOptions = Object.assign({}, defaultOpts, this.__opts.httpRequestOptions);\n }\n\n }\n\n /**\n *\n *\n * @param {String} path\n * @returns {String}\n * @memberof DownloaderHelper\n */\n __uniqFileNameSync(path) {\n if (typeof path !== 'string' || path === '') {\n return path;\n }\n\n try {\n // if access fail, the file doesnt exist yet\n fs.accessSync(path, fs.F_OK);\n const pathInfo = path.match(/(.*)(\\([0-9]+\\))(\\..*)$/);\n let base = pathInfo ? pathInfo[1].trim() : path;\n let suffix = pathInfo ? parseInt(pathInfo[2].replace(/\\(|\\)/, '')) : 0;\n let ext = path.split('.').pop();\n\n if (ext !== path && ext.length > 0) {\n ext = '.' + ext;\n base = base.replace(ext, '');\n } else {\n ext = '';\n }\n\n // generate a new path until it doesn't exist\n return this.__uniqFileNameSync(base + ' (' + (++suffix) + ')' + ext);\n } catch (err) {\n return path;\n }\n }\n\n /**\n *\n *\n * @returns {Promise<void>}\n * @memberof DownloaderHelper\n */\n __removeFile() {\n return new Promise(resolve => {\n if (!this.__fileStream) {\n return resolve();\n }\n this.__fileStream.close((err) => {\n if (err) {\n this.emit('warning', err);\n }\n if (this.__opts.removeOnFail) {\n return fs.access(this.__filePath, _accessErr => {\n // if can't access, probably is not created yet\n if (_accessErr) {\n return resolve();\n }\n\n fs.unlink(this.__filePath, (_err) => {\n if (_err) {\n this.emit('warning', err);\n }\n resolve();\n });\n });\n }\n resolve();\n });\n });\n }\n\n /**\n *\n *\n * @memberof DownloaderHelper\n */\n __requestAbort() {\n this.__isAborted = true;\n if (this.__retryTimeout) {\n clearTimeout(this.__retryTimeout);\n this.__retryTimeout = null;\n }\n\n if (this.__response) {\n this.__response.destroy();\n }\n\n if (this.__request) {\n // from node => v13.14.X\n if (this.__request.destroy) {\n this.__request.destroy();\n } else {\n this.__request.abort();\n }\n }\n }\n\n /**\n * @memberof DownloaderHelper\n */\n __emitStop() {\n this.__resolvePending();\n this.__setState(this.__states.STOPPED);\n this.emit('stop');\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"downloader.d.ts","sourceRoot":"","sources":["../src/main/downloader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"downloader.d.ts","sourceRoot":"","sources":["../src/main/downloader.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  const fs = require('node:fs');
2
2
  const path = require('node:path');
3
3
  const mime = require('mime-types');
4
- const nodeDownloaderHelper = require('node-downloader-helper');
5
4
  const electron = require('electron');
5
+ const index = require('./node-downloader-helper/index.js');
6
6
 
7
7
  /**
8
8
  * 最大重定向次数
@@ -118,9 +118,6 @@ class Downloader {
118
118
  // 检查是否是 macOS App Store 环境(process.mas)
119
119
  // 在 MAS 环境下,强制显示保存对话框,且不使用临时文件
120
120
  const isMas = process.mas === true;
121
- if (isMas) {
122
- options.showSaveDialog = true;
123
- }
124
121
  // 先检查是否是 base64 data URL(用于确定默认扩展名和特殊处理)
125
122
  const base64Info = this._isBase64DataUrl(url);
126
123
  const defaultExt = base64Info.isBase64 && base64Info.ext ? base64Info.ext : undefined;
@@ -129,6 +126,10 @@ class Downloader {
129
126
  let downloadDir;
130
127
  let downloadFileName;
131
128
  try {
129
+ // 在 MAS 环境下,如果未提供输出路径、输出目录或文件名,则显示保存对话框
130
+ if (isMas && (!options.outputPath || !options.outputDir || !options.fileName)) {
131
+ options.showSaveDialog = true;
132
+ }
132
133
  if (options.showSaveDialog) {
133
134
  // 显示保存对话框,让用户选择保存位置
134
135
  // 在 MAS 环境下,传递 isMas 标志以跳过权限检查
@@ -162,18 +163,20 @@ class Downloader {
162
163
  if (!outputPath || typeof outputPath !== 'string' || outputPath.trim().length === 0) {
163
164
  return this._createErrorResult('无法确定输出路径:路径解析结果无效', 'VALIDATION');
164
165
  }
165
- // 准备输出路径:确保目录存在、检查文件是否已存在
166
- try {
167
- const pathCheckResult = await this._prepareOutputPath(outputPath, options);
168
- if (pathCheckResult) {
169
- // 文件已存在且不允许覆盖,直接返回已存在的文件信息
170
- return pathCheckResult;
166
+ if (!isMas) {
167
+ // 准备输出路径:确保目录存在、检查文件是否已存在
168
+ try {
169
+ const pathCheckResult = await this._prepareOutputPath(outputPath, options);
170
+ if (pathCheckResult) {
171
+ // 文件已存在且不允许覆盖,直接返回已存在的文件信息
172
+ return pathCheckResult;
173
+ }
174
+ }
175
+ catch (error) {
176
+ // 路径准备失败:可能是权限问题或文件系统错误
177
+ const parsedError = this._parseError(error, url);
178
+ return this._createErrorResult(`准备输出路径失败: ${parsedError.message}`, parsedError.type);
171
179
  }
172
- }
173
- catch (error) {
174
- // 路径准备失败:可能是权限问题或文件系统错误
175
- const parsedError = this._parseError(error, url);
176
- return this._createErrorResult(`准备输出路径失败: ${parsedError.message}`, parsedError.type);
177
180
  }
178
181
  // 提取下载目录和文件名
179
182
  downloadDir = path.dirname(outputPath);
@@ -185,14 +188,16 @@ class Downloader {
185
188
  try {
186
189
  downloadDir = this._getDownloadsPath();
187
190
  // 确保备用目录存在(如果不存在则创建)
188
- if (!fs.existsSync(downloadDir)) {
189
- fs.mkdirSync(downloadDir, { recursive: true });
190
- // 创建后清除缓存,强制重新检查
191
- this._directoryAccessCache.delete(downloadDir);
192
- }
193
- // 验证备用目录是否可访问
194
- if (!this._isDirectoryAccessible(downloadDir)) {
195
- return this._createErrorResult(`无法访问下载目录: ${downloadDir},请检查目录权限`, 'PERMISSION');
191
+ if (!isMas) {
192
+ if (!fs.existsSync(downloadDir)) {
193
+ fs.mkdirSync(downloadDir, { recursive: true });
194
+ // 创建后清除缓存,强制重新检查
195
+ this._directoryAccessCache.delete(downloadDir);
196
+ }
197
+ // 验证备用目录是否可访问
198
+ if (!this._isDirectoryAccessible(downloadDir)) {
199
+ return this._createErrorResult(`无法访问下载目录: ${downloadDir},请检查目录权限`, 'PERMISSION');
200
+ }
196
201
  }
197
202
  }
198
203
  catch (error) {
@@ -225,7 +230,13 @@ class Downloader {
225
230
  : downloadFileName;
226
231
  return new Promise((resolve, reject) => {
227
232
  // 创建下载器实例(使用 node-downloader-helper)
228
- const dl = new nodeDownloaderHelper.DownloaderHelper(url, downloadDir, {
233
+ const masOptions = {
234
+ resumeOnIncomplete: false,
235
+ resumeOnComplete: false,
236
+ forceResume: false,
237
+ };
238
+ const dl = new index.DownloaderHelper(url, downloadDir, {
239
+ ...(isMas ? masOptions : {}),
229
240
  fileName: actualFileName,
230
241
  retry: {
231
242
  maxRetries: options.retry?.maxRetries ?? DEFAULT_RETRY.maxRetries,