built new web
This commit is contained in:
21
README.md
21
README.md
@@ -1,21 +0,0 @@
|
|||||||
## Библиотека для ширования подписи на WASM
|
|
||||||
|
|
||||||
Готовый шаблон тестов есть в example.html
|
|
||||||
|
|
||||||
Ваша задача фундаментально такая:
|
|
||||||
1) сгенерировать подпись
|
|
||||||
2) отправить подпись на эндпоинт нужным образом
|
|
||||||
|
|
||||||
|
|
||||||
Как сгенерировать подпись?
|
|
||||||
1) в метод get_secret_value сунуть:
|
|
||||||
- user_agent (че угодно)
|
|
||||||
- cur_time (время из эндпоинта https://api.id.hublab.ru/api/v1/server-timestamp )
|
|
||||||
- url (на самом деле это path)
|
|
||||||
|
|
||||||
Формат подписи: набор букв и чисел. Если в результате будет что-то типа "Ошибка 95d19684-e70e-47f5-9341-94f5fd575d08", то значит
|
|
||||||
что-то пошло не так. Отправить такую подпись вы можете, но бэк её не свалидирует и вернёт 401))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
55
example.html
55
example.html
@@ -1,55 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="ru">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>WASM Example</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h1>WASM Example</h1>
|
|
||||||
<div>
|
|
||||||
<label for="userAgent">User Agent:</label>
|
|
||||||
<input type="text" id="userAgent" placeholder="Например, Mozilla/5.0">
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label for="url">URL:</label>
|
|
||||||
<input type="text" id="url" placeholder="Например, http://example.com">
|
|
||||||
</div>
|
|
||||||
<button id="getSecretValue">Получить секретное значение</button>
|
|
||||||
<p id="result"></p>
|
|
||||||
|
|
||||||
<script type="module">
|
|
||||||
import init, { get_secret_value } from './hublib.js';
|
|
||||||
|
|
||||||
async function runWasm() {
|
|
||||||
await init();
|
|
||||||
|
|
||||||
|
|
||||||
document.getElementById('getSecretValue').addEventListener('click', async () => {
|
|
||||||
const userAgent = document.getElementById('userAgent').value || navigator.userAgent;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const secretValue = get_secret_value(BigInt(Math.floor(Date.now() / 1000)), userAgent, url);
|
|
||||||
|
|
||||||
|
|
||||||
document.getElementById('result').innerText = secretValue;
|
|
||||||
|
|
||||||
const txt = 'https://api.id.hublab.ru/api/v1/guestlogin?given_time=' +
|
|
||||||
serverTs.timestamp +
|
|
||||||
'&user_agent=' + userAgent +
|
|
||||||
'&gotten_sign=' + secretValue;
|
|
||||||
|
|
||||||
const response1 = await makePostRequest(txt)
|
|
||||||
|
|
||||||
|
|
||||||
document.getElementById('result-check').innerText = response1.ok;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
runWasm();
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
3
nodejs/hublib.d.ts
vendored
Normal file
3
nodejs/hublib.d.ts
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
|
export function get_secret_value(given_time: bigint, user_agent: string, url: string): string;
|
||||||
137
nodejs/hublib.js
Normal file
137
nodejs/hublib.js
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
|
||||||
|
let imports = {};
|
||||||
|
imports['__wbindgen_placeholder__'] = module.exports;
|
||||||
|
let wasm;
|
||||||
|
const { TextDecoder, TextEncoder } = require(`util`);
|
||||||
|
|
||||||
|
let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });
|
||||||
|
|
||||||
|
cachedTextDecoder.decode();
|
||||||
|
|
||||||
|
let cachedUint8ArrayMemory0 = null;
|
||||||
|
|
||||||
|
function getUint8ArrayMemory0() {
|
||||||
|
if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {
|
||||||
|
cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);
|
||||||
|
}
|
||||||
|
return cachedUint8ArrayMemory0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getStringFromWasm0(ptr, len) {
|
||||||
|
ptr = ptr >>> 0;
|
||||||
|
return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));
|
||||||
|
}
|
||||||
|
|
||||||
|
let WASM_VECTOR_LEN = 0;
|
||||||
|
|
||||||
|
let cachedTextEncoder = new TextEncoder('utf-8');
|
||||||
|
|
||||||
|
const encodeString = (typeof cachedTextEncoder.encodeInto === 'function'
|
||||||
|
? function (arg, view) {
|
||||||
|
return cachedTextEncoder.encodeInto(arg, view);
|
||||||
|
}
|
||||||
|
: function (arg, view) {
|
||||||
|
const buf = cachedTextEncoder.encode(arg);
|
||||||
|
view.set(buf);
|
||||||
|
return {
|
||||||
|
read: arg.length,
|
||||||
|
written: buf.length
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
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 = encodeString(arg, view);
|
||||||
|
|
||||||
|
offset += ret.written;
|
||||||
|
ptr = realloc(ptr, len, offset, 1) >>> 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
WASM_VECTOR_LEN = offset;
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param {bigint} given_time
|
||||||
|
* @param {string} user_agent
|
||||||
|
* @param {string} url
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
module.exports.get_secret_value = function(given_time, user_agent, url) {
|
||||||
|
let deferred3_0;
|
||||||
|
let deferred3_1;
|
||||||
|
try {
|
||||||
|
const ptr0 = passStringToWasm0(user_agent, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
||||||
|
const len0 = WASM_VECTOR_LEN;
|
||||||
|
const ptr1 = passStringToWasm0(url, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
||||||
|
const len1 = WASM_VECTOR_LEN;
|
||||||
|
const ret = wasm.get_secret_value(given_time, ptr0, len0, ptr1, len1);
|
||||||
|
deferred3_0 = ret[0];
|
||||||
|
deferred3_1 = ret[1];
|
||||||
|
return getStringFromWasm0(ret[0], ret[1]);
|
||||||
|
} finally {
|
||||||
|
wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.__wbg_getTime_46267b1c24877e30 = function(arg0) {
|
||||||
|
const ret = arg0.getTime();
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.__wbg_new0_f788a2397c7ca929 = function() {
|
||||||
|
const ret = new Date();
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.__wbindgen_init_externref_table = function() {
|
||||||
|
const table = wasm.__wbindgen_export_0;
|
||||||
|
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);
|
||||||
|
;
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.__wbindgen_throw = function(arg0, arg1) {
|
||||||
|
throw new Error(getStringFromWasm0(arg0, arg1));
|
||||||
|
};
|
||||||
|
|
||||||
|
const path = require('path').join(__dirname, 'hublib_bg.wasm');
|
||||||
|
const bytes = require('fs').readFileSync(path);
|
||||||
|
|
||||||
|
const wasmModule = new WebAssembly.Module(bytes);
|
||||||
|
const wasmInstance = new WebAssembly.Instance(wasmModule, imports);
|
||||||
|
wasm = wasmInstance.exports;
|
||||||
|
module.exports.__wasm = wasm;
|
||||||
|
|
||||||
|
wasm.__wbindgen_start();
|
||||||
|
|
||||||
BIN
nodejs/hublib_bg.wasm
Normal file
BIN
nodejs/hublib_bg.wasm
Normal file
Binary file not shown.
11
nodejs/package.json
Normal file
11
nodejs/package.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"name": "hublib",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"files": [
|
||||||
|
"hublib_bg.wasm",
|
||||||
|
"hublib.js",
|
||||||
|
"hublib.d.ts"
|
||||||
|
],
|
||||||
|
"main": "hublib.js",
|
||||||
|
"types": "hublib.d.ts"
|
||||||
|
}
|
||||||
70
web/example.html
Normal file
70
web/example.html
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="ru">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>WASM Example</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>WASM Example</h1>
|
||||||
|
<div>
|
||||||
|
<label for="userAgent">User Agent:</label>
|
||||||
|
<input type="text" id="userAgent" placeholder="Например, Mozilla/5.0">
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="url">URL:</label>
|
||||||
|
<input type="text" id="url" placeholder="Например, http://example.com">
|
||||||
|
</div>
|
||||||
|
<button id="getSecretValue">Получить секретное значение</button>
|
||||||
|
<p id="result"></p>
|
||||||
|
|
||||||
|
<script type="module">
|
||||||
|
import init, { get_secret_value } from './hublib.js';
|
||||||
|
|
||||||
|
async function runWasm() {
|
||||||
|
await init();
|
||||||
|
|
||||||
|
|
||||||
|
document.getElementById('getSecretValue').addEventListener('click', async () => {
|
||||||
|
const userAgent = document.getElementById('userAgent').value || navigator.userAgent;
|
||||||
|
|
||||||
|
const secretValue = get_secret_value(BigInt(Math.floor(Date.now() / 1000)), userAgent, url);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
document.getElementById('result').innerText = secretValue;
|
||||||
|
|
||||||
|
// const txt = 'https://api.id.hublab.ru/api/v1/guestlogin?given_time=' +
|
||||||
|
// serverTs.timestamp +
|
||||||
|
// '&user_agent=' + userAgent +
|
||||||
|
// '&gotten_sign=' + secretValue;
|
||||||
|
|
||||||
|
//const response1 = await makePostRequest(txt)
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// async function makePostRequest(url) {
|
||||||
|
// try {
|
||||||
|
// const response = await fetch(url, {
|
||||||
|
// method: 'POST',
|
||||||
|
// headers: {
|
||||||
|
// 'Content-Type': 'application/json', // Указываем, что отправляем данные в формате JSON
|
||||||
|
// },
|
||||||
|
// });
|
||||||
|
// if (!response.ok) {
|
||||||
|
// throw new Error(`HTTP error! Статус: ${response.status}`);
|
||||||
|
// }
|
||||||
|
// const responseData = await response.json(); // Получаем ответ как JSON
|
||||||
|
// return responseData; // Возвращаем полученные данные
|
||||||
|
// } catch (error) {
|
||||||
|
// console.error('Ошибка при выполнении POST-запроса:', error);
|
||||||
|
// throw error; // Пробрасываем ошибку дальше
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
runWasm();
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
0
hublib.d.ts → web/hublib.d.ts
vendored
0
hublib.d.ts → web/hublib.d.ts
vendored
70
web/hublib_bg.wasm.d.ts
vendored
Normal file
70
web/hublib_bg.wasm.d.ts
vendored
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
|
export const memory: WebAssembly.Memory;
|
||||||
|
export const ffi_hublib_uniffi_contract_version: () => number;
|
||||||
|
export const ffi_hublib_rustbuffer_alloc: (a: number, b: bigint, c: number) => void;
|
||||||
|
export const ffi_hublib_rustbuffer_from_bytes: (a: number, b: number, c: number, d: number) => void;
|
||||||
|
export const ffi_hublib_rustbuffer_free: (a: bigint, b: bigint, c: number, d: number, e: number) => void;
|
||||||
|
export const ffi_hublib_rustbuffer_reserve: (a: number, b: bigint, c: bigint, d: number, e: number, f: bigint, g: number) => void;
|
||||||
|
export const ffi_hublib_rust_future_poll_u8: (a: bigint, b: number, c: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_cancel_u8: (a: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_complete_u8: (a: bigint, b: number) => number;
|
||||||
|
export const ffi_hublib_rust_future_free_u8: (a: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_poll_i8: (a: bigint, b: number, c: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_cancel_i8: (a: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_complete_i8: (a: bigint, b: number) => number;
|
||||||
|
export const ffi_hublib_rust_future_free_i8: (a: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_poll_u16: (a: bigint, b: number, c: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_cancel_u16: (a: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_complete_u16: (a: bigint, b: number) => number;
|
||||||
|
export const ffi_hublib_rust_future_free_u16: (a: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_poll_i16: (a: bigint, b: number, c: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_cancel_i16: (a: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_complete_i16: (a: bigint, b: number) => number;
|
||||||
|
export const ffi_hublib_rust_future_free_i16: (a: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_poll_u32: (a: bigint, b: number, c: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_cancel_u32: (a: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_complete_u32: (a: bigint, b: number) => number;
|
||||||
|
export const ffi_hublib_rust_future_free_u32: (a: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_poll_i32: (a: bigint, b: number, c: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_cancel_i32: (a: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_complete_i32: (a: bigint, b: number) => number;
|
||||||
|
export const ffi_hublib_rust_future_free_i32: (a: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_poll_u64: (a: bigint, b: number, c: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_cancel_u64: (a: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_complete_u64: (a: bigint, b: number) => bigint;
|
||||||
|
export const ffi_hublib_rust_future_free_u64: (a: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_poll_i64: (a: bigint, b: number, c: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_cancel_i64: (a: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_complete_i64: (a: bigint, b: number) => bigint;
|
||||||
|
export const ffi_hublib_rust_future_free_i64: (a: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_poll_f32: (a: bigint, b: number, c: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_cancel_f32: (a: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_complete_f32: (a: bigint, b: number) => number;
|
||||||
|
export const ffi_hublib_rust_future_free_f32: (a: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_poll_f64: (a: bigint, b: number, c: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_cancel_f64: (a: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_complete_f64: (a: bigint, b: number) => number;
|
||||||
|
export const ffi_hublib_rust_future_free_f64: (a: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_poll_pointer: (a: bigint, b: number, c: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_cancel_pointer: (a: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_complete_pointer: (a: bigint, b: number) => number;
|
||||||
|
export const ffi_hublib_rust_future_free_pointer: (a: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_poll_rust_buffer: (a: bigint, b: number, c: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_cancel_rust_buffer: (a: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_complete_rust_buffer: (a: number, b: bigint, c: number) => void;
|
||||||
|
export const ffi_hublib_rust_future_free_rust_buffer: (a: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_poll_void: (a: bigint, b: number, c: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_cancel_void: (a: bigint) => void;
|
||||||
|
export const ffi_hublib_rust_future_complete_void: (a: bigint, b: number) => void;
|
||||||
|
export const ffi_hublib_rust_future_free_void: (a: bigint) => void;
|
||||||
|
export const uniffi_hublib_fn_func_get_secret_value: (a: number, b: bigint, c: bigint, d: bigint, e: number, f: number, g: bigint, h: bigint, i: number, j: number, k: number) => void;
|
||||||
|
export const uniffi_hublib_checksum_func_get_secret_value: () => number;
|
||||||
|
export const get_secret_value: (a: bigint, b: number, c: number, d: number, e: number) => [number, number];
|
||||||
|
export const uniffi_hublib_fn_func_recreate_secret_value: (a: number, b: bigint, c: bigint, d: bigint, e: number, f: number, g: bigint, h: bigint, i: number, j: number, k: bigint, l: bigint, m: number, n: number, o: number) => void;
|
||||||
|
export const uniffi_hublib_checksum_func_recreate_secret_value: () => number;
|
||||||
|
export const __wbindgen_export_0: WebAssembly.Table;
|
||||||
|
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_free: (a: number, b: number, c: number) => void;
|
||||||
|
export const __wbindgen_start: () => void;
|
||||||
Reference in New Issue
Block a user