'use strict'; const assert=require('node:assert/strict'),fs=require('node:fs'),os=require('node:os'),path=require('node:path'); const create=require('../lib/wrinkle-jobs'); const dir=fs.mkdtempSync(path.join(os.tmpdir(),'juzi-wrinkle-jobs-')); const owner={id:'owner',kind:'wechat'},guest={id:'guest',kind:'browser'}; const ready={version:'independent-side-wrinkles-v1',left:{status:'ready'},right:{status:'ready'}}; (async()=>{ let calls=0,finish,completed=0; const deps={dir,collect:()=>{calls++;return new Promise(r=>{finish=r;});},load:()=>({}),complete:()=>{completed++;}}; const jobs=create(deps),job=jobs.register(owner,'Rtest',{});assert.equal(calls,0,'registration cannot start paid work'); assert.equal(await jobs.run({id:'intruder',kind:'wechat'},job.token),null); const a=jobs.run(owner,job.token),b=jobs.run(owner,job.token);assert.equal(calls,1);finish(ready); assert.deepEqual(await a,ready);assert.deepEqual(await b,ready);assert.equal(completed,1); assert.deepEqual(await jobs.run(owner,job.token),ready);assert.equal(calls,1); const restarted=create({...deps,collect:()=>{throw Error('must use persistent cache');}}); assert.deepEqual(await restarted.run(owner,job.token),ready); const before=fs.readdirSync(dir);const g=jobs.register(guest,'Rguest',{}); const gr=jobs.run(guest,g.token);finish(ready);await gr; assert.deepEqual(fs.readdirSync(dir),before,'guest jobs/photos/results never persist'); const pending=jobs.register(owner,'Rpending',{}); const reload=create({...deps,collect:async()=>ready});assert.deepEqual(await reload.run(owner,pending.token),ready,'pending restart reloads own saved snapshot'); const running=jobs.register(owner,'Rrunning',{});const old=jobs.run(owner,running.token); const afterCrash=create({...deps,collect:()=>{throw Error('must not charge twice');}}); assert.equal((await afterCrash.run(owner,running.token)).left.error_code,'WRINKLE_JOB_INTERRUPTED');finish(ready);await old; const failed=create({...deps,collect:async()=>{throw Error('provider failed');}});const f=failed.register(owner,'Rfailed',{}); assert.equal((await failed.run(owner,f.token)).left.error_code,'WRINKLE_JOB_FAILED'); assert.equal(await failed.run(owner,'../bad'),null); console.log('PASS: lazy owner-bound single-flight jobs, durable success/failure cache, crash no-duplicate-charge policy, pending recovery, guest RAM-only'); })().catch(e=>{console.error(e);process.exitCode=1;});