evgene-kopylov_fsrs_plugin/scripts/encode-wasm.js

86 lines
2.8 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import fs from "fs";
import path from "path";
const wasmFilePath = path.resolve(
process.cwd(),
"wasm-lib/pkg/wasm_lib_bg.wasm",
);
const outputFilePath = path.resolve(
process.cwd(),
"wasm-lib/pkg/wasm_lib_base64.ts",
);
/**
* Разбивает длинную строку на чанки фиксированного размера
* @param {string} str Исходная строка
* @param {number} chunkSize Размер чанка (по умолчанию 4096)
* @returns {string[]} Массив чанков
*/
function chunkString(str, chunkSize = 4096) {
const chunks = [];
for (let i = 0; i < str.length; i += chunkSize) {
chunks.push(str.slice(i, i + chunkSize));
}
return chunks;
}
/**
* Генерирует TypeScript код с разбитой на чанки строкой
* @param {string} base64String Base64 строка
* @returns {string} TypeScript код
*/
function generateTsContent(base64String) {
const chunks = chunkString(base64String, 4096);
if (chunks.length === 1) {
// Если строка короткая, используем шаблонный литерал
return `export const WASM_BASE64 = "${base64String}";`;
}
// Для длинных строк используем конкатенацию чанков с шаблонными литералами
let tsContent = "export const WASM_BASE64 = ";
for (let i = 0; i < chunks.length; i++) {
const chunk = chunks[i];
if (i === 0) {
tsContent += `"${chunk}"`;
} else {
tsContent += `\n + "${chunk}"`;
}
}
tsContent += ";\n";
return tsContent;
}
try {
// Проверяем существование входного файла
if (!fs.existsSync(wasmFilePath)) {
console.error(`WASM файл не найден: ${wasmFilePath}`);
console.error("Сначала выполните сборку WASM: npm run build-wasm");
process.exit(1);
}
// Читаем WASM файл как бинарные данные
const wasmBuffer = fs.readFileSync(wasmFilePath);
// Кодируем в base64
const base64String = wasmBuffer.toString("base64");
// Генерируем содержимое TypeScript файла
const tsContent = generateTsContent(base64String);
// Убеждаемся, что директория существует
const outputDir = path.dirname(outputFilePath);
if (!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir, { recursive: true });
}
// Записываем файл
fs.writeFileSync(outputFilePath, tsContent);
console.log("WASM encoded ✅");
} catch (error) {
console.error("Ошибка при кодировании WASM:", error.message);
process.exit(1);
}