この記事のコードを書いたときに いくつかの機能が Node.js で動かなかったので調べて見たメモ

ハッシュ値作成

SHA256 や SHA512 などのハッシュ値作成
ブラウザ JavaScript なら
async function sha512(str){
const u8a = new TextEncoder().encode(str)
return hex(await crypto.subtle.digest("SHA-512", u8a))
}

function hex(buffer) {
let result = ""
const view = new DataView(buffer);
for (let i = 0; i < view.byteLength; i += 4) {
result += view.getUint32(i).toString(16).padStart(6, "0")
}
return result
}

という感じです

文字列を Uint8Array に変換して crypto.subtle.digest でハッシュ値を計算します
結果は ArrayBuffer なので 16 進数化します


Node.js だと crypto.subtle.digest 関数はないので crypto.createHash を使います
function sha512(str){
return crypto.createHash("SHA512").update(str).digest("hex")
}

update メソッドに文字列を入れて digest メソッドで hex を指定すると 16 進数の文字列で結果が返ってきます

TextEncoder

ブラウザで文字列を Uin8Array 化する TextEncoder も Node.js にはありません
でもその変換自体は簡単です

function encodeText(str){
return new Uint8Array(new Buffer(str))
}

Buffer に入れるとバイト列になるので Uint8Array コンストラクタで Uint8Array 型にするだけ

atob/btoa

この 2 関数も用意されていません
Node.js ではこっちも Buffer を使います

function atob(str){
return new Buffer(str, "base64").toString("binary");
}

function btoa(str){
return new Buffer(str, "binary").toString("base64");
}


JavaScript の仕様でなく WebAPI の仕様である機能は Node.js になくて不便ですね
そのままコードが使えるように polyfill セットがあるといいけどあるのかな?
ひとつひとつは見つけましたがこういうのはセットであってほしいものです