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