Teamlinker/code/server/common/request/request.ts
2023-11-06 22:15:31 +08:00

65 lines
1.9 KiB
TypeScript

import * as https from 'https'
import {IncomingHttpHeaders} from "http"
import * as fs from "fs-extra";
import * as crypto from "crypto";
export const request=(urlOptions: string | https.RequestOptions | URL, data = ''):Promise<{
statusCode:number,
headers:IncomingHttpHeaders,
body:string
}> => new Promise((resolve, reject) => {
const req = https.request(urlOptions, res => {
const chunks = []
res.on('data', chunk => chunks.push(chunk))
res.on('error', reject)
res.on('end', () => {
const { statusCode, headers } = res
const validResponse = statusCode >= 200 && statusCode <= 299
const body = chunks.join('')
if (validResponse) resolve({ statusCode, headers, body })
else reject(new Error(`Request failed. status: ${statusCode}, body: ${body}`))
})
})
req.on('error', reject)
req.write(data, 'binary')
req.end()
})
export const download=(uri:string,dest:string):Promise<{
md5:string,
size:number
}>=>{
return new Promise(async (resolve, reject)=>{
await fs.ensureFile(dest)
const file = fs.createWriteStream(dest);
https.get(uri, (res)=>{
if(res.statusCode !== 200){
reject(res.statusCode);
return;
}
const hash = crypto.createHash("md5");
let size=0;
res.on("data",chunk => {
hash.update(chunk, "utf8");
size+=chunk.length
});
file.on('finish', ()=>{
file.close(err => {
const md5 = hash.digest("hex");
resolve({
md5,
size
})
});
}).on('error', (err)=>{
fs.unlink(dest);
reject(err.message);
})
res.pipe(file);
});
});
}