UNPKG

@vot.js/shared

Version:

shared for all @vot.js package

63 lines (62 loc) 2.42 kB
import config from "./data/config.js"; import Logger from "./utils/logger.js"; const { componentVersion } = config; async function getCrypto() { if (typeof window !== "undefined" && window.crypto) { return window.crypto; } return (await import("node:crypto")); } const utf8Encoder = new TextEncoder(); async function signHMAC(hashName, hmac, data) { const crypto = await getCrypto(); const key = await crypto.subtle.importKey("raw", utf8Encoder.encode(hmac), { name: "HMAC", hash: { name: hashName } }, false, ["sign", "verify"]); return await crypto.subtle.sign("HMAC", key, data); } export async function getSignature(body) { const signature = await signHMAC("SHA-256", config.hmac, body); return new Uint8Array(signature).reduce((str, byte) => str + byte.toString(16).padStart(2, "0"), ""); } export async function getSecYaHeaders(secType, session, body, path) { const { secretKey, uuid } = session; const token = `${uuid}:${path}:${componentVersion}`; const tokenBody = utf8Encoder.encode(token); const tokenSign = await getSignature(tokenBody); if (secType === "Ya-Summary") { return { [`X-${secType}-Sk`]: secretKey, [`X-${secType}-Token`]: `${tokenSign}:${token}`, }; } const sign = await getSignature(body); return { [`${secType}-Signature`]: sign, [`Sec-${secType}-Sk`]: secretKey, [`Sec-${secType}-Token`]: `${tokenSign}:${token}`, }; } export function getUUID() { const hexDigits = "0123456789ABCDEF"; let uuid = ""; for (let i = 0; i < 32; i++) { const randomDigit = Math.floor(Math.random() * 16); uuid += hexDigits[randomDigit]; } return uuid; } export async function getHmacSha1(hmacKey, salt) { try { const hmacSalt = utf8Encoder.encode(salt); const signature = await signHMAC("SHA-1", hmacKey, hmacSalt); return btoa(String.fromCharCode(...new Uint8Array(signature))); } catch (err) { Logger.error(err); return false; } } export const browserSecHeaders = { "sec-ch-ua": `"Chromium";v="134", "YaBrowser";v="${componentVersion.slice(0, 5)}", "Not?A_Brand";v="24", "Yowser";v="2.5"`, "sec-ch-ua-full-version-list": `"Chromium";v="134.0.6998.543", "YaBrowser";v="${componentVersion}", "Not?A_Brand";v="24.0.0.0", "Yowser";v="2.5"`, "Sec-Fetch-Mode": "no-cors", };