diff --git a/packages/electron-auto-updater/src/electronHttpExecutor.ts b/packages/electron-auto-updater/src/electronHttpExecutor.ts index 0af6505bb42..c6995a01cd3 100644 --- a/packages/electron-auto-updater/src/electronHttpExecutor.ts +++ b/packages/electron-auto-updater/src/electronHttpExecutor.ts @@ -1,9 +1,10 @@ import { Socket } from "net" import { net } from "electron" import { createWriteStream, ensureDir } from "fs-extra-p" +import { PassThrough } from "stream" import BluebirdPromise from "bluebird-lst-c" import * as path from "path" -import { HttpExecutor, DownloadOptions, HttpError, DigestTransform, checkSha2, calculateDownloadProgress, maxRedirects } from "electron-builder-http" +import { HttpExecutor, DownloadOptions, HttpError, DigestTransform, checkSha2, ProgressCallbackTransform, maxRedirects } from "electron-builder-http" import { safeLoad } from "js-yaml" import _debug from "debug" import Debugger = debug.Debugger @@ -75,24 +76,24 @@ export class ElectronHttpExecutor extends HttpExecutor { - transferred = calculateDownloadProgress(total, start, transferred, chunk, options.onProgress) - }) - } + transferProgressNotifier = new ProgressCallbackTransform(options.onProgress, total) + } ensureDirPromise .then(() => { const fileOut = createWriteStream(destination) if (options.sha2 == null) { - response.pipe(fileOut) + response.pipe(transferProgressNotifier) + .pipe(fileOut) } else { - response + response.pipe(transferProgressNotifier) .pipe(new DigestTransform(options.sha2)) .pipe(fileOut) } diff --git a/packages/electron-builder-http/src/httpExecutor.ts b/packages/electron-builder-http/src/httpExecutor.ts index 542a29dfd6c..5a1e0f67ac7 100644 --- a/packages/electron-builder-http/src/httpExecutor.ts +++ b/packages/electron-builder-http/src/httpExecutor.ts @@ -64,6 +64,22 @@ export class HttpError extends Error { } } +export class ProgressCallbackTransform extends Transform { + + private start = Date.now() + private transferred = 0 + + constructor(private onProgress: any, private total: number) { + super() + } + + _transform(chunk: any, encoding: string, callback: Function) { + this.transferred = calculateDownloadProgress(this.total, this.start, this.transferred, chunk, this.onProgress) + callback(null, chunk) + } + +} + export class DigestTransform extends Transform { private readonly digester = createHash("sha256") diff --git a/packages/electron-builder/src/util/nodeHttpExecutor.ts b/packages/electron-builder/src/util/nodeHttpExecutor.ts index d4570d5de52..3cfc0264d37 100644 --- a/packages/electron-builder/src/util/nodeHttpExecutor.ts +++ b/packages/electron-builder/src/util/nodeHttpExecutor.ts @@ -3,10 +3,11 @@ import { IncomingMessage, ClientRequest, Agent } from "http" import * as https from "https" import { createWriteStream, ensureDir, readFile } from "fs-extra-p" import BluebirdPromise from "bluebird-lst-c" +import { PassThrough } from "stream" import * as path from "path" import { homedir } from "os" import { parse as parseIni } from "ini" -import { HttpExecutor, DownloadOptions, HttpError, DigestTransform, checkSha2, calculateDownloadProgress, maxRedirects } from "electron-builder-http" +import { HttpExecutor, DownloadOptions, HttpError, DigestTransform, checkSha2, ProgressCallbackTransform, maxRedirects } from "electron-builder-http" import { RequestOptions } from "https" import { safeLoad } from "js-yaml" import { parse as parseUrl } from "url" @@ -17,7 +18,7 @@ export class NodeHttpExecutor extends HttpExecutor { return >(this.httpsAgent || (this.httpsAgent = createAgent())) - .then(it => new BluebirdPromise( (resolve, reject) => { + .then(it => new BluebirdPromise((resolve, reject) => { this.doDownload(url, destination, 0, options || {}, it, (error: Error) => { if (error == null) { resolve(destination) @@ -71,26 +72,23 @@ export class NodeHttpExecutor extends HttpExecutor { - transferred = calculateDownloadProgress(total, start, transferred, chunk, options.onProgress) - }) + transferProgressNotifier = new ProgressCallbackTransform(options.onProgress, total) - response.pause() } - ensureDirPromise .then(() => { const fileOut = createWriteStream(destination) if (options.sha2 == null) { - response.pipe(fileOut) + response.pipe(transferProgressNotifier) + .pipe(fileOut) } else { - response + response.pipe(transferProgressNotifier) .pipe(new DigestTransform(options.sha2)) .pipe(fileOut) }