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