import * as plugins from './nullresolve.plugins.js'; import { projectinfo } from './nullresolve.projectinfo.js'; import { configObject } from './nullresolve.config.js'; export class NullResolve { public serviceServer: plugins.typedserver.utilityservers.UtilityServiceServer; constructor() { this.serviceServer = new plugins.typedserver.utilityservers.UtilityServiceServer({ serviceDomain: 'nullresolve.lossless.one', serviceName: 'nullresolve', serviceVersion: projectinfo.npm.version, addCustomRoutes: async (serverArg) => { serverArg.addRoute( '/status/:code', new plugins.typedserver.servertools.Handler('GET', async (req, res) => { let infoHtmlOptions: plugins.typedserverInfoHtml.IHtmlInfoOptions; switch (req.params.code) { case 'ipblock': infoHtmlOptions = { title: 'Lossless Network: Blocked IP', heading: 'Blocked IP', text: 'Your IP (::CLIENT_IP::) is not allowed to access this ressource.', sentryDsn: configObject.sentryDsn, sentryMessage: 'ipblock', redirectTo: 'https://lossless.com', }; break; case 'firewall': infoHtmlOptions = { title: 'Lossless Network: Firewall', heading: 'Firewall', text: 'Your request has been blocked by our firewall since it showed possibly harmful behaviour.', sentryDsn: configObject.sentryDsn, sentryMessage: 'firewall', redirectTo: 'https://lossless.com', }; break; case '500class': infoHtmlOptions = { title: 'Lossless Network: 5xx', heading: '5xx', text: '::CLOUDFLARE_ERROR_500S_BOX::', sentryDsn: configObject.sentryDsn, sentryMessage: '5xx error', redirectTo: 'https://lossless.com', }; break; case '1000class': infoHtmlOptions = { title: 'Lossless Network: DNS Resolution failed', heading: '1xxx', text: '::CLOUDFLARE_ERROR_1000S_BOX::', sentryDsn: configObject.sentryDsn, sentryMessage: '1000 class error', redirectTo: 'https://lossless.com', }; break; case 'alwaysonline': infoHtmlOptions = { title: 'Lossless Network: No Cache', heading: 'No Cache', text: '::ALWAYS_ONLINE_NO_COPY_BOX::', sentryDsn: configObject.sentryDsn, sentryMessage: 'alwaysonline triggered. Potentially offline!', redirectTo: 'https://lossless.com', }; break; case 'waf': infoHtmlOptions = { title: 'Lossless Network: Firewall Challenge', heading: 'Firewall Challenge', text: '::CAPTCHA_BOX::', redirectTo: 'https://lossless.com', }; break; case 'country': infoHtmlOptions = { title: 'Lossless Network: Country Challenge', heading: 'Country Challenge', text: '::CAPTCHA_BOX::', redirectTo: 'https://lossless.com', }; break; case 'attack': infoHtmlOptions = { title: 'Lossless Network: Advanced User Challenge', heading: 'Advanced User Challenge', text: '::IM_UNDER_ATTACK_BOX::', redirectTo: 'https://lossless.com', }; break; default: const statusInstance = plugins.smartstatus.HttpStatus.getHttpStatusByString( req.params.code, ); infoHtmlOptions = { title: `Lossless Network: ${statusInstance.code.toString()}`, heading: statusInstance.code.toString(), text: statusInstance.text, }; break; } const infoHtmlInstance = await plugins.typedserverInfoHtml.InfoHtml.fromOptions(infoHtmlOptions); res.status(200); res.send(infoHtmlInstance.htmlString); }), ); serverArg.addRoute( '/custom', new plugins.typedserver.servertools.Handler('GET', async (req, res) => { console.log(req.query); const options: any = { title: 'Lossless Network', heading: 'Error!', text: 'Please wait...', redirectTo: 'https://lossless.com', ...req.query, }; const infoHtmlInstance = await plugins.typedserverInfoHtml.InfoHtml.fromOptions({ title: decodeURI(options.title), heading: decodeURI(options.heading), text: decodeURI(options.text), redirectTo: decodeURI(options.redirectTo), sentryDsn: configObject.sentryDsn, sentryMessage: `nullresolve custom: ${decodeURI(options.title)}`, }); res.status(200); res.send(infoHtmlInstance.htmlString); }), ); }, }); } public async start() { await this.serviceServer.start(); } public async stop() { await this.serviceServer.stop(); } }