render in queue
This commit is contained in:
parent
16a700fe56
commit
5eb5413d10
|
@ -4,3 +4,4 @@ export const MAX_SCALE = 40; // 52 in log2
|
||||||
export const TILE_SIZE = 256;
|
export const TILE_SIZE = 256;
|
||||||
export const TILE_ZOOM_LEVEL = 2;
|
export const TILE_ZOOM_LEVEL = 2;
|
||||||
export const BACKGROUND_CLR_RGB = [ 196, 196, 196 ];
|
export const BACKGROUND_CLR_RGB = [ 196, 196, 196 ];
|
||||||
|
export const QUEUE_LIMIT = 3;
|
||||||
|
|
|
@ -2,6 +2,7 @@ import fetch from 'node-fetch';
|
||||||
|
|
||||||
import canvases from './canvases.js';
|
import canvases from './canvases.js';
|
||||||
import renderCanvas from './renderCanvas.js';
|
import renderCanvas from './renderCanvas.js';
|
||||||
|
import { QUEUE_LIMIT } from './constants.js';
|
||||||
|
|
||||||
const linkRegExp = /(#[a-z]*,-?[0-9]*,-?[0-9]*(,-?[0-9]+)?)/gi;
|
const linkRegExp = /(#[a-z]*,-?[0-9]*,-?[0-9]*(,-?[0-9]+)?)/gi;
|
||||||
const linkRegExpFilter = (val, ind) => ((ind % 3) !== 2);
|
const linkRegExpFilter = (val, ind) => ((ind % 3) !== 2);
|
||||||
|
@ -17,8 +18,50 @@ function compArray(arr1, arr2) {
|
||||||
return true;
|
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) {
|
if (!text || !canvases) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -50,9 +93,10 @@ export async function parseCanvasLinks(text) {
|
||||||
) {
|
) {
|
||||||
return;
|
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;
|
return imageData;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user