accessibility-checker-api/index.js

95 lines
3.2 KiB
JavaScript
Executable File

const express = require('express');
const puppeteer = require('puppeteer');
const aChecker = require("accessibility-checker");
const uuid = require("uuid");
const { vnu } = require("vnu");
const { exception } = require('console');
async function main() {
delete process.env._JAVA_OPTIONS;
const app = express();
const browser = await puppeteer.launch({
headless: true,
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage',
'--disable-gpu',
((typeof (process.env.http_proxy) !== 'undefined')
? '--proxy-server=' + process.env.http_proxy
: ''),
]
});
app.get('/', async (req, res) => {
const url = String(req.query.url || '');
console.log(`Preparing report for ${url}`);
const page = await browser.newPage();
let code = 200;
let resp = null;
try {
const vnu_promise = vnu(url, {
"also-csheck-css": true,
"also-check-svg": true,
});
let links = null;
let element_count = null;
let results = null;
try {
await page.goto(url, { 'timeout': 30 * 1000, 'waitUntil': 'load' });
const all_hrefs = await page.evaluate(() => Array.from(document.querySelectorAll('a[href]')).map(x => x.href));
const links_mess = all_hrefs.filter(x => x.startsWith('https://') || x.startsWith('http://')).map(x => x.split('#')[0]);
links = Array.from(new Set(links_mess)).sort();
element_count = await page.evaluate(() => document.querySelectorAll('*').length);
const uid = uuid.v4();
const compliance = await aChecker.getCompliance(page, uid);
results = compliance.report.results;
} catch (e) {
code = 500;
if (resp?.type !== 'errors') {
resp = {
type: 'errors',
errors: []
};
}
resp.errors.push({
name: e.name,
message: e.message,
stack: e.stack
});
}
const vnu_report = await vnu_promise;
if (resp === null) {
resp = {
type: 'success',
element_count,
links,
results,
vnu_report,
};
}
} catch (e) {
code = 500;
if (resp?.type !== 'errors') {
resp = {
type: 'errors',
errors: []
};
}
resp.errors.push({
name: e.name,
message: e.message,
stack: e.stack
});
}
await page.close();
console.log(`Returning ${code} for ${url}`);
res.statusCode = code;
res.json(resp);
res.end();
});
app.listen(64161, () => console.log('Listening on http://localhost:64161'));
}
module.exports = {
main
};