SOURCE / PINNED RELEASE
Made of little things.
NAP test
- Release
- bc448092aba3…
- Author-recorded commit
- Not provided
- License
- Check the original source
The hash-verified playable HTML, which may contain bundled or minified code. This view does not execute it.
<!doctype html><html><head><meta charset="utf-8"><title>Amethyst NAP test</title>
<style>body{font:13px monospace;background:#111;color:#ddd;padding:12px} .ok{color:#7c7} .bad{color:#e66}</style></head>
<body><h3>Amethyst NAP test (disposable account)</h3><div id="out"></div>
<script>
(function(){
var out = document.getElementById('out');
function log(step, ok, detail){
var line = 'NAPTEST ' + JSON.stringify({ step: step, ok: ok, detail: detail });
console.log(line);
var d = document.createElement('div'); d.className = ok ? 'ok' : 'bad'; d.textContent = (ok ? 'PASS ' : 'FAIL ') + step + ' ' + JSON.stringify(detail).slice(0, 160); out.appendChild(d);
}
async function step(name, fn){ try { var r = await fn(); log(name, r.ok !== false, r); return r; } catch (e) { log(name, false, { error: String(e && e.message || e) }); return null; } }
var n = window.napplet;
// A 1x1 PNG.
var png = Uint8Array.from(atob('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg=='), function(c){ return c.charCodeAt(0); });
(async function(){
var me = await step('identity.getPublicKey', async function(){ return { pubkey: await n.identity.getPublicKey() }; });
var pk = me && me.pubkey;
var enc = await step('common.encodeNip19', function(){ return n.common.encodeNip19({ type: 'npub', hex: pk }); });
await step('common.decodeNip19', async function(){ var r = await n.common.decodeNip19(enc.value); r.ok = r.ok && r.pubkey === pk; return r; });
await step('common.encodeNip19 nsec refused', async function(){ var r = await n.common.encodeNip19({ type: 'nsec', hex: pk }); return { ok: r.ok === false && r.error === 'unsupported-nip19-type', error: r.error }; });
await step('common.getProfile', async function(){ var r = await n.common.getProfile(pk); return { ok: r.ok, pubkey: r.pubkey, name: r.profile && r.profile.name }; });
await step('common.follows', async function(){ var f = await n.common.follows(); return { ok: Array.isArray(f), count: f.length }; });
await step('common.follow self', async function(){ var r = await n.common.follow(enc.value); return { ok: r.ok, eventId: r.eventId, kind: r.event && r.event.kind, error: r.error }; });
await step('common.follow again (no-op)', async function(){ var r = await n.common.follow(enc.value); return { ok: r.ok, eventId: r.eventId, error: r.error }; });
await step('common.unfollow self', async function(){ var r = await n.common.unfollow(enc.value); return { ok: r.ok, eventId: r.eventId, error: r.error }; });
var note = await step('relay.publish note', async function(){ var e = await n.relay.publish({ kind: 1, tags: [], content: 'Amethyst napplet test from a disposable account. Please ignore.' }); return { ok: !!(e && e.id), id: e && e.id }; });
// Let the note reach the relays the shell reads back from.
await new Promise(function(r){ setTimeout(r, 4000); });
await step('common.react', async function(){ var r = await n.common.react(note.id, '+'); return { ok: r.ok, kind: r.event && r.event.kind, error: r.error }; });
await step('common.react bad reaction refused', async function(){ var r = await n.common.react(note.id, 'not an emoji'); return { ok: r.ok === false && r.error === 'invalid-reaction', error: r.error }; });
await step('common.report own note', async function(){ var r = await n.common.report({ type: 'event', id: note.id }, 'other', 'napplet test, ignore'); return { ok: r.ok, kind: r.event && r.event.kind, error: r.error }; });
var info = await step('upload.info', async function(){ var i = await n.upload.info(); return { ok: !!(i && i.rails), rails: i.rails, maxBytes: i.maxBytes }; });
var up = await step('upload.upload', async function(){ var r = await n.upload.upload({ data: new Blob([png], { type: 'image/png' }), filename: 'pixel.png' }); return r; });
if (up && up.url) {
await step('upload.status', async function(){ var s = await n.upload.status(up.uploadId); return { ok: s.status === 'complete' && s.url === up.url, status: s.status }; });
await step('resource.bytes of the upload', async function(){ var b = await n.resource.bytes(up.url); var buf = new Uint8Array(await b.arrayBuffer()); return { ok: buf.length === png.length && buf.every(function(v, i){ return v === png[i]; }), size: buf.length }; });
}
await step('upload.upload too large refused', async function(){ try { await n.upload.upload({ data: new Uint8Array((info && info.maxBytes || 0) + 1) }); return { ok: false }; } catch (e) { return { ok: String(e.message).indexOf('file too large') >= 0, error: String(e.message) }; } });
await step('intent.available', async function(){ var a = await n.intent.available('napptest'); return { ok: a.available, candidates: a.candidates.map(function(c){ return c.id; }) }; });
await step('intent.invoke', function(){ return n.intent.invoke('napplet:napptest/open?msg=hello%2Bworld'); });
log('done', true, {});
})();
})();
</script></body></html>
