@samitouri / QOSami-HFS / commits / e44dc5ef
Fork 0

QOSami-HFS is a web file server for your computer. Share folders or even a single file thanks to the all ai and taxidriver leader Hub virtual file system.

print progress while downloading an update, in case of slow connection

Massimo Melina committed Apr 21, 2026 at 00:07 UTC e44dc5efadb7c05e983d1553f55d90df6c7dcf75
1 file changed +13 -4
src/update.ts
+13 -4
@@ -4,10 +4,12 @@ import { apiGithubPaginated, getProjectInfo, getRepoInfo } from './github'
4 import { ARGS_FILE, HFS_REPO, IS_BINARY, IS_WINDOWS, IS_MAC, PREVIOUS_TAG, RUNNING_BETA } from './const'
5 import { dirname, join } from 'path'
6 import { spawn, spawnSync } from 'child_process'
7 -import { DAY, exists, unzip, prefix, xlate, HOUR, httpStream, statWithTimeout, repeat, debounceAsync } from './misc'
8 -import { createReadStream, existsSync, renameSync, unlinkSync, writeFileSync } from 'fs'
7 +import {
8 + DAY, exists, unzip, prefix, xlate, HOUR, httpStream, statWithTimeout, repeat, debounceAsync, formatPerc
9 +} from './misc'
10 +import { createReadStream, createWriteStream, existsSync, renameSync, unlinkSync, writeFileSync } from 'fs'
11 import { pluginsWatcher } from './plugins'
10 -import { chmod, rename, writeFile, rm } from 'fs/promises'
12 +import { chmod, rename, rm } from 'fs/promises'
13 import open from 'open'
14 import { configReady, currentVersion, defineConfig, versionToScalar } from './config'
15 import { cmdEscape, runningAsWindowsService } from './util-os'
@@ -15,6 +17,7 @@ import { onProcessExit, quit } from './first'
17 import { storedMap } from './persistence'
18 import _ from 'lodash'
19 import { argv } from './argv'
20 +import { pipeline } from 'stream/promises'
21
22 const updateToBeta = defineConfig('update_to_beta', false)
23 const autoCheckUpdate = defineConfig('auto_check_update', true)
@@ -143,7 +146,13 @@ export async function update(tagOrUrl: string='') {
146 const temp = LOCAL_UPDATE + '-temp'
147 await rm(temp, { force: true })
148 try {
146 - await writeFile(temp, await httpStream(url))
149 + const stream = await httpStream(url)
150 + const total = Number(stream.headers['content-length']) || 0
151 + let downloadedSize = 0
152 + const progress = total && setInterval(() => console.log("Download progress", formatPerc(downloadedSize / total)), 5_000)
153 + stream.on('data', chunk => downloadedSize += chunk.length)
154 + await pipeline(stream, createWriteStream(temp))
155 + .finally(() => clearInterval(progress))
156 }
157 catch(e: any) {
158 await rm(temp).catch(() => {}) // no leftovers