Files
VOREStation/tools/build/lib/download.ts
T
Kashargul 6cf7d1ab5f ports the chat panel and backend updates [NO GBP] (#18895)
* ports the chat  settings update

* .

* .

* follow up changes

* zod

* migration changes from jl

* this will blow up badly

* yuck

* .

* .

* order

* .

* :

* be gone

* .

* .

* logging

* dix logging

* move to its own atom

* fix settings import

* .

* fix audio

* tgui fix

* .

* archiving as atom

* more changes from JL

* bring back default archive  all

* no stale state

* no need to run twice

* -

* we need both anyway

* dep up

* .

* build fixes port

* Fix file path replacement in build script

* backend update

* .

* .

* use the tg method

* only use as unchunked fallback for say etc

* .

* linter errors

* tg's chunking methód should be sane enough

* sadly still not

* update for tg chunking

* force those

* jl suggestion

* .

* needs game atom

* push

* have this

* we only want to store if a page was changed or added

* only store what we really care about

* fixes import port

* we need settings first

* recoloring shouldn't be a pain

* partial

* .

* some type fixing

* .

* no throw of events

* ree map might not be there yet

* .

* always store our settings

* this is a valid crash

* ss early assets

* saver image access

* missed unsafe access

* .

* move chat loading order

* .

* .

* .

* .

* missing unregs

* keep the ref map name, just don't bother

* await the asset like redux did before

* try that?

* .

* use await

* biome up

* better handling as JL did on tg

* rename

* last dep up

* major bump here

* major bump

---------

Co-authored-by: Cameron Lennox <killer65311@gmail.com>
2026-01-06 11:56:31 +01:00

40 lines
1.1 KiB
TypeScript

import fs from 'node:fs';
import https from 'node:https';
import Juke from '../juke/index.js';
export function downloadFile(url: string, file: string): Promise<string> {
return new Promise((resolve, reject) => {
const file_stream = fs.createWriteStream(file);
https
.get(url, (response) => {
if (response.statusCode === 302 && response.headers.location) {
file_stream.close();
downloadFile(response.headers.location, file).then(() =>
resolve('ok'),
);
return;
}
if (response.statusCode !== 200) {
Juke.logger.error(
`Failed to download ${url}: Status ${response.statusCode}`,
);
file_stream.close();
reject();
return;
}
response.pipe(file_stream);
// after download completed close filestream
file_stream.on('finish', () => {
file_stream.close();
resolve('ok');
});
})
.on('error', (err) => {
file_stream.close();
Juke.logger.error(`Failed to download ${url}: ${err.message}`);
reject();
});
});
}