From 1877b1aa6e5288818eb58d9335744db15baa6ba2 Mon Sep 17 00:00:00 2001 From: overflowerror Date: Fri, 16 Aug 2024 20:58:03 +0200 Subject: [PATCH] switch to typescript --- package.json | 4 ++-- src/{content.js => content.ts} | 2 +- src/hash.js | 23 ----------------------- src/hash.ts | 32 ++++++++++++++++++++++++++++++++ src/{main.js => main.ts} | 6 +++--- tsconfig.json | 5 +++++ 6 files changed, 43 insertions(+), 29 deletions(-) rename src/{content.js => content.ts} (87%) delete mode 100644 src/hash.js create mode 100644 src/hash.ts rename src/{main.js => main.ts} (87%) create mode 100644 tsconfig.json diff --git a/package.json b/package.json index c8b31db..69cc385 100644 --- a/package.json +++ b/package.json @@ -2,9 +2,9 @@ "name": "axowall", "version": "0.0.1", "description": "", - "main": "src/main.js", + "main": "src/main.ts", "scripts": { - "build": "esbuild src/main.js --bundle --outfile=public/bundle.js", + "build": "esbuild src/main.ts --bundle --outfile=public/bundle.js", "test": "echo \"Error: no test specified\" && exit 1" }, "repository": { diff --git a/src/content.js b/src/content.ts similarity index 87% rename from src/content.js rename to src/content.ts index 0ad3c99..3c333f2 100644 --- a/src/content.js +++ b/src/content.ts @@ -6,7 +6,7 @@ const suffixCharset = [ ].flatMap(set => set.split("")); const suffixCharsetBits = 6; -export function makeSuffix(index) { +export function makeSuffix(index: number): string { let result = ""; while (index > 0) { diff --git a/src/hash.js b/src/hash.js deleted file mode 100644 index bd7f2fb..0000000 --- a/src/hash.js +++ /dev/null @@ -1,23 +0,0 @@ -const hexCharset = "0123456789abcdef".split(""); - -export const sha256 = "SHA-256"; - -Uint8Array.prototype.toHex = function() { - return [...this].map(c => hexCharset[c >> 4] + hexCharset[c & 15]).join(""); -}; - -Uint8Array.prototype.hasPrefix = function(array, bits) { - for(let i = 0; i < array.length && i * 8 < bits; i++) { - const bitsForByte = Math.min(8, bits - i * 8); - const bitMask = ((1 << bitsForByte) - 1) << (8 - bitsForByte); - - if ((this[i] & bitMask) != (array[i] & bitMask)) { - return false; - } - } - return true; -}; - -export async function digest(algo, input) { - return new Uint8Array(await crypto.subtle.digest(algo, new TextEncoder().encode(input))); -} \ No newline at end of file diff --git a/src/hash.ts b/src/hash.ts new file mode 100644 index 0000000..94d62ed --- /dev/null +++ b/src/hash.ts @@ -0,0 +1,32 @@ +const hexCharset = "0123456789abcdef".split(""); + +export const sha256: AlgorithmIdentifier = "SHA-256"; + +declare global { + interface Uint8Array { + toHex(): string; + hasPrefix(prefix: Uint8Array, bits: number): boolean; + } +} + +Uint8Array.prototype.toHex = function(): string { + return [...this].map(c => hexCharset[c >> 4] + hexCharset[c & 15]).join(""); +}; + +Uint8Array.prototype.hasPrefix = function(prefix: Uint8Array, bits: number): boolean { + for(let i = 0; i < prefix.length && i * 8 < bits; i++) { + const bitsForByte = Math.min(8, bits - i * 8); + const bitMask = ((1 << bitsForByte) - 1) << (8 - bitsForByte); + const currentBits = this[i] & bitMask; + const prefixBits = prefix[i] & bitMask; + + if (currentBits != prefixBits) { + return false; + } + } + return true; +}; + +export async function digest(algo: AlgorithmIdentifier, input: string): Promise { + return new Uint8Array(await crypto.subtle.digest(algo, new TextEncoder().encode(input))); +} \ No newline at end of file diff --git a/src/main.js b/src/main.ts similarity index 87% rename from src/main.js rename to src/main.ts index c3364a7..dbddc43 100644 --- a/src/main.js +++ b/src/main.ts @@ -1,12 +1,12 @@ import {makeSuffix} from "./content"; import {digest, sha256} from "./hash"; -async function findHashWithPrefix(hashPrefixBits, inputPrefix) { - const hashPrefix = new Uint8Array(Array(Math.ceil(hashPrefixBits / 8)).map(c => 0)); +async function findHashWithPrefix(hashPrefixBits: number, inputPrefix: string): Promise { + const hashPrefix = new Uint8Array(Array(Math.ceil(hashPrefixBits / 8)).map(_ => 0)); let iteration = 0; do { - var message = inputPrefix + makeSuffix(iteration++) + var message = inputPrefix + makeSuffix(iteration++); var hash = await digest(sha256, message); } while (!hash.hasPrefix(hashPrefix, hashPrefixBits)); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..393b426 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,5 @@ +{ + "compilerOptions": { + "target": "es2019" + } +} \ No newline at end of file