import { default as randomBytes } from "./_crypto/randomBytes.ts";import { createHash as stdCreateHash, Hasher, SupportedAlgorithm, supportedAlgorithms,} from "../hash/mod.ts";import { pbkdf2, pbkdf2Sync } from "./_crypto/pbkdf2.ts";import { Buffer } from "./buffer.ts";import { Transform } from "./stream.ts";import { TransformOptions } from "./_stream/transform.ts";import { encode as encodeToHex } from "../encoding/hex.ts";
export class Hash extends Transform { public hash: Hasher; constructor(algorithm: SupportedAlgorithm, _opts?: TransformOptions) { super({ transform(chunk: string, _encoding: string, callback: () => void): void { hash.update(chunk); callback(); }, flush(callback: () => void): void { this.push(hash.digest()); callback(); }, }); const hash = this.hash = stdCreateHash(algorithm); }
update(data: string | ArrayBuffer, _encoding?: string): this { if (typeof data === "string") { data = new TextEncoder().encode(data); this.hash.update(data); } else { this.hash.update(data); } return this; }
digest(encoding?: string): Buffer | string { const digest = this.hash.digest(); if (encoding === undefined) { return Buffer.from(digest); }
switch (encoding) { case "hex": { return new TextDecoder().decode(encodeToHex(new Uint8Array(digest))); } default: { throw new Error( `The output encoding for hash digest is not impelemented: ${encoding}`, ); } } }}
export function createHash( algorithm: SupportedAlgorithm, opts?: TransformOptions,) { return new Hash(algorithm, opts);}
export function getHashes(): SupportedAlgorithm[] { return supportedAlgorithms.slice();}
export default { Hash, createHash, getHashes, pbkdf2, pbkdf2Sync, randomBytes };export { pbkdf2, pbkdf2Sync, randomBytes };