Files
motr-enclave/example/main.js

172 lines
4.9 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 || String(err)}`);
}
}
window.testPing = async function() {
if (!enclave) return log(LogLevel.ERR, 'ping', 'Plugin not loaded');
const message = document.getElementById('ping-msg').value || 'hello';
log(LogLevel.INFO, 'ping', `message="${message}"`);
try {
const result = await enclave.ping(message);
if (result.success) {
log(LogLevel.OK, 'ping', `echo="${result.echo}"`, result);
} else {
log(LogLevel.ERR, 'ping', result.message, result);
}
return result;
} catch (err) {
log(LogLevel.ERR, 'ping', err?.message || String(err));
throw err;
}
};
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 || String(err));
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 || String(err));
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 || String(err));
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 || String(err));
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 testPing();
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 || String(err)} ===`);
}
};
init();