Back to Napcraft
SOURCE / PINNED RELEASE

Made of little things.

Napcraft

Release
ee47ac6a25df…
Author-recorded commit
410dea87e109…
License
LICENSE
Author’s source reference
nostr://npub182jczunncwe0jn6frpqwq3e0qjws7yqqnc3auccqv9nte2dnd63scjm4rf/wss%3A%2F%2Fgit.napplet.soy%2F/n-52f9e22f5ce

Archive hash verified: 9e6e0cabb18d0d46…. The source-to-build association is the author’s claim; it has not been independently rebuilt.

tests/public-directory-capability.mjs
// Public-host capability probe using an already-created public test world.
// This verifies relay acknowledgement/discovery without substituting a mock relay.
import {chromium,executable,installTestIdentity} from './browser-support.mjs';
import {readFile,writeFile} from 'node:fs/promises';
import assert from 'node:assert/strict';
const saved=JSON.parse(await readFile('.napplet-space/public-consent-results.json','utf8'));
const browser=await chromium.launch({executablePath:executable,headless:true}),players=[];
const read=(p,filters)=>p.frame.evaluate(f=>window.napplet.outbox.query(f.filters,{relays:f.relays,timeoutMs:8000}),{filters,relays:p.policy.defaultRelays});
const publish=async(p,template)=>{
  const call=p.frame.evaluate(({template,relays})=>window.napplet.outbox.publish(template,{toOutbox:false,relays}),{template,relays:p.policy.defaultRelays});
  call.catch(()=>{});
  const dialog=p.page.getByRole('dialog',{name:'Approve public action',exact:true});
  const first=await Promise.race([call.then(result=>({result})),dialog.waitFor().then(()=>({prompt:true}))]);
  if(first.result)return first.result;
  await dialog.getByRole('button',{name:'Approve & publish',exact:true}).click();return call;
};
try{
  for(let i=0;i<2;i++){
    const context=await browser.newContext(),page=await context.newPage();if(i===0)await installTestIdentity(page);
    await page.goto(saved.publication.snapshotUrl,{waitUntil:'domcontentloaded'});
    if(i===0){await page.getByRole('button',{name:'Connect',exact:true}).click();await page.getByRole('button',{name:'Connect browser extension',exact:true}).click();}
    await page.getByRole('button',{name:'Start Napcraft',exact:true}).click();
    const frame=await(await page.locator('iframe[title="Napcraft"]').elementHandle()).contentFrame();
    await frame.locator('#app[data-ready=true]').waitFor();
    const policy=await frame.evaluate(()=>new Promise(resolve=>window.napplet.shell.onReady(e=>resolve(e.capabilities.appData))));players.push({page,frame,policy});
  }
  const [a,b]=players,id=crypto.randomUUID(),d=`soy.app-data/1:${a.policy.scope}:worlds:${id}`;
  assert.equal(a.policy.scope,b.policy.scope);
  const template={kind:30078,created_at:Math.floor(Date.now()/1000),tags:[['d',d],['s',a.policy.scope],['c','worlds'],['L','soy.app-data/1'],['l','napcraft.world-directory','soy.app-data/1'],['v','1']],content:JSON.stringify({schema:'napcraft.world-directory',version:1,title:'Napcraft directory connection check',previous:null,deleted:false,data:{code:saved.code}})};
  const result=await publish(a,template);assert.ok(result.ok,JSON.stringify(result));console.log('PASS public host signs and relay acknowledges directory record');
  const records=await read(b,[{kinds:[30078],'#d':[d],limit:1}]);assert.ok(records.events.some(r=>r.event.id===result.event.id));console.log('PASS independent anonymous player can discover the record');
  const tombstone={...template,created_at:template.created_at+1,content:JSON.stringify({...JSON.parse(template.content),previous:result.event.id,deleted:true,data:null})};
  const removed=await publish(a,tombstone);assert.ok(removed.ok,JSON.stringify(removed));console.log('PASS public host acknowledges removal');
  await writeFile('.napplet-space/public-directory-capability.json',JSON.stringify({passed:true,scope:a.policy.scope,relays:a.policy.defaultRelays,recordId:result.event.id,removedId:removed.event.id},null,2));
}catch(error){for(const p of players)console.log('CAPABILITY FAILURE',await p.page.locator('body').innerText());throw error;}finally{await browser.close();}