151 lines
4.2 KiB
JavaScript
151 lines
4.2 KiB
JavaScript
import { createEnclave } from '../dist/enclave.js';
|
|
|
|
let enclave = null;
|
|
let lastDatabase = null;
|
|
|
|
const LogLevel = { INFO: 'info', OK: 'ok', ERR: 'err', DATA: 'data' };
|
|
|
|
function log(level, method, message, data = null) {
|
|
const el = document.getElementById('log');
|
|
const time = new Date().toISOString().slice(11, 23);
|
|
const prefix = method ? `[${method}]` : '';
|
|
|
|
let entry = `<div class="log-entry"><span class="log-time">${time}</span> <span class="log-${level}">${prefix} ${message}</span>`;
|
|
if (data !== null) {
|
|
entry += `\n<span class="log-data">${JSON.stringify(data, null, 2)}</span>`;
|
|
}
|
|
entry += '</div>';
|
|
|
|
el.innerHTML += entry;
|
|
el.scrollTop = el.scrollHeight;
|
|
|
|
console.log(`[${time}] ${prefix} ${message}`, data ?? '');
|
|
}
|
|
|
|
function setStatus(ok, message) {
|
|
const el = document.getElementById('status');
|
|
el.textContent = message;
|
|
el.className = `status ${ok ? 'ok' : 'err'}`;
|
|
}
|
|
|
|
async function init() {
|
|
try {
|
|
log(LogLevel.INFO, null, 'Loading enclave.wasm...');
|
|
enclave = await createEnclave('./enclave.wasm', { debug: true });
|
|
setStatus(true, 'Ready');
|
|
log(LogLevel.OK, null, 'Plugin loaded');
|
|
} catch (err) {
|
|
setStatus(false, 'Failed');
|
|
log(LogLevel.ERR, null, `Load failed: ${err.message}`);
|
|
}
|
|
}
|
|
|
|
window.testGenerate = async function() {
|
|
if (!enclave) return log(LogLevel.ERR, 'generate', 'Plugin not loaded');
|
|
|
|
const credential = document.getElementById('credential').value;
|
|
log(LogLevel.INFO, 'generate', `credential=${credential.slice(0, 16)}...`);
|
|
|
|
try {
|
|
const result = await enclave.generate(credential);
|
|
log(LogLevel.OK, 'generate', `DID created: ${result.did}`, result);
|
|
|
|
if (result.database) {
|
|
lastDatabase = result.database;
|
|
document.getElementById('database').value = btoa(String.fromCharCode(...result.database));
|
|
log(LogLevel.INFO, 'generate', 'Database saved for load() test');
|
|
}
|
|
return result;
|
|
} catch (err) {
|
|
log(LogLevel.ERR, 'generate', err.message);
|
|
throw err;
|
|
}
|
|
};
|
|
|
|
window.testLoad = async function() {
|
|
if (!enclave) return log(LogLevel.ERR, 'load', 'Plugin not loaded');
|
|
|
|
const b64 = document.getElementById('database').value;
|
|
if (!b64) return log(LogLevel.ERR, 'load', 'Database required');
|
|
|
|
log(LogLevel.INFO, 'load', `database.length=${b64.length}`);
|
|
|
|
try {
|
|
const database = Uint8Array.from(atob(b64), c => c.charCodeAt(0));
|
|
const result = await enclave.load(database);
|
|
|
|
if (result.success) {
|
|
log(LogLevel.OK, 'load', `Loaded DID: ${result.did}`, result);
|
|
} else {
|
|
log(LogLevel.ERR, 'load', result.error, result);
|
|
}
|
|
return result;
|
|
} catch (err) {
|
|
log(LogLevel.ERR, 'load', err.message);
|
|
throw err;
|
|
}
|
|
};
|
|
|
|
window.testExec = async function() {
|
|
if (!enclave) return log(LogLevel.ERR, 'exec', 'Plugin not loaded');
|
|
|
|
const filter = document.getElementById('filter').value;
|
|
if (!filter) return log(LogLevel.ERR, 'exec', 'Filter required');
|
|
|
|
log(LogLevel.INFO, 'exec', `filter="${filter}"`);
|
|
|
|
try {
|
|
const result = await enclave.exec(filter);
|
|
|
|
if (result.success) {
|
|
log(LogLevel.OK, 'exec', 'Success', result);
|
|
} else {
|
|
log(LogLevel.ERR, 'exec', result.error, result);
|
|
}
|
|
return result;
|
|
} catch (err) {
|
|
log(LogLevel.ERR, 'exec', err.message);
|
|
throw err;
|
|
}
|
|
};
|
|
|
|
window.testQuery = async function() {
|
|
if (!enclave) return log(LogLevel.ERR, 'query', 'Plugin not loaded');
|
|
|
|
const did = document.getElementById('did').value;
|
|
log(LogLevel.INFO, 'query', did ? `did="${did}"` : 'did=(current)');
|
|
|
|
try {
|
|
const result = await enclave.query(did);
|
|
log(LogLevel.OK, 'query', `Resolved: ${result.did}`, result);
|
|
return result;
|
|
} catch (err) {
|
|
log(LogLevel.ERR, 'query', err.message);
|
|
throw err;
|
|
}
|
|
};
|
|
|
|
window.setFilter = function(filter) {
|
|
document.getElementById('filter').value = filter;
|
|
};
|
|
|
|
window.clearLog = function() {
|
|
document.getElementById('log').innerHTML = '';
|
|
};
|
|
|
|
window.runAllTests = async function() {
|
|
log(LogLevel.INFO, null, '=== Running all tests ===');
|
|
|
|
try {
|
|
await testGenerate();
|
|
await testLoad();
|
|
await testExec();
|
|
await testQuery();
|
|
log(LogLevel.OK, null, '=== All tests passed ===');
|
|
} catch (err) {
|
|
log(LogLevel.ERR, null, `=== Tests failed: ${err.message} ===`);
|
|
}
|
|
};
|
|
|
|
init();
|