56 lines
1.5 KiB
TypeScript
56 lines
1.5 KiB
TypeScript
|
import { base58btc } from "multiformats/bases/base58";
|
||
|
import { bytesToHex, hexToBytes, utf8ToBytes } from "@noble/hashes/utils";
|
||
|
import { base32 } from "multiformats/bases/base32";
|
||
|
import { base64, base64url } from "multiformats/bases/base64";
|
||
|
|
||
|
export default abstract class Multibase {
|
||
|
abstract toBytes(): Uint8Array;
|
||
|
|
||
|
static decodeString(data: string): Uint8Array {
|
||
|
let bytes: Uint8Array;
|
||
|
if (data[0] === "z") {
|
||
|
bytes = base58btc.decode(data);
|
||
|
} else if (data[0] === "f") {
|
||
|
bytes = Uint8Array.from(hexToBytes(data.substring(1)));
|
||
|
} else if (data[0] === "b") {
|
||
|
let str = data.substring(1).toUpperCase();
|
||
|
while (str.length % 4 !== 0) {
|
||
|
str += "=";
|
||
|
}
|
||
|
bytes = base32.decode(str);
|
||
|
} else if (data[0] === "u") {
|
||
|
let str = data.substring(1);
|
||
|
while (str.length % 4 !== 0) {
|
||
|
str += "=";
|
||
|
}
|
||
|
bytes = base64url.decode(str);
|
||
|
} else if (data[0] === ":") {
|
||
|
bytes = utf8ToBytes(data);
|
||
|
} else {
|
||
|
throw new Error(`Multibase encoding ${data[0]} not supported`);
|
||
|
}
|
||
|
|
||
|
return bytes;
|
||
|
}
|
||
|
|
||
|
toHex(): string {
|
||
|
return `f${bytesToHex(this.toBytes())}`;
|
||
|
}
|
||
|
|
||
|
toBase32(): string {
|
||
|
return `b${base32.encode(this.toBytes()).replace(/=/g, "").toLowerCase()}`;
|
||
|
}
|
||
|
|
||
|
toBase64Url(): string {
|
||
|
return `u${base64.encode(this.toBytes())}`;
|
||
|
}
|
||
|
|
||
|
toBase58(): string {
|
||
|
return `z${base58btc.encode(this.toBytes())}`;
|
||
|
}
|
||
|
|
||
|
toString(): string {
|
||
|
return this.toBase58();
|
||
|
}
|
||
|
}
|