|
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"); |
|
} |
|
|