summaryrefslogtreecommitdiff
path: root/desktop/node_modules/@electron/asar/lib/integrity.js
diff options
context:
space:
mode:
Diffstat (limited to 'desktop/node_modules/@electron/asar/lib/integrity.js')
-rw-r--r--desktop/node_modules/@electron/asar/lib/integrity.js62
1 files changed, 62 insertions, 0 deletions
diff --git a/desktop/node_modules/@electron/asar/lib/integrity.js b/desktop/node_modules/@electron/asar/lib/integrity.js
new file mode 100644
index 0000000..6fabee4
--- /dev/null
+++ b/desktop/node_modules/@electron/asar/lib/integrity.js
@@ -0,0 +1,62 @@
+const crypto = require('crypto')
+const fs = require('fs')
+const stream = require('stream')
+const { promisify } = require('util')
+
+const ALGORITHM = 'SHA256'
+// 4MB default block size
+const BLOCK_SIZE = 4 * 1024 * 1024
+
+const pipeline = promisify(stream.pipeline)
+
+function hashBlock (block) {
+ return crypto.createHash(ALGORITHM).update(block).digest('hex')
+}
+
+async function getFileIntegrity (path) {
+ const fileHash = crypto.createHash(ALGORITHM)
+
+ const blocks = []
+ let currentBlockSize = 0
+ let currentBlock = []
+
+ await pipeline(
+ fs.createReadStream(path),
+ new stream.PassThrough({
+ decodeStrings: false,
+ transform (_chunk, encoding, callback) {
+ fileHash.update(_chunk)
+
+ function handleChunk (chunk) {
+ const diffToSlice = Math.min(BLOCK_SIZE - currentBlockSize, chunk.byteLength)
+ currentBlockSize += diffToSlice
+ currentBlock.push(chunk.slice(0, diffToSlice))
+ if (currentBlockSize === BLOCK_SIZE) {
+ blocks.push(hashBlock(Buffer.concat(currentBlock)))
+ currentBlock = []
+ currentBlockSize = 0
+ }
+ if (diffToSlice < chunk.byteLength) {
+ handleChunk(chunk.slice(diffToSlice))
+ }
+ }
+ handleChunk(_chunk)
+ callback()
+ },
+ flush (callback) {
+ blocks.push(hashBlock(Buffer.concat(currentBlock)))
+ currentBlock = []
+ callback()
+ }
+ })
+ )
+
+ return {
+ algorithm: ALGORITHM,
+ hash: fileHash.digest('hex'),
+ blockSize: BLOCK_SIZE,
+ blocks: blocks
+ }
+}
+
+module.exports = getFileIntegrity