-
Notifications
You must be signed in to change notification settings - Fork 0
/
hashes.mjs
107 lines (92 loc) · 3.64 KB
/
hashes.mjs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import axios from "axios"
import fs from "fs-extra"
import crypto from "crypto"
import path from "path"
import os from "os"
/**
* Downloads a file from the specified URL and saves it to a temporary file.
* @param {string} url - The URL of the file to download.
* @returns {Promise<string>} - A promise that resolves to the path of the downloaded temporary file.
*/
async function downloadFile(url) {
const tmpDir = os.tmpdir()
const tmpFilePath = path.join(tmpDir, `downloaded-file-${Date.now()}`)
const writer = fs.createWriteStream(tmpFilePath)
const response = await axios({
method: "get",
url: url,
responseType: "stream"
})
response.data.pipe(writer)
return new Promise((resolve, reject) => {
writer.on("finish", () => resolve(tmpFilePath))
writer.on("error", reject)
})
}
/**
* Computes the SHA-512 hash of a file.
* @param {string} filePath - The path to the file.
* @returns {Promise<string>} - A promise that resolves to the SHA-512 hash of the file.
*/
function computeSHA512(filePath) {
return new Promise((resolve, reject) => {
const hash = crypto.createHash("sha512")
const stream = fs.createReadStream(filePath)
stream.on("data", data => hash.update(data))
stream.on("end", () => resolve(hash.digest("hex")))
stream.on("error", reject)
})
}
/**
* Downloads multiple files from URLs, computes their SHA-512 hashes, and removes the temporary files.
* Outputs the result as a record: Record<URL, hash>.
* @param {string[]} urls - An array of URLs to download files from.
* @returns {Promise<Record<string, string>>} - A promise that resolves to a record of URL to hash.
*/
async function downloadAndHashMultiple(urls) {
const result = {}
for (const url of urls) {
try {
console.log(`Downloading file from: ${url}`)
const tmpFilePath = await downloadFile(url)
console.log(`Computing SHA-512 hash for: ${tmpFilePath}`)
const hash = await computeSHA512(tmpFilePath)
console.log(`SHA-512 hash for ${url}: ${hash}`)
// Add the hash to the result record
result[
url
.split("https://cdn.filen.io/@filen/desktop/bin/fuse-t/")
.join("")
.split("https://cdn.filen.io/@filen/desktop/bin/rclone/")
.join("")
.split("https://cdn.filen.io/@filen/desktop/bin/winfsp/")
.join("")
] = hash
// Remove the temporary file
fs.unlinkSync(tmpFilePath)
console.log(`Temporary file ${tmpFilePath} removed.`)
} catch (error) {
console.error(`Error processing ${url}:`, error)
}
}
return result
}
const rcloneVersion = "1680"
const fuseTVersion = "1042"
const winfspVersion = "2124051"
const urls = [
"https://cdn.filen.io/@filen/desktop/bin/rclone/filen_rclone_darwin_arm64_" + rcloneVersion,
"https://cdn.filen.io/@filen/desktop/bin/rclone/filen_rclone_darwin_x64_" + rcloneVersion,
"https://cdn.filen.io/@filen/desktop/bin/rclone/filen_rclone_linux_arm64_" + rcloneVersion,
"https://cdn.filen.io/@filen/desktop/bin/rclone/filen_rclone_linux_ia32_" + rcloneVersion,
"https://cdn.filen.io/@filen/desktop/bin/rclone/filen_rclone_linux_x64_" + rcloneVersion,
"https://cdn.filen.io/@filen/desktop/bin/rclone/filen_rclone_win32_arm64_" + rcloneVersion + ".exe",
"https://cdn.filen.io/@filen/desktop/bin/rclone/filen_rclone_win32_ia32_" + rcloneVersion + ".exe",
"https://cdn.filen.io/@filen/desktop/bin/rclone/filen_rclone_win32_ia32_" + rcloneVersion + ".exe",
"https://cdn.filen.io/@filen/desktop/bin/rclone/filen_rclone_win32_x64_" + rcloneVersion + ".exe",
"https://cdn.filen.io/@filen/desktop/bin/fuse-t/fuse_t_" + fuseTVersion + ".pkg",
"https://cdn.filen.io/@filen/desktop/bin/winfsp/winfsp_" + winfspVersion + ".msi"
]
downloadAndHashMultiple(urls).then(hashes => {
console.log(hashes)
})