import crypto from "crypto"; import { expose } from "threads"; const ALGORITHM = "aes-256-gcm"; function encrypt(str, key) { // Based on https://gist.github.com/rjz/15baffeab434b8125ca4d783f4116d81 const iv = crypto.randomBytes(16); const cipher = crypto.createCipheriv(ALGORITHM, key, iv); let encrypted = cipher.update(str, "utf8", "base64"); encrypted += cipher.final("base64"); return `${iv.toString("base64")}.${cipher.getAuthTag().toString("base64")}.${encrypted}`; } function decrypt(encrypted, key) { // Based on https://gist.github.com/rjz/15baffeab434b8125ca4d783f4116d81 const [iv, authTag, encryptedStr] = encrypted.split("."); const decipher = crypto.createDecipheriv(ALGORITHM, key, Buffer.from(iv, "base64")); decipher.setAuthTag(Buffer.from(authTag, "base64")); let decrypted = decipher.update(encryptedStr, "base64", "utf8"); decrypted += decipher.final("utf8"); return decrypted; } const toExpose = { encrypt, decrypt }; expose(toExpose); export type CryptFns = typeof toExpose;