File size: 746 Bytes
21dd449
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import { Readable } from "node:stream";
import type { ReadableStream } from "node:stream/web";
import { createHash } from "node:crypto";

export async function* sha256Node(
	buffer: ArrayBuffer | Blob,
	opts?: {
		abortSignal?: AbortSignal;
	}
): AsyncGenerator<number, string> {
	const sha256Stream = createHash("sha256");
	const size = buffer instanceof Blob ? buffer.size : buffer.byteLength;
	let done = 0;
	const readable =
		buffer instanceof Blob ? Readable.fromWeb(buffer.stream() as ReadableStream) : Readable.from(Buffer.from(buffer));

	for await (const buffer of readable) {
		sha256Stream.update(buffer);
		done += buffer.length;
		yield done / size;

		opts?.abortSignal?.throwIfAborted();
	}

	return sha256Stream.digest("hex");
}