backend-check.mjs (2133B)
1 import assert from 'node:assert/strict'; 2 import {readFile} from 'node:fs/promises'; 3 import {createHash} from 'node:crypto'; 4 import {openSession,backendFactories} from './backends.mjs'; 5 const bundle=await readFile('test/fixtures/id.arboricx'); 6 const hash=createHash('sha256').update(bundle).digest('hex'); 7 const wasm=await readFile(process.argv[2]); 8 assert.deepEqual(Object.keys(backendFactories),['js','zig-wasm']); 9 for(const backend of ['toString','haskell-wasm','unknown']) 10 await assert.rejects(openSession({backend,bundle,hash}),/Unknown backend/); 11 for(const backend of Object.keys(backendFactories)) { 12 const session=await openSession({backend,bundle,hash,artifacts:{wasm}}); 13 assert.equal(await session.runText('λ雪🙂'),'λ雪🙂'); 14 assert.equal(await session.runTree('21100',['2100']),'2100'); 15 await session.dispose();await session.dispose(); 16 await assert.rejects(async()=>session.runText('stale'),/disposed/); 17 } 18 await assert.rejects(openSession({backend:'zig-wasm',bundle,hash}),/Missing zig-wasm artifact/); 19 // A future backend may have asynchronous operations and completely different 20 // internal ownership. No Graph/WASM exports/BigInt handles are required here. 21 let calls=0; 22 const factories={alternate:async config=>{ 23 calls++;assert.equal(config.name,'id'); 24 return {runText:async text=>text,stats:async()=>({backendMetric:7}),dispose:async()=>{}}; 25 }}; 26 await assert.rejects(openSession({backend:'alternate',bundle,hash:'0'.repeat(64)},factories),/hash mismatch/); 27 assert.equal(calls,0); 28 const alternate=await openSession({backend:'alternate',bundle,hash},factories); 29 assert.equal(await alternate.runText('async'),'async');assert.deepEqual(await alternate.stats(),{backendMetric:7}); 30 await alternate.dispose();assert.equal(calls,1); 31 let fallback=false; 32 await assert.rejects(openSession({backend:'broken',bundle,hash},{ 33 broken:async()=>{throw new Error('Selected backend failed');}, 34 js:async()=>{fallback=true;}, 35 }),/Selected backend failed/); 36 assert.equal(fallback,false); 37 console.log('Backend sessions: explicit selection, authentication, isolation/disposal, async adapters and no fallback passed');