// Shared HTTP assertions for disposable local and container deployments. const assert=require('node:assert/strict'); const {randomUUID}=require('node:crypto'); const {setTimeout:delay}=require('node:timers/promises'); function fixtureWav(){ const wav=Buffer.alloc(44+16000); wav.write('RIFF');wav.writeUInt32LE(wav.length-8,4);wav.write('WAVEfmt ',8);wav.writeUInt32LE(16,16); wav.writeUInt16LE(1,20);wav.writeUInt16LE(1,22);wav.writeUInt32LE(8000,24);wav.writeUInt32LE(16000,28); wav.writeUInt16LE(2,32);wav.writeUInt16LE(16,34);wav.write('data',36);wav.writeUInt32LE(16000,40); return wav; } async function waitForReading(origin){ for(let attempt=0;attempt<120;attempt++){ try{if((await fetch(origin+'/api/v1/health',{signal:AbortSignal.timeout(1000)})).ok)return;}catch{} await delay(500); } throw Error('reading health timeout'); } async function exerciseDeployment({origin,mediaRoot,restart,wav}){ const api=async(path,method='GET',body,token)=>{ const response=await fetch(origin+'/api/v1/'+path,{method,headers:{'content-type':'application/json',...(token?{authorization:'Bearer '+token}:{})},...(body?{body:JSON.stringify(body)}:{}),signal:AbortSignal.timeout(15000)}); assert.ok(response.ok,`${method} ${path}: ${response.status}`);return response.json(); }; const waitForMedia=async token=>{ const deadline=Date.now()+310000; for(;;){ const response=await fetch(origin+'/api/v1/media/libraries',{headers:{authorization:'Bearer '+token},signal:AbortSignal.timeout(5000)}); if(response.ok){await response.arrayBuffer();return;} const body=await response.json(); assert.equal(response.status,503);assert.equal(body.error?.code,'MEDIA_STARTING','media startup failed'); assert.ok(Date.now(){ const response=await fetch(origin+streamUrl,{headers:{range:'bytes=0-43'},signal:AbortSignal.timeout(10000)}); assert.equal(response.status,206);assert.deepEqual(Buffer.from(await response.arrayBuffer()),wav.subarray(0,44)); }; await waitForReading(origin); const web=await fetch(origin+'/');assert.equal(web.status,200);assert.match(await web.text(),/