@vot.js/shared
Version:
shared for all @vot.js package
63 lines (62 loc) • 2.42 kB
JavaScript
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",
};