render in queue

This commit is contained in:
HF 2023-05-30 19:47:55 +02:00
parent 16a700fe56
commit 5eb5413d10
2 changed files with 49 additions and 4 deletions

View File

@ -4,3 +4,4 @@ export const MAX_SCALE = 40; // 52 in log2
export const TILE_SIZE = 256;
export const TILE_ZOOM_LEVEL = 2;
export const BACKGROUND_CLR_RGB = [ 196, 196, 196 ];
export const QUEUE_LIMIT = 3;

View File

@ -2,6 +2,7 @@ import fetch from 'node-fetch';
import canvases from './canvases.js';
import renderCanvas from './renderCanvas.js';
import { QUEUE_LIMIT } from './constants.js';
const linkRegExp = /(#[a-z]*,-?[0-9]*,-?[0-9]*(,-?[0-9]+)?)/gi;
const linkRegExpFilter = (val, ind) => ((ind % 3) !== 2);
@ -17,8 +18,50 @@ function compArray(arr1, arr2) {
return true;
}
export async function parseCanvasLinks(text) {
/*
* render canvas snapshots sequentially in a queue,
* don't repeat most recent render
*/
const queue = [];
let rendering = false;
let lastTitle = '';
async function render() {
if (!queue.length) {
rendering = false;
return;
}
rendering = true;
const [args, resolve, reject] = queue.shift();
try {
const ret = await renderCanvas(...args);
resolve(ret);
setTimeout(render, 100);
} catch (err) {
reject(err)
}
}
function renderCanvasQueue(...args) {
if (queue.length >= QUEUE_LIMIT || args[0] === lastTitle) {
return null;
}
return new Promise((resolve, reject) => {
lastTitle = args[0];
queue.push([args, resolve, reject]);
if (!rendering) {
setImmediate(render);
}
});
}
/**
* check if canvas link is in message and return screenshot of the
* current canvas if so
* @param text message text
* @return object with image, name, type, w, h, size
*/
export async function parseCanvasLinks(text) {
if (!text || !canvases) {
return null;
}
@ -50,9 +93,10 @@ export async function parseCanvasLinks(text) {
) {
return;
}
console.log(`Fetch canvas ${canvas.title} on ${x}/${y} with zoom ${z}`);
const imageData = await renderCanvas(canvas, x, y, z);
const title = `${canvas.title}_${x}_${y}_${z}`;
console.log(`Fetch canvas ${title}`);
const imageData = await renderCanvasQueue(title, canvas, x, y, z);
return imageData;
}