summaryrefslogtreecommitdiff
path: root/std/hash/_wasm/hash.ts
diff options
context:
space:
mode:
authorskdltmxn <supershop@naver.com>2020-06-17 06:12:50 +0900
committerGitHub <noreply@github.com>2020-06-16 17:12:50 -0400
commitb3c72d1e4554b5fd58cbf3ba2fbf56275446447b (patch)
tree613f42672a715b8fa9422a86af09abec66e4fcef /std/hash/_wasm/hash.ts
parentb8872cd303584b28c0d6250184e4a1205bf2ad9b (diff)
feat(std/hash): reimplement all hashes in WASM (#6292)
Diffstat (limited to 'std/hash/_wasm/hash.ts')
-rw-r--r--std/hash/_wasm/hash.ts76
1 files changed, 76 insertions, 0 deletions
diff --git a/std/hash/_wasm/hash.ts b/std/hash/_wasm/hash.ts
new file mode 100644
index 000000000..d04a4d4a0
--- /dev/null
+++ b/std/hash/_wasm/hash.ts
@@ -0,0 +1,76 @@
+// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
+
+import init, {
+ source,
+ create_hash as createHash,
+ update_hash as updateHash,
+ digest_hash as digestHash,
+ DenoHash,
+} from "./wasm.js";
+
+import * as hex from "../../encoding/hex.ts";
+import * as base64 from "../../encoding/base64.ts";
+import { Hasher, Message, OutputFormat } from "../hasher.ts";
+
+await init(source);
+
+const TYPE_ERROR_MSG = "hash: `data` is invalid type";
+
+export class Hash implements Hasher {
+ #hash: DenoHash;
+ #digested: boolean;
+
+ constructor(algorithm: string) {
+ this.#hash = createHash(algorithm);
+ this.#digested = false;
+ }
+
+ /**
+ * Update internal state
+ * @param data data to update
+ */
+ update(data: Message): this {
+ let msg: Uint8Array;
+
+ if (typeof data === "string") {
+ msg = new TextEncoder().encode(data as string);
+ } else if (typeof data === "object") {
+ if (data instanceof ArrayBuffer || ArrayBuffer.isView(data)) {
+ msg = new Uint8Array(data);
+ } else {
+ throw new Error(TYPE_ERROR_MSG);
+ }
+ } else {
+ throw new Error(TYPE_ERROR_MSG);
+ }
+
+ updateHash(this.#hash, msg);
+
+ return this;
+ }
+
+ /** Returns final hash */
+ digest(): ArrayBuffer {
+ if (this.#digested) throw new Error("hash: already digested");
+
+ this.#digested = true;
+ return digestHash(this.#hash);
+ }
+
+ /**
+ * Returns hash as a string of given format
+ * @param format format of output string (hex or base64). Default is hex
+ */
+ toString(format: OutputFormat = "hex"): string {
+ const finalized = new Uint8Array(this.digest());
+
+ switch (format) {
+ case "hex":
+ return hex.encodeToString(finalized);
+ case "base64":
+ return base64.encode(finalized);
+ default:
+ throw new Error("hash: invalid format");
+ }
+ }
+}