Fix Docker build: vendor the cyberhack wasm bundle instead of a cross-repo file: path

CI build failed with ENOENT on /Cyberhack/pkg: package.json pointed the
"cyberhack" dependency at "file:../../Cyberhack/pkg", a path outside this
repo's own directory tree entirely. That only ever resolved on a
developer machine that happened to have a sibling checkout of the
Cyberhack repo — Docker's build context is confined to this repo, and CI
never checks out Cyberhack in the first place, so pnpm install had
nothing to link against.

There's no npm registry publish set up for that package, so vendor the
already-built wasm-pack output directly into frontend/vendor/cyberhack
(committed) and point the dependency at "file:./vendor/cyberhack" instead
— a path inside the build context. Dockerfile now copies frontend/vendor
before pnpm install so the file: resolution actually has something to
link to. Verified with a `docker build --no-cache` end-to-end.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-04 15:45:05 +07:00
parent 52531dd41a
commit 0927053f4a
11 changed files with 2460 additions and 6 deletions
+246
View File
@@ -0,0 +1,246 @@
"use client";
import React, { useEffect, useRef, useState } from "react";
export interface CyberhackTheme {
primary?: string;
secondary?: string;
background?: string;
foreground?: string;
}
export interface CyberhackResult {
session_id?: string | null;
completed_targets: number[];
buffer: string[];
/** Последовательность реально принятых кликов (row, col) в порядке совершения. */
path: [number, number][];
total_coins: number;
}
export interface CyberhackProps {
/** URL для редиректа после игры, получит `?coins=<total_coins>`. */
redirectUrl: string;
/** Базовая награда; итоговая награда за демона = baseValue * (уровень демона). */
baseValue: number;
/** Лимит в секундах. Таймер стартует по первому клику, а не при монтировании. */
timeLimit: number;
locale?: "ru" | "en";
theme?: CyberhackTheme;
/**
* Server-authoritative режим: доска и цели, присланные бэкендом. Если
* заданы оба поля, игра не генерирует доску сама — сервер уже знает эту
* доску и сверит `onComplete`-результат по своей копии, не доверяя
* присланному `total_coins`. `sessionId` уходит обратно в `onComplete`.
*/
matrix?: string[][];
targets?: string[][];
sessionId?: string;
/** Вызывается один раз по окончании партии (успех или провал по таймеру). */
onComplete?: (result: CyberhackResult) => void;
}
/**
* React-обертка над Breach Protocol на Rust/Yew/WASM.
* Сама не рендерит игру — динамически подгружает wasm-модуль и монтирует
* его в контейнер `<div id={containerId}>` ниже, а результат партии
* получает обратно через window.postMessage (см. handleMessage).
*/
export const Cyberhack: React.FC<CyberhackProps> = ({
redirectUrl,
baseValue,
timeLimit,
locale = "ru",
theme,
matrix,
targets,
sessionId,
onComplete,
}) => {
// 🔥 Упростили ID для надежности монтирования
const containerId = useRef("cyberhack-core-container");
const canvasRef = useRef<HTMLCanvasElement>(null);
const initialized = useRef(false);
const [loadError, setLoadError] = useState<string | null>(null);
// Кибер-фон (hex-дождь) рисуется здесь, в React, отдельным canvas'ом —
// до того, как загрузится и смонтируется WASM-игра (которая рисует свой
// собственный такой же фон внутри контейнера). Так пользователь не видит
// пустой экран во время загрузки wasm-бандла.
useEffect(() => {
const canvas = canvasRef.current;
if (!canvas) return;
const ctx = canvas.getContext("2d");
if (!ctx) return;
let animationFrameId: number;
const fontSize = 16;
let columns = 0;
let drops: number[] = [];
const chars = "0123456789ABCDEF".split("");
const resize = () => {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
columns = Math.floor(canvas.width / fontSize);
drops = [];
for (let x = 0; x < columns; x++) {
drops[x] = Math.random() * canvas.height;
}
};
window.addEventListener("resize", resize);
resize();
const draw = () => {
ctx.globalAlpha = 0.15;
ctx.fillStyle = theme?.background || "#05020a";
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.font = `${fontSize}px monospace`;
for (let i = 0; i < drops.length; i++) {
const text = chars[Math.floor(Math.random() * chars.length)];
const x = i * fontSize;
const y = drops[i] * fontSize;
if (Math.random() > 0.98) {
ctx.globalAlpha = 0.9;
ctx.fillStyle = theme?.primary || "#8b3dff";
} else {
ctx.globalAlpha = 0.4;
ctx.fillStyle = theme?.secondary || "#00f0ff";
}
ctx.fillText(text, x, y);
if (y > canvas.height && Math.random() > 0.975) {
drops[i] = 0;
}
drops[i]++;
}
animationFrameId = requestAnimationFrame(draw);
};
draw();
return () => {
window.removeEventListener("resize", resize);
cancelAnimationFrame(animationFrameId);
};
}, [theme]);
// Инициализация WASM Yew.
// `initialized` — обычный ref, а не state: он должен пережить повторные
// срабатывания этого эффекта (например при смене props в зависимостях
// ниже) и не провоцировать лишний рендер, иначе initCyberHack вызвался бы
// повторно и Yew попытался бы смонтировать игру поверх уже смонтированной.
useEffect(() => {
let isActive = true;
if (!initialized.current) {
Promise.all([
//@ts-ignore
import("cyberhack/wasm"),
])
.then(([wasmModule]) => {
if (!isActive) return;
const init = wasmModule.default;
const initCyberHack = wasmModule.initCyberHack;
init().then(() => {
if (!isActive) return;
// 🔥 ИСПРАВЛЕНО: Ждем пока браузер 100% отрендерит DOM
requestAnimationFrame(() => {
const el = document.getElementById(containerId.current);
// Защита от паники Rust: если элемента нет, прерываемся
if (!el) {
console.error(
"[Cyberhack] Контейнер для монтирования WASM не найден в DOM.",
);
return;
}
const config = {
redirect_url: redirectUrl,
base_value: baseValue,
time_limit: timeLimit,
locale,
theme,
matrix,
targets,
session_id: sessionId,
};
try {
initCyberHack(containerId.current, JSON.stringify(config));
initialized.current = true;
} catch (e) {
console.error("WASM Init Error:", e);
setLoadError("Ошибка при запуске ядра.");
}
});
});
})
.catch((e) => {
console.warn("WASM-модуль еще не собран. Ожидание сборки...", e);
setLoadError(
"Библиотека WASM не найдена. Убедитесь, что выполнен скрипт сборки.",
);
});
}
// Rust-сторона не имеет прямой ссылки на React-callback onComplete,
// поэтому результат партии передается через window.postMessage
// (см. `end_game` в src/lib.rs) и здесь разбирается обратно в объект.
// try/catch молча проглатывает чужие message-события (от расширений
// браузера, HMR и т.п.), которые не являются нашим JSON-результатом.
const handleMessage = (event: MessageEvent) => {
try {
const data = JSON.parse(event.data) as CyberhackResult;
if (data.total_coins !== undefined && onComplete) {
onComplete(data);
}
} catch (e) {}
};
window.addEventListener("message", handleMessage);
return () => {
isActive = false;
window.removeEventListener("message", handleMessage);
};
}, [
redirectUrl,
baseValue,
timeLimit,
locale,
theme,
matrix,
targets,
sessionId,
onComplete,
]);
return (
<div className="dark relative w-full h-screen overflow-hidden bg-[#05020a]">
{loadError && (
<div className="absolute top-0 left-0 w-full bg-red-900 text-white text-xs p-2 text-center z-[100]">
{loadError}
</div>
)}
{/* Теперь просто контейнер, WASM сам нарисует и фон, и игру */}
<div
id={containerId.current}
className="relative z-10 w-full h-full flex items-center justify-center overflow-auto"
></div>
{/* Оставляем только CRT оверлей, если ты не перенес его в Rust-верстку */}
<div className="crt-overlay pointer-events-none absolute inset-0 z-50"></div>
</div>
);
};
File diff suppressed because it is too large Load Diff
+63
View File
@@ -0,0 +1,63 @@
/* tslint:disable */
/* eslint-disable */
/**
* Точка входа, которую дергает JS-обертка (`Cyberhack.tsx`) после
* инициализации wasm-модуля. Монтирует `CyberHackGame` в DOM-элемент
* с указанным `element_id`, распарсив конфиг из JSON-строки.
*/
export function initCyberHack(element_id: string, config_json: string): void;
/**
* `#[wasm_bindgen(start)]` запускает эту функцию автоматически сразу после
* загрузки wasm-модуля — то есть при каждом `init()` из JS, а не только
* в `trunk serve`. `Renderer::with_props` без `with_root` монтирует
* компонент в `document.body`. Это используется для локальной отладки
* через `trunk serve` (см. `npm run dev`), но означает, что у любого
* потребителя npm-пакета эта debug-игра тоже отрендерится в body в
* дополнение к игре, смонтированной через `initCyberHack`.
*/
export function run_app(): void;
export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module;
export interface InitOutput {
readonly memory: WebAssembly.Memory;
readonly initCyberHack: (a: number, b: number, c: number, d: number) => [number, number];
readonly run_app: () => void;
readonly wasm_bindgen__convert__closures_____invoke__h5564e0922a8ef97b: (a: number, b: number, c: any) => [number, number];
readonly wasm_bindgen__convert__closures________invoke__h4320859e087f83c8: (a: number, b: number, c: any) => void;
readonly wasm_bindgen__convert__closures_____invoke__h48aa713ae3e44284: (a: number, b: number) => void;
readonly __wbindgen_malloc: (a: number, b: number) => number;
readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
readonly __wbindgen_exn_store: (a: number) => void;
readonly __externref_table_alloc: () => number;
readonly __wbindgen_externrefs: WebAssembly.Table;
readonly __externref_drop_slice: (a: number, b: number) => void;
readonly __wbindgen_free: (a: number, b: number, c: number) => void;
readonly __wbindgen_destroy_closure: (a: number, b: number) => void;
readonly __externref_table_dealloc: (a: number) => void;
readonly __wbindgen_start: () => void;
}
export type SyncInitInput = BufferSource | WebAssembly.Module;
/**
* Instantiates the given `module`, which can either be bytes or
* a precompiled `WebAssembly.Module`.
*
* @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated.
*
* @returns {InitOutput}
*/
export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput;
/**
* If `module_or_path` is {RequestInfo} or {URL}, makes a request and
* for everything else, calls `WebAssembly.instantiate` directly.
*
* @param {{ module_or_path: InitInput | Promise<InitInput> }} module_or_path - Passing `InitInput` directly is deprecated.
*
* @returns {Promise<InitOutput>}
*/
export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise<InitInput> } | InitInput | Promise<InitInput>): Promise<InitOutput>;
+874
View File
@@ -0,0 +1,874 @@
/* @ts-self-types="./cyberhack.d.ts" */
/**
* Точка входа, которую дергает JS-обертка (`Cyberhack.tsx`) после
* инициализации wasm-модуля. Монтирует `CyberHackGame` в DOM-элемент
* с указанным `element_id`, распарсив конфиг из JSON-строки.
* @param {string} element_id
* @param {string} config_json
*/
export function initCyberHack(element_id, config_json) {
const ptr0 = passStringToWasm0(element_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len0 = WASM_VECTOR_LEN;
const ptr1 = passStringToWasm0(config_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len1 = WASM_VECTOR_LEN;
const ret = wasm.initCyberHack(ptr0, len0, ptr1, len1);
if (ret[1]) {
throw takeFromExternrefTable0(ret[0]);
}
}
/**
* `#[wasm_bindgen(start)]` запускает эту функцию автоматически сразу после
* загрузки wasm-модуля — то есть при каждом `init()` из JS, а не только
* в `trunk serve`. `Renderer::with_props` без `with_root` монтирует
* компонент в `document.body`. Это используется для локальной отладки
* через `trunk serve` (см. `npm run dev`), но означает, что у любого
* потребителя npm-пакета эта debug-игра тоже отрендерится в body в
* дополнение к игре, смонтированной через `initCyberHack`.
*/
export function run_app() {
wasm.run_app();
}
function __wbg_get_imports() {
const import0 = {
__proto__: null,
__wbg___wbindgen_debug_string_ab4b34d23d6778bd: function(arg0, arg1) {
const ret = debugString(arg1);
const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len1 = WASM_VECTOR_LEN;
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
},
__wbg___wbindgen_is_function_3baa9db1a987f47d: function(arg0) {
const ret = typeof(arg0) === 'function';
return ret;
},
__wbg___wbindgen_is_object_63322ec0cd6ea4ef: function(arg0) {
const val = arg0;
const ret = typeof(val) === 'object' && val !== null;
return ret;
},
__wbg___wbindgen_is_string_6df3bf7ef1164ed3: function(arg0) {
const ret = typeof(arg0) === 'string';
return ret;
},
__wbg___wbindgen_is_undefined_29a43b4d42920abd: function(arg0) {
const ret = arg0 === undefined;
return ret;
},
__wbg___wbindgen_number_get_c7f42aed0525c451: function(arg0, arg1) {
const obj = arg1;
const ret = typeof(obj) === 'number' ? obj : undefined;
getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true);
getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true);
},
__wbg___wbindgen_throw_6b64449b9b9ed33c: function(arg0, arg1) {
throw new Error(getStringFromWasm0(arg0, arg1));
},
__wbg__wbg_cb_unref_b46c9b5a9f08ec37: function(arg0) {
arg0._wbg_cb_unref();
},
__wbg_addEventListener_79f868f51ae88579: function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {
arg0.addEventListener(getStringFromWasm0(arg1, arg2), arg3, arg4);
}, arguments); },
__wbg_assign_d4fed0f8abb71719: function() { return handleError(function (arg0, arg1, arg2) {
arg0.assign(getStringFromWasm0(arg1, arg2));
}, arguments); },
__wbg_body_c7b35a55457167ba: function(arg0) {
const ret = arg0.body;
return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
},
__wbg_bubbles_4d2e6b4ada3365b5: function(arg0) {
const ret = arg0.bubbles;
return ret;
},
__wbg_cache_key_21c521bc3dd66e9b: function(arg0) {
const ret = arg0.__yew_subtree_cache_key;
return isLikeNone(ret) ? 0x100000001 : (ret) >>> 0;
},
__wbg_call_a24592a6f349a97e: function() { return handleError(function (arg0, arg1, arg2) {
const ret = arg0.call(arg1, arg2);
return ret;
}, arguments); },
__wbg_cancelBubble_56aa5b315d711482: function(arg0) {
const ret = arg0.cancelBubble;
return ret;
},
__wbg_childNodes_23aa77ec529bb827: function(arg0) {
const ret = arg0.childNodes;
return ret;
},
__wbg_clearInterval_16e8cbbce92291d0: function(arg0) {
const ret = clearInterval(arg0);
return ret;
},
__wbg_clearTimeout_113b1cde814ec762: function(arg0) {
const ret = clearTimeout(arg0);
return ret;
},
__wbg_cloneNode_eb01fe238729dac4: function() { return handleError(function (arg0) {
const ret = arg0.cloneNode();
return ret;
}, arguments); },
__wbg_composedPath_e2b9e0f5161335eb: function(arg0) {
const ret = arg0.composedPath();
return ret;
},
__wbg_createElementNS_e0e4bbb6e664f948: function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {
const ret = arg0.createElementNS(arg1 === 0 ? undefined : getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4));
return ret;
}, arguments); },
__wbg_createElement_bbd4c90086fe6f7b: function() { return handleError(function (arg0, arg1, arg2) {
const ret = arg0.createElement(getStringFromWasm0(arg1, arg2));
return ret;
}, arguments); },
__wbg_createTextNode_7949043038fd9f7b: function(arg0, arg1, arg2) {
const ret = arg0.createTextNode(getStringFromWasm0(arg1, arg2));
return ret;
},
__wbg_crypto_38df2bab126b63dc: function(arg0) {
const ret = arg0.crypto;
return ret;
},
__wbg_document_7a41071f2f439323: function(arg0) {
const ret = arg0.document;
return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
},
__wbg_error_4c20fd6d19d38f03: function(arg0, arg1) {
var v0 = getArrayJsValueFromWasm0(arg0, arg1).slice();
wasm.__wbindgen_free(arg0, arg1 * 4, 4);
console.error(...v0);
},
__wbg_error_a6fa202b58aa1cd3: function(arg0, arg1) {
let deferred0_0;
let deferred0_1;
try {
deferred0_0 = arg0;
deferred0_1 = arg1;
console.error(getStringFromWasm0(arg0, arg1));
} finally {
wasm.__wbindgen_free(deferred0_0, deferred0_1, 1);
}
},
__wbg_fillRect_992c5a4646ea7a7f: function(arg0, arg1, arg2, arg3, arg4) {
arg0.fillRect(arg1, arg2, arg3, arg4);
},
__wbg_fillText_dabb33ea287042e2: function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {
arg0.fillText(getStringFromWasm0(arg1, arg2), arg3, arg4);
}, arguments); },
__wbg_from_0dbf29f09e7fb200: function(arg0) {
const ret = Array.from(arg0);
return ret;
},
__wbg_getContext_fc146f8ec021d074: function() { return handleError(function (arg0, arg1, arg2) {
const ret = arg0.getContext(getStringFromWasm0(arg1, arg2));
return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
}, arguments); },
__wbg_getElementById_0b5a508c91194690: function(arg0, arg1, arg2) {
const ret = arg0.getElementById(getStringFromWasm0(arg1, arg2));
return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
},
__wbg_getRandomValues_c44a50d8cfdaebeb: function() { return handleError(function (arg0, arg1) {
arg0.getRandomValues(arg1);
}, arguments); },
__wbg_get_8360291721e2339f: function(arg0, arg1) {
const ret = arg0[arg1 >>> 0];
return ret;
},
__wbg_host_207aa9237088c9e9: function(arg0) {
const ret = arg0.host;
return ret;
},
__wbg_innerHeight_72e7bb88c4b9ede8: function() { return handleError(function (arg0) {
const ret = arg0.innerHeight;
return ret;
}, arguments); },
__wbg_innerWidth_c7446907ab672e41: function() { return handleError(function (arg0) {
const ret = arg0.innerWidth;
return ret;
}, arguments); },
__wbg_insertBefore_38c7d835a2dcac23: function() { return handleError(function (arg0, arg1, arg2) {
const ret = arg0.insertBefore(arg1, arg2);
return ret;
}, arguments); },
__wbg_instanceof_CanvasRenderingContext2d_24a3fe06e62b98d7: function(arg0) {
let result;
try {
result = arg0 instanceof CanvasRenderingContext2D;
} catch (_) {
result = false;
}
const ret = result;
return ret;
},
__wbg_instanceof_Element_56c8d987654f359e: function(arg0) {
let result;
try {
result = arg0 instanceof Element;
} catch (_) {
result = false;
}
const ret = result;
return ret;
},
__wbg_instanceof_ShadowRoot_d26d95cd2363a2c1: function(arg0) {
let result;
try {
result = arg0 instanceof ShadowRoot;
} catch (_) {
result = false;
}
const ret = result;
return ret;
},
__wbg_instanceof_Window_cc64c86c8ef9e02b: function(arg0) {
let result;
try {
result = arg0 instanceof Window;
} catch (_) {
result = false;
}
const ret = result;
return ret;
},
__wbg_is_8f7ba86b7f249abd: function(arg0, arg1) {
const ret = Object.is(arg0, arg1);
return ret;
},
__wbg_lastChild_1bc42f7ffd3e8f98: function(arg0) {
const ret = arg0.lastChild;
return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
},
__wbg_length_3d4ecd04bd8d22f1: function(arg0) {
const ret = arg0.length;
return ret;
},
__wbg_length_9f1775224cf1d815: function(arg0) {
const ret = arg0.length;
return ret;
},
__wbg_listener_id_51707c1ea7d7f75c: function(arg0) {
const ret = arg0.__yew_listener_id;
return isLikeNone(ret) ? 0x100000001 : (ret) >>> 0;
},
__wbg_location_73c89ca5bb53ddf3: function(arg0) {
const ret = arg0.location;
return ret;
},
__wbg_msCrypto_bd5a034af96bcba6: function(arg0) {
const ret = arg0.msCrypto;
return ret;
},
__wbg_namespaceURI_e11067170c0916b5: function(arg0, arg1) {
const ret = arg1.namespaceURI;
var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
var len1 = WASM_VECTOR_LEN;
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
},
__wbg_new_227d7c05414eb861: function() {
const ret = new Error();
return ret;
},
__wbg_new_aa8d0fa9762c29bd: function() {
const ret = new Object();
return ret;
},
__wbg_new_with_length_8c854e41ea4dae9b: function(arg0) {
const ret = new Uint8Array(arg0 >>> 0);
return ret;
},
__wbg_nextSibling_58f635df24be0787: function(arg0) {
const ret = arg0.nextSibling;
return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
},
__wbg_node_84ea875411254db1: function(arg0) {
const ret = arg0.node;
return ret;
},
__wbg_outerHTML_20c40f2d855909f9: function(arg0, arg1) {
const ret = arg1.outerHTML;
const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len1 = WASM_VECTOR_LEN;
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
},
__wbg_parentElement_d1271cca94202d1f: function(arg0) {
const ret = arg0.parentElement;
return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
},
__wbg_parentNode_e94744054a57a837: function(arg0) {
const ret = arg0.parentNode;
return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
},
__wbg_postMessage_ff19bfe36e2cf8fd: function() { return handleError(function (arg0, arg1, arg2, arg3) {
arg0.postMessage(arg1, getStringFromWasm0(arg2, arg3));
}, arguments); },
__wbg_process_44c7a14e11e9f69e: function(arg0) {
const ret = arg0.process;
return ret;
},
__wbg_prototypesetcall_a6b02eb00b0f4ce2: function(arg0, arg1, arg2) {
Uint8Array.prototype.set.call(getArrayU8FromWasm0(arg0, arg1), arg2);
},
__wbg_queueMicrotask_5d15a957e6aa920e: function(arg0) {
queueMicrotask(arg0);
},
__wbg_queueMicrotask_f8819e5ffc402f36: function(arg0) {
const ret = arg0.queueMicrotask;
return ret;
},
__wbg_randomFillSync_6c25eac9869eb53c: function() { return handleError(function (arg0, arg1) {
arg0.randomFillSync(arg1);
}, arguments); },
__wbg_removeAttribute_c75ac657c944b3f1: function() { return handleError(function (arg0, arg1, arg2) {
arg0.removeAttribute(getStringFromWasm0(arg1, arg2));
}, arguments); },
__wbg_removeChild_172df530ec85cc8a: function() { return handleError(function (arg0, arg1) {
const ret = arg0.removeChild(arg1);
return ret;
}, arguments); },
__wbg_require_b4edbdcf3e2a1ef0: function() { return handleError(function () {
const ret = module.require;
return ret;
}, arguments); },
__wbg_resolve_e6c466bc1052f16c: function(arg0) {
const ret = Promise.resolve(arg0);
return ret;
},
__wbg_setAttribute_6fde4098d274155c: function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {
arg0.setAttribute(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4));
}, arguments); },
__wbg_setInterval_84b64f01452a246e: function() { return handleError(function (arg0, arg1) {
const ret = setInterval(arg0, arg1);
return ret;
}, arguments); },
__wbg_setTimeout_ef24d2fc3ad97385: function() { return handleError(function (arg0, arg1) {
const ret = setTimeout(arg0, arg1);
return ret;
}, arguments); },
__wbg_set_022bee52d0b05b19: function() { return handleError(function (arg0, arg1, arg2) {
const ret = Reflect.set(arg0, arg1, arg2);
return ret;
}, arguments); },
__wbg_set_cache_key_274f2145fcb4390c: function(arg0, arg1) {
arg0.__yew_subtree_cache_key = arg1 >>> 0;
},
__wbg_set_capture_6a782955ea62ac61: function(arg0, arg1) {
arg0.capture = arg1 !== 0;
},
__wbg_set_checked_e37eb600f8ec831d: function(arg0, arg1) {
arg0.checked = arg1 !== 0;
},
__wbg_set_fillStyle_e51447e54357dc46: function(arg0, arg1, arg2) {
arg0.fillStyle = getStringFromWasm0(arg1, arg2);
},
__wbg_set_font_295aa505e45244aa: function(arg0, arg1, arg2) {
arg0.font = getStringFromWasm0(arg1, arg2);
},
__wbg_set_globalAlpha_1660b0603161d11b: function(arg0, arg1) {
arg0.globalAlpha = arg1;
},
__wbg_set_height_be9b2b920bd68401: function(arg0, arg1) {
arg0.height = arg1 >>> 0;
},
__wbg_set_innerHTML_a3c82996073b31ea: function(arg0, arg1, arg2) {
arg0.innerHTML = getStringFromWasm0(arg1, arg2);
},
__wbg_set_listener_id_3046a6d6a2394ad9: function(arg0, arg1) {
arg0.__yew_listener_id = arg1 >>> 0;
},
__wbg_set_nodeValue_f39ed00fc286b285: function(arg0, arg1, arg2) {
arg0.nodeValue = arg1 === 0 ? undefined : getStringFromWasm0(arg1, arg2);
},
__wbg_set_passive_69f5c7d4e21e69c3: function(arg0, arg1) {
arg0.passive = arg1 !== 0;
},
__wbg_set_subtree_id_fc80ace73ff247a7: function(arg0, arg1) {
arg0.__yew_subtree_id = arg1 >>> 0;
},
__wbg_set_value_d3cd5a0ce61506cd: function(arg0, arg1, arg2) {
arg0.value = getStringFromWasm0(arg1, arg2);
},
__wbg_set_value_d84be184846d017b: function(arg0, arg1, arg2) {
arg0.value = getStringFromWasm0(arg1, arg2);
},
__wbg_set_width_5cda41d4d06a14dd: function(arg0, arg1) {
arg0.width = arg1 >>> 0;
},
__wbg_slice_5fffd132e3ff5262: function(arg0, arg1) {
const ret = arg1.slice();
const ptr1 = passArrayJsValueToWasm0(ret, wasm.__wbindgen_malloc);
const len1 = WASM_VECTOR_LEN;
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
},
__wbg_stack_3b0d974bbf31e44f: function(arg0, arg1) {
const ret = arg1.stack;
const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len1 = WASM_VECTOR_LEN;
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
},
__wbg_static_accessor_GLOBAL_8cfadc87a297ca02: function() {
const ret = typeof global === 'undefined' ? null : global;
return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
},
__wbg_static_accessor_GLOBAL_THIS_602256ae5c8f42cf: function() {
const ret = typeof globalThis === 'undefined' ? null : globalThis;
return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
},
__wbg_static_accessor_SELF_e445c1c7484aecc3: function() {
const ret = typeof self === 'undefined' ? null : self;
return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
},
__wbg_static_accessor_WINDOW_f20e8576ef1e0f17: function() {
const ret = typeof window === 'undefined' ? null : window;
return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
},
__wbg_subarray_f8ca46a25b1f5e0d: function(arg0, arg1, arg2) {
const ret = arg0.subarray(arg1 >>> 0, arg2 >>> 0);
return ret;
},
__wbg_subtree_id_6a3200546ad613b1: function(arg0) {
const ret = arg0.__yew_subtree_id;
return isLikeNone(ret) ? 0x100000001 : (ret) >>> 0;
},
__wbg_textContent_1f28330a124ec047: function(arg0, arg1) {
const ret = arg1.textContent;
var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
var len1 = WASM_VECTOR_LEN;
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
},
__wbg_then_8e16ee11f05e4827: function(arg0, arg1) {
const ret = arg0.then(arg1);
return ret;
},
__wbg_value_6079dd28568d83c9: function(arg0, arg1) {
const ret = arg1.value;
const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len1 = WASM_VECTOR_LEN;
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
},
__wbg_value_acdc3fed0dd155ba: function(arg0, arg1) {
const ret = arg1.value;
const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len1 = WASM_VECTOR_LEN;
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
},
__wbg_versions_276b2795b1c6a219: function(arg0) {
const ret = arg0.versions;
return ret;
},
__wbindgen_cast_0000000000000001: function(arg0, arg1) {
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [Externref], shim_idx: 281, ret: Result(Unit), inner_ret: Some(Result(Unit)) }, mutable: true }) -> Externref`.
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h5564e0922a8ef97b);
return ret;
},
__wbindgen_cast_0000000000000002: function(arg0, arg1) {
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [Ref(NamedExternref("Event"))], shim_idx: 195, ret: Unit, inner_ret: Some(Unit) }, mutable: false }) -> Externref`.
const ret = makeClosure(arg0, arg1, wasm_bindgen__convert__closures________invoke__h4320859e087f83c8);
return ret;
},
__wbindgen_cast_0000000000000003: function(arg0, arg1) {
// Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [], shim_idx: 248, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h48aa713ae3e44284);
return ret;
},
__wbindgen_cast_0000000000000004: function(arg0, arg1) {
// Cast intrinsic for `Ref(Slice(U8)) -> NamedExternref("Uint8Array")`.
const ret = getArrayU8FromWasm0(arg0, arg1);
return ret;
},
__wbindgen_cast_0000000000000005: function(arg0, arg1) {
// Cast intrinsic for `Ref(String) -> Externref`.
const ret = getStringFromWasm0(arg0, arg1);
return ret;
},
__wbindgen_init_externref_table: function() {
const table = wasm.__wbindgen_externrefs;
const offset = table.grow(4);
table.set(0, undefined);
table.set(offset + 0, undefined);
table.set(offset + 1, null);
table.set(offset + 2, true);
table.set(offset + 3, false);
},
};
return {
__proto__: null,
"./cyberhack_bg.js": import0,
};
}
function wasm_bindgen__convert__closures_____invoke__h48aa713ae3e44284(arg0, arg1) {
wasm.wasm_bindgen__convert__closures_____invoke__h48aa713ae3e44284(arg0, arg1);
}
function wasm_bindgen__convert__closures________invoke__h4320859e087f83c8(arg0, arg1, arg2) {
wasm.wasm_bindgen__convert__closures________invoke__h4320859e087f83c8(arg0, arg1, arg2);
}
function wasm_bindgen__convert__closures_____invoke__h5564e0922a8ef97b(arg0, arg1, arg2) {
const ret = wasm.wasm_bindgen__convert__closures_____invoke__h5564e0922a8ef97b(arg0, arg1, arg2);
if (ret[1]) {
throw takeFromExternrefTable0(ret[0]);
}
}
function addToExternrefTable0(obj) {
const idx = wasm.__externref_table_alloc();
wasm.__wbindgen_externrefs.set(idx, obj);
return idx;
}
const CLOSURE_DTORS = (typeof FinalizationRegistry === 'undefined')
? { register: () => {}, unregister: () => {} }
: new FinalizationRegistry(state => wasm.__wbindgen_destroy_closure(state.a, state.b));
function debugString(val) {
// primitive types
const type = typeof val;
if (type == 'number' || type == 'boolean' || val == null) {
return `${val}`;
}
if (type == 'string') {
return `"${val}"`;
}
if (type == 'symbol') {
const description = val.description;
if (description == null) {
return 'Symbol';
} else {
return `Symbol(${description})`;
}
}
if (type == 'function') {
const name = val.name;
if (typeof name == 'string' && name.length > 0) {
return `Function(${name})`;
} else {
return 'Function';
}
}
// objects
if (Array.isArray(val)) {
const length = val.length;
let debug = '[';
if (length > 0) {
debug += debugString(val[0]);
}
for(let i = 1; i < length; i++) {
debug += ', ' + debugString(val[i]);
}
debug += ']';
return debug;
}
// Test for built-in
const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val));
let className;
if (builtInMatches && builtInMatches.length > 1) {
className = builtInMatches[1];
} else {
// Failed to match the standard '[object ClassName]'
return toString.call(val);
}
if (className == 'Object') {
// we're a user defined class or Object
// JSON.stringify avoids problems with cycles, and is generally much
// easier than looping through ownProperties of `val`.
try {
return 'Object(' + JSON.stringify(val) + ')';
} catch (_) {
return 'Object';
}
}
// errors
if (val instanceof Error) {
return `${val.name}: ${val.message}\n${val.stack}`;
}
// TODO we could test for more things here, like `Set`s and `Map`s.
return className;
}
function getArrayJsValueFromWasm0(ptr, len) {
ptr = ptr >>> 0;
const mem = getDataViewMemory0();
const result = [];
for (let i = ptr; i < ptr + 4 * len; i += 4) {
result.push(wasm.__wbindgen_externrefs.get(mem.getUint32(i, true)));
}
wasm.__externref_drop_slice(ptr, len);
return result;
}
function getArrayU8FromWasm0(ptr, len) {
ptr = ptr >>> 0;
return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len);
}
let cachedDataViewMemory0 = null;
function getDataViewMemory0() {
if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) {
cachedDataViewMemory0 = new DataView(wasm.memory.buffer);
}
return cachedDataViewMemory0;
}
function getStringFromWasm0(ptr, len) {
ptr = ptr >>> 0;
return decodeText(ptr, len);
}
let cachedUint8ArrayMemory0 = null;
function getUint8ArrayMemory0() {
if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {
cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);
}
return cachedUint8ArrayMemory0;
}
function handleError(f, args) {
try {
return f.apply(this, args);
} catch (e) {
const idx = addToExternrefTable0(e);
wasm.__wbindgen_exn_store(idx);
}
}
function isLikeNone(x) {
return x === undefined || x === null;
}
function makeClosure(arg0, arg1, f) {
const state = { a: arg0, b: arg1, cnt: 1 };
const real = (...args) => {
// First up with a closure we increment the internal reference
// count. This ensures that the Rust closure environment won't
// be deallocated while we're invoking it.
state.cnt++;
try {
return f(state.a, state.b, ...args);
} finally {
real._wbg_cb_unref();
}
};
real._wbg_cb_unref = () => {
if (--state.cnt === 0) {
wasm.__wbindgen_destroy_closure(state.a, state.b);
state.a = 0;
CLOSURE_DTORS.unregister(state);
}
};
CLOSURE_DTORS.register(real, state, state);
return real;
}
function makeMutClosure(arg0, arg1, f) {
const state = { a: arg0, b: arg1, cnt: 1 };
const real = (...args) => {
// First up with a closure we increment the internal reference
// count. This ensures that the Rust closure environment won't
// be deallocated while we're invoking it.
state.cnt++;
const a = state.a;
state.a = 0;
try {
return f(a, state.b, ...args);
} finally {
state.a = a;
real._wbg_cb_unref();
}
};
real._wbg_cb_unref = () => {
if (--state.cnt === 0) {
wasm.__wbindgen_destroy_closure(state.a, state.b);
state.a = 0;
CLOSURE_DTORS.unregister(state);
}
};
CLOSURE_DTORS.register(real, state, state);
return real;
}
function passArrayJsValueToWasm0(array, malloc) {
const ptr = malloc(array.length * 4, 4) >>> 0;
for (let i = 0; i < array.length; i++) {
const add = addToExternrefTable0(array[i]);
getDataViewMemory0().setUint32(ptr + 4 * i, add, true);
}
WASM_VECTOR_LEN = array.length;
return ptr;
}
function passStringToWasm0(arg, malloc, realloc) {
if (realloc === undefined) {
const buf = cachedTextEncoder.encode(arg);
const ptr = malloc(buf.length, 1) >>> 0;
getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);
WASM_VECTOR_LEN = buf.length;
return ptr;
}
let len = arg.length;
let ptr = malloc(len, 1) >>> 0;
const mem = getUint8ArrayMemory0();
let offset = 0;
for (; offset < len; offset++) {
const code = arg.charCodeAt(offset);
if (code > 0x7F) break;
mem[ptr + offset] = code;
}
if (offset !== len) {
if (offset !== 0) {
arg = arg.slice(offset);
}
ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;
const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);
const ret = cachedTextEncoder.encodeInto(arg, view);
offset += ret.written;
ptr = realloc(ptr, len, offset, 1) >>> 0;
}
WASM_VECTOR_LEN = offset;
return ptr;
}
function takeFromExternrefTable0(idx) {
const value = wasm.__wbindgen_externrefs.get(idx);
wasm.__externref_table_dealloc(idx);
return value;
}
let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });
cachedTextDecoder.decode();
const MAX_SAFARI_DECODE_BYTES = 2146435072;
let numBytesDecoded = 0;
function decodeText(ptr, len) {
numBytesDecoded += len;
if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) {
cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });
cachedTextDecoder.decode();
numBytesDecoded = len;
}
return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));
}
const cachedTextEncoder = new TextEncoder();
if (!('encodeInto' in cachedTextEncoder)) {
cachedTextEncoder.encodeInto = function (arg, view) {
const buf = cachedTextEncoder.encode(arg);
view.set(buf);
return {
read: arg.length,
written: buf.length
};
};
}
let WASM_VECTOR_LEN = 0;
let wasmModule, wasm;
function __wbg_finalize_init(instance, module) {
wasm = instance.exports;
wasmModule = module;
cachedDataViewMemory0 = null;
cachedUint8ArrayMemory0 = null;
wasm.__wbindgen_start();
return wasm;
}
async function __wbg_load(module, imports) {
if (typeof Response === 'function' && module instanceof Response) {
if (typeof WebAssembly.instantiateStreaming === 'function') {
try {
return await WebAssembly.instantiateStreaming(module, imports);
} catch (e) {
const validResponse = module.ok && expectedResponseType(module.type);
if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') {
console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e);
} else { throw e; }
}
}
const bytes = await module.arrayBuffer();
return await WebAssembly.instantiate(bytes, imports);
} else {
const instance = await WebAssembly.instantiate(module, imports);
if (instance instanceof WebAssembly.Instance) {
return { instance, module };
} else {
return instance;
}
}
function expectedResponseType(type) {
switch (type) {
case 'basic': case 'cors': case 'default': return true;
}
return false;
}
}
function initSync(module) {
if (wasm !== undefined) return wasm;
if (module !== undefined) {
if (Object.getPrototypeOf(module) === Object.prototype) {
({module} = module)
} else {
console.warn('using deprecated parameters for `initSync()`; pass a single object instead')
}
}
const imports = __wbg_get_imports();
if (!(module instanceof WebAssembly.Module)) {
module = new WebAssembly.Module(module);
}
const instance = new WebAssembly.Instance(module, imports);
return __wbg_finalize_init(instance, module);
}
async function __wbg_init(module_or_path) {
if (wasm !== undefined) return wasm;
if (module_or_path !== undefined) {
if (Object.getPrototypeOf(module_or_path) === Object.prototype) {
({module_or_path} = module_or_path)
} else {
console.warn('using deprecated parameters for the initialization function; pass a single object instead')
}
}
if (module_or_path === undefined) {
module_or_path = new URL('cyberhack_bg.wasm', import.meta.url);
}
const imports = __wbg_get_imports();
if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {
module_or_path = fetch(module_or_path);
}
const { instance, module } = await __wbg_load(await module_or_path, imports);
return __wbg_finalize_init(instance, module);
}
export { initSync, __wbg_init as default };
Binary file not shown.
+18
View File
@@ -0,0 +1,18 @@
/* tslint:disable */
/* eslint-disable */
export const memory: WebAssembly.Memory;
export const initCyberHack: (a: number, b: number, c: number, d: number) => [number, number];
export const run_app: () => void;
export const wasm_bindgen__convert__closures_____invoke__h5564e0922a8ef97b: (a: number, b: number, c: any) => [number, number];
export const wasm_bindgen__convert__closures________invoke__h4320859e087f83c8: (a: number, b: number, c: any) => void;
export const wasm_bindgen__convert__closures_____invoke__h48aa713ae3e44284: (a: number, b: number) => void;
export const __wbindgen_malloc: (a: number, b: number) => number;
export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
export const __wbindgen_exn_store: (a: number) => void;
export const __externref_table_alloc: () => number;
export const __wbindgen_externrefs: WebAssembly.Table;
export const __externref_drop_slice: (a: number, b: number) => void;
export const __wbindgen_free: (a: number, b: number, c: number) => void;
export const __wbindgen_destroy_closure: (a: number, b: number) => void;
export const __externref_table_dealloc: (a: number) => void;
export const __wbindgen_start: () => void;
+6
View File
@@ -0,0 +1,6 @@
export { Cyberhack } from "./Cyberhack";
export type {
CyberhackProps,
CyberhackResult,
CyberhackTheme,
} from "./Cyberhack";
+29
View File
@@ -0,0 +1,29 @@
{
"name": "cyberhack",
"type": "module",
"version": "0.1.9",
"main": "./cyberhack.js",
"module": "./cyberhack.js",
"types": "./index.ts",
"exports": {
".": {
"types": "./index.ts",
"import": "./index.ts"
},
"./wasm": "./cyberhack.js",
"./cyberhack.css": {
"import": "./cyberhack.css",
"require": "./cyberhack.css",
"default": "./cyberhack.css"
}
},
"files": [
"cyberhack_bg.wasm",
"cyberhack.js",
"cyberhack.d.ts",
"cyberhack.css",
"Cyberhack.tsx",
"index.ts",
"snippets/*"
]
}