107 lines
3.3 KiB
HTML
107 lines
3.3 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<title>n_signer WebUSB Test</title>
|
|
</head>
|
|
<body>
|
|
<h2>n_signer WebUSB Harness</h2>
|
|
<div id="status"></div>
|
|
<div id="results"></div>
|
|
<button id="launch">Launch Login Modal</button>
|
|
<button id="sign" disabled>Sign kind-1</button>
|
|
<button id="nip44" disabled>NIP-44 self encrypt/decrypt</button>
|
|
|
|
<script src="./nostr.bundle.js"></script>
|
|
<script src="./nostr-lite.js"></script>
|
|
<script>
|
|
const status = document.getElementById('status');
|
|
const results = document.getElementById('results');
|
|
const signBtn = document.getElementById('sign');
|
|
const nip44Btn = document.getElementById('nip44');
|
|
|
|
function setStatus(msg) {
|
|
status.textContent = msg;
|
|
}
|
|
|
|
function show(obj) {
|
|
results.innerHTML = `<pre>${typeof obj === 'string' ? obj : JSON.stringify(obj, null, 2)}</pre>`;
|
|
}
|
|
|
|
(async () => {
|
|
setStatus('Initializing...');
|
|
await window.NOSTR_LOGIN_LITE.init({
|
|
theme: 'default',
|
|
methods: {
|
|
extension: true,
|
|
local: true,
|
|
readonly: true,
|
|
connect: true,
|
|
nsigner: true,
|
|
otp: false
|
|
},
|
|
floatingTab: { enabled: false }
|
|
});
|
|
|
|
if (!window.isSecureContext) {
|
|
setStatus('Not a secure context. Use HTTPS or localhost for WebUSB.');
|
|
} else if (!('usb' in navigator)) {
|
|
setStatus('WebUSB not available in this browser. Use Chrome/Edge.');
|
|
} else {
|
|
setStatus('Ready. Use Launch Login Modal and select USB Hardware signer.');
|
|
}
|
|
})();
|
|
|
|
document.getElementById('launch').addEventListener('click', () => {
|
|
window.NOSTR_LOGIN_LITE.launch('login');
|
|
});
|
|
|
|
window.addEventListener('nlMethodSelected', (event) => {
|
|
setStatus(`Authenticated with: ${event.detail.method}`);
|
|
const enabled = event.detail.method !== 'readonly';
|
|
signBtn.disabled = !enabled;
|
|
nip44Btn.disabled = !enabled;
|
|
});
|
|
|
|
window.addEventListener('nlAuthRestored', (event) => {
|
|
setStatus(`Restored auth: ${event.detail.method}`);
|
|
const enabled = event.detail.method !== 'readonly';
|
|
signBtn.disabled = !enabled;
|
|
nip44Btn.disabled = !enabled;
|
|
});
|
|
|
|
window.addEventListener('nlReconnectionRequired', (event) => {
|
|
setStatus(event.detail?.message || 'Reconnection required');
|
|
});
|
|
|
|
signBtn.addEventListener('click', async () => {
|
|
try {
|
|
const event = {
|
|
kind: 1,
|
|
content: 'hello from nsigner harness',
|
|
tags: [],
|
|
created_at: Math.floor(Date.now() / 1000)
|
|
};
|
|
const signed = await window.nostr.signEvent(event);
|
|
show(signed);
|
|
} catch (err) {
|
|
show(`signEvent failed: ${err.message}`);
|
|
}
|
|
});
|
|
|
|
nip44Btn.addEventListener('click', async () => {
|
|
try {
|
|
const pubkey = await window.nostr.getPublicKey();
|
|
const plaintext = 'self-test ' + Date.now();
|
|
const cipher = await window.nostr.nip44.encrypt(pubkey, plaintext);
|
|
const dec = await window.nostr.nip44.decrypt(pubkey, cipher);
|
|
show({ pubkey, plaintext, cipher, decrypted: dec, ok: dec === plaintext });
|
|
} catch (err) {
|
|
show(`nip44 failed: ${err.message}`);
|
|
}
|
|
});
|
|
</script>
|
|
</body>
|
|
</html>
|