Fix unfurler language support
This commit is contained in:
@@ -4,6 +4,7 @@ import * as http from 'http';
|
||||
import config from './config';
|
||||
import { Cluster } from 'puppeteer-cluster';
|
||||
import ReusablePage from './concurrency/ReusablePage';
|
||||
import { parseLanguageUrl } from './language/lang';
|
||||
const puppeteerConfig = require('../puppeteer.config.json');
|
||||
|
||||
if (config.PUPPETEER.EXEC_PATH) {
|
||||
@@ -46,6 +47,8 @@ class Server {
|
||||
this.server.listen(config.SERVER.HTTP_PORT, () => {
|
||||
console.log(`Mempool Unfurl Server is running on port ${config.SERVER.HTTP_PORT}`);
|
||||
});
|
||||
|
||||
this.initClusterPages();
|
||||
}
|
||||
|
||||
async stopServer() {
|
||||
@@ -63,9 +66,24 @@ class Server {
|
||||
this.app.get('*', (req, res) => { return this.renderHTML(req, res) })
|
||||
}
|
||||
|
||||
async initClusterPages() {
|
||||
for (let i = 0; i < config.PUPPETEER.CLUSTER_SIZE; i++) {
|
||||
this.cluster?.execute({ action: 'init' });
|
||||
}
|
||||
}
|
||||
|
||||
async clusterTask({ page, data: { url, path, action } }) {
|
||||
if (action === 'init') {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
if (action === 'screenshot' || action === 'html') {
|
||||
const urlParts = parseLanguageUrl(path);
|
||||
if (page.language !== urlParts.lang) {
|
||||
// switch language
|
||||
page.language = urlParts.lang;
|
||||
const localizedUrl = urlParts.lang ? `${this.mempoolHost}/${urlParts.lang}${urlParts.path}` : `${this.mempoolHost}${urlParts.path}` ;
|
||||
await page.goto(localizedUrl, { waitUntil: "load" });
|
||||
} else {
|
||||
const loaded = await page.evaluate(async (path) => {
|
||||
if (window['ogService']) {
|
||||
window['ogService'].loadPage(path);
|
||||
@@ -73,26 +91,21 @@ class Server {
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}, path)
|
||||
|
||||
}, urlParts.path);
|
||||
if (!loaded) {
|
||||
throw new Error('failed to access open graph service');
|
||||
}
|
||||
}
|
||||
|
||||
if (action === 'screenshot') {
|
||||
const waitForReady = await page.$('meta[property="og:preview:loading"]');
|
||||
const alreadyReady = await page.$('meta[property="og:preview:ready"]');
|
||||
if (waitForReady != null && alreadyReady == null) {
|
||||
await page.waitForSelector('meta[property="og:preview:ready"]', { timeout: 8000 });
|
||||
}
|
||||
return page.screenshot();
|
||||
} else if (action === 'html') {
|
||||
const alreadyReady = await page.$('meta[property="og:meta:ready"]');
|
||||
if (alreadyReady == null) {
|
||||
await page.waitForSelector('meta[property="og:meta:ready"]', { timeout: 8000 });
|
||||
}
|
||||
return page.content();
|
||||
if (action === 'screenshot') {
|
||||
const waitForReady = await page.$('meta[property="og:preview:loading"]');
|
||||
if (waitForReady != null) {
|
||||
await page.waitForSelector('meta[property="og:preview:ready"]', { timeout: 3000 });
|
||||
}
|
||||
return page.screenshot();
|
||||
} else if (action === 'html') {
|
||||
await page.waitForSelector('meta[property="og:meta:ready"]', { timeout: 3000 });
|
||||
return page.content();
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(`failed to render page for ${action}`, e instanceof Error ? e.message : e);
|
||||
@@ -102,13 +115,13 @@ class Server {
|
||||
|
||||
async renderPreview(req, res) {
|
||||
try {
|
||||
// strip default language code for compatibility
|
||||
const path = req.params[0].replace('/en/', '/');
|
||||
const path = req.params[0]
|
||||
const img = await this.cluster?.execute({ url: this.mempoolHost + path, path: path, action: 'screenshot' });
|
||||
|
||||
if (!img) {
|
||||
throw new Error('failed to render preview image');
|
||||
}
|
||||
|
||||
res.contentType('image/png');
|
||||
res.send(img);
|
||||
} catch (e) {
|
||||
@@ -127,10 +140,7 @@ class Server {
|
||||
}
|
||||
|
||||
try {
|
||||
// strip default language code for compatibility
|
||||
const path = req.params[0].replace('/en/', '/');
|
||||
|
||||
let html = await this.cluster?.execute({ url: this.mempoolHost + req.params[0], path: req.params[0], action: 'html' });
|
||||
let html = await this.cluster?.execute({ url: this.mempoolHost + path, path: path, action: 'html' });
|
||||
if (!html) {
|
||||
throw new Error('failed to render preview image');
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user