UNPKG

server-ssl

Version:

Node.js server that is SSL by default that can be used for development or production and can create and renew Lets Encrypt Certificates automatically using ACME, including wildcard certificates

46 lines (36 loc) 1.82 kB
import { fileURLToPath } from 'url'; import { join, extname as _extname, dirname } from 'path'; import { createServer as createServerHTTPS } from 'https'; import { STATE } from './ssl/state.js'; import { Api, Endpoint } from 'simple-api-router'; STATE.importRequiredArguments(dirname(fileURLToPath(import.meta.url))); const API = new Api("/api/"); const CONTENT_TYPES = { '.css': 'text/css', '.js': 'text/javascript', '.json': 'application/json', '.png': 'image/png', '.jpg': 'image/jpg', '.gif': 'image/gif', '.svg': 'image/svg+xml', '.ico': 'image/x-icon', }; API.addEndpoint(new Endpoint("time", "GET", (req, res) => { return STATE.respondWithContent(res, Date.now().toString(), STATE.TEXT_HTML); })); const HTTPS_SERVER = createServerHTTPS(STATE.loadDefaultSecureContext(), (req, res) => { //const host = req.headers.host; // e.g., api.example.com let route = undefined; if (req.url === STATE.WEBSITE_ROOT) { route = STATE.optEntry; } else if (API.checkFindExecute(req, res)) { return; } route == undefined && (route = req.url); // no route, follow the url STATE.defaultFileHandling(res, STATE.finishRoute(route), CONTENT_TYPES); }).on('error', (e) => e.code === STATE.ADDR_IN_USE && console.error(`${STATE.optPort}${STATE.IN_USE}`)).listen(STATE.optPort, (err) => err ? console.error(STATE.ERROR_STARTING, err) : console.log(`${STATE.STARTED_HTTPS}${STATE.optPort}`)); STATE.startHttpChallengeListener(); // Lets Encrypt! HTTP-01 ACME Challenge Mixin - Always Redirects HTTP to HTTPS unless doing a ACME Challenge STATE.loadLetsEncryptAcmeDaemon(() => { STATE.loadNewSecureContext(HTTPS_SERVER); }); // ^^ Update Certificates Callback STATE.checkNodeForUpdates(); // Check Node.js version