mirror of
https://github.com/engineer-man/piston.git
synced 2025-05-13 15:16:26 +02:00
98 lines
2.7 KiB
JavaScript
98 lines
2.7 KiB
JavaScript
#!/usr/bin/env node
|
|
import { create, setLogLevel } from 'logplease';
|
|
import express from 'express';
|
|
import expressWs from 'express-ws';
|
|
import * as globals from './globals.js';
|
|
import config from './config.js';
|
|
import { join } from 'path';
|
|
import { readdir } from 'node:fs/promises';
|
|
import { existsSync, mkdirSync, chmodSync } from 'node:fs';
|
|
import bodyParser from 'body-parser';
|
|
import { load_package } from './runtime.js';
|
|
|
|
const logger = create('index', {});
|
|
const app = express();
|
|
expressWs(app);
|
|
|
|
(async () => {
|
|
logger.info('Setting loglevel to');
|
|
setLogLevel(config.log_level);
|
|
logger.debug('Ensuring data directories exist');
|
|
|
|
Object.values(globals.data_directories).forEach(dir => {
|
|
let data_path = join(config.data_directory, dir);
|
|
|
|
logger.debug(`Ensuring ${data_path} exists`);
|
|
|
|
if (!existsSync(data_path)) {
|
|
logger.info(`${data_path} does not exist.. Creating..`);
|
|
|
|
try {
|
|
mkdirSync(data_path);
|
|
} catch (e) {
|
|
logger.error(`Failed to create ${data_path}: `, e.message);
|
|
}
|
|
}
|
|
});
|
|
chmodSync(
|
|
join(config.data_directory, globals.data_directories.jobs),
|
|
0o711
|
|
);
|
|
|
|
logger.info('Loading packages');
|
|
const pkgdir = join(
|
|
config.data_directory,
|
|
globals.data_directories.packages
|
|
);
|
|
|
|
const pkglist = await readdir(pkgdir);
|
|
|
|
const languages = await Promise.all(
|
|
pkglist.map(async lang => {
|
|
const x = await readdir(join(pkgdir, lang));
|
|
return x.map(y => join(pkgdir, lang, y));
|
|
})
|
|
);
|
|
|
|
const installed_languages = languages
|
|
.flat()
|
|
.filter(pkg => existsSync(join(pkg, globals.pkg_installed_file)));
|
|
|
|
installed_languages.forEach(pkg => load_package(pkg));
|
|
|
|
logger.info('Starting API Server');
|
|
logger.debug('Constructing Express App');
|
|
logger.debug('Registering middleware');
|
|
|
|
app.use(bodyParser.urlencoded({ extended: true }));
|
|
app.use(bodyParser.json());
|
|
|
|
app.use(
|
|
(
|
|
err: Error,
|
|
req: express.Request,
|
|
res: express.Response,
|
|
next: express.NextFunction
|
|
) => {
|
|
return res.status(400).send({
|
|
stack: err.stack,
|
|
});
|
|
}
|
|
);
|
|
|
|
logger.debug('Registering Routes');
|
|
|
|
const api_v2 = (await import('./api/v2.js')).default;
|
|
app.use('/api/v2', api_v2);
|
|
|
|
app.use((req, res, next) => {
|
|
return res.status(404).send({ message: 'Not Found' });
|
|
});
|
|
|
|
logger.debug('Calling app.listen');
|
|
const [address, port] = config.bind_address.split(':');
|
|
|
|
app.listen(+port, address, () => {
|
|
logger.info('API server started on', config.bind_address);
|
|
});
|
|
})();
|