Expose screenshot worker progress and allow complete series rendering in CI
PROMPT Docker CI and deployment / verify-and-deploy (push) Failing after 11m9s
PROMPT Docker CI and deployment / verify-and-deploy (push) Failing after 11m9s
This commit is contained in:
@@ -10,7 +10,7 @@ export async function snapshotState(slug:string){
|
||||
const post=(await db().query('SELECT id,page_key FROM posts WHERE slug=$1',[slug])).rows[0];
|
||||
if(!post||!chapters.some(c=>c.key===post.page_key))return null;
|
||||
const pages=(await db().query('SELECT page_index,asset_id,rendered_at,revision FROM page_snapshots WHERE post_id=$1 ORDER BY page_index',[post.id])).rows;
|
||||
const job=(await db().query('SELECT status,error,revision FROM render_jobs WHERE post_id=$1',[post.id])).rows[0]||null;
|
||||
const job=(await db().query('SELECT status,error,revision,attempts,target_page FROM render_jobs WHERE post_id=$1',[post.id])).rows[0]||null;
|
||||
return {postId:post.id,pages,job};
|
||||
}
|
||||
export async function queueSnapshots(postId:string,pageIndex?:number){
|
||||
@@ -29,14 +29,16 @@ export async function renderOne(){
|
||||
await context.route('**/*',route=>new URL(route.request().url()).origin===origin?route.continue():route.abort());
|
||||
const page=await context.newPage();const output:{index:number;id:string}[]=[];
|
||||
for(let index=job.target_page||1;index<=(job.target_page||8);index++){
|
||||
console.log('Rendering canvas',post.slug,index);
|
||||
const response=await page.goto(`${origin}/p/${post.slug}/pages/${index}`,{waitUntil:'networkidle',timeout:45000});
|
||||
if(!response?.ok())throw Error('Canvas page unavailable');
|
||||
await page.locator('[data-render-page]').waitFor();await page.evaluate(()=>document.fonts.ready);
|
||||
await page.locator('[data-render-page]').waitFor();await page.evaluate(async()=>{await document.fonts.ready;});
|
||||
console.log('Canvas loaded',post.slug,index);
|
||||
const overflow=await page.evaluate(()=>{const sheet=document.querySelector('.learning-sheet');if(!sheet)return false;const footer=sheet.querySelector('footer')!;return Array.from(sheet.children).filter(c=>c!==footer).some(c=>c.getBoundingClientRect().bottom>footer.getBoundingClientRect().top-2)});
|
||||
if(overflow)throw Error(`Canvas ${index} overlaps its footer`);
|
||||
const path=join(dir,`${index}.png`);const bytes=await page.locator('[data-render-page]').screenshot({path,animations:'disabled'});
|
||||
const hash=createHash('sha256').update(bytes).digest('hex');const key=`snapshots/${hash}.png`;const size=await putFile(key,path,'image/png');
|
||||
const asset=(await db().query(`INSERT INTO assets(id,kind,filename,storage_key,mime_type,byte_size,sha256,width,height) VALUES($1,'image',$2,$3,'image/png',$4,$5,1080,1440) ON CONFLICT(storage_key) DO UPDATE SET storage_key=excluded.storage_key RETURNING id`,[randomUUID(),`图文-${index}.png`,key,size,hash])).rows[0];output.push({index,id:asset.id});
|
||||
const asset=(await db().query(`INSERT INTO assets(id,kind,filename,storage_key,mime_type,byte_size,sha256,width,height) VALUES($1,'image',$2,$3,'image/png',$4,$5,1080,1440) ON CONFLICT(storage_key) DO UPDATE SET storage_key=excluded.storage_key RETURNING id`,[randomUUID(),`图文-${index}.png`,key,size,hash])).rows[0];output.push({index,id:asset.id});console.log('Canvas stored',post.slug,index);
|
||||
}
|
||||
await transaction(async c=>{
|
||||
const current=(await c.query('SELECT revision FROM render_jobs WHERE post_id=$1 FOR UPDATE',[job.post_id])).rows[0];
|
||||
|
||||
Reference in New Issue
Block a user