UNPKG

@api.global/typedserver

Version:

A TypeScript-based project for easy serving of static files with support for live reloading, compression, and typed requests.

112 lines 9.05 kB
import * as interfaces from '../../dist_ts_interfaces/index.js'; import { TypedServer } from '../classes.typedserver.js'; import * as plugins from '../plugins.js'; /** * the utility website server implements a best practice server for websites * It supports: * * live reload * * serviceworker * * pwa manifest */ export class UtilityWebsiteServer { options; typedserver; typedrouter = new plugins.typedrequest.TypedRouter(); constructor(optionsArg) { this.options = optionsArg; } /** * Start the website server */ async start(portArg) { const port = portArg ?? this.options.port ?? 3000; this.typedserver = new TypedServer({ // Core settings cors: this.options.cors ?? true, serveDir: this.options.serveDir, domain: this.options.domain, port, // Development features injectReload: true, watch: true, // SPA support (enabled by default for modern web apps) spaFallback: this.options.spaFallback ?? true, // Security forceSsl: this.options.forceSsl ?? false, securityHeaders: this.options.securityHeaders, // Compression compression: this.options.compression, // PWA manifest manifest: { name: this.options.domain, short_name: this.options.domain, start_url: '/', display_override: ['window-controls-overlay'], lang: 'en', background_color: '#000000', scope: '/', }, // SEO features robots: true, sitemap: true, feedMetadata: this.options.feedMetadata, }); let lswData = { appHash: 'xxxxxx', appSemVer: this.options.appSemVer || 'x.x.x', }; // -> Service worker version info handler this.typedserver.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('serviceworker_versionInfo', async () => { return lswData; })); // ads.txt handler (only if configured) if (this.options.adsTxt && this.options.adsTxt.length > 0) { this.typedserver.addRoute('/ads.txt', 'GET', async () => { const adsTxt = this.options.adsTxt.join('\n') + '\n'; return new Response(adsTxt, { status: 200, headers: { 'Content-Type': 'text/plain' }, }); }); } // Asset broker manifest handler this.typedserver.addRoute('/assetbroker/manifest/:manifestAsset', 'GET', async (ctx) => { let manifestAssetName = ctx.params?.manifestAsset; if (manifestAssetName === 'favicon.png') { manifestAssetName = `favicon_${this.options.domain .replace('.', '') .replace('losslesscom', 'lossless')}@2x_transparent.png`; } const fullOriginAssetUrl = `https://assetbroker.lossless.one/brandfiles/00general/${manifestAssetName}`; console.log(`Getting ${manifestAssetName} from ${fullOriginAssetUrl}`); const smartRequest = plugins.smartrequest.SmartRequest.create(); const response = await smartRequest.url(fullOriginAssetUrl).get(); const arrayBuffer = await response.arrayBuffer(); return new Response(arrayBuffer, { status: 200, headers: { 'Content-Type': 'image/png' }, }); }); // Add any custom routes if (this.options.addCustomRoutes) { await this.options.addCustomRoutes(this.typedserver); } // Subscribe to serve directory hash changes this.typedserver.serveDirHashSubject.subscribe((appHash) => { lswData = { appHash, appSemVer: '1.0.0', }; }); // Setup the typedrouter chain this.typedserver.typedrouter.addTypedRouter(this.typedrouter); // Start everything console.log('routes are all set. Starting up now!'); await this.typedserver.start(); console.log('typedserver started!'); } async stop() { await this.typedserver.stop(); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy53ZWJzaXRlc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvdXRpbGl0eXNlcnZlcnMvY2xhc3Nlcy53ZWJzaXRlc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxVQUFVLE1BQU0sbUNBQW1DLENBQUM7QUFDaEUsT0FBTyxFQUE4QyxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRyxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQTZCekM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFPLG9CQUFvQjtJQUN4QixPQUFPLENBQTBDO0lBQ2pELFdBQVcsQ0FBYztJQUN6QixXQUFXLEdBQUcsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRTVELFlBQVksVUFBbUQ7UUFDN0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUM7SUFDNUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFnQjtRQUNqQyxNQUFNLElBQUksR0FBRyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDO1FBRWxELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUM7WUFDakMsZ0JBQWdCO1lBQ2hCLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJO1lBQy9CLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVE7WUFDL0IsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTTtZQUMzQixJQUFJO1lBRUosdUJBQXVCO1lBQ3ZCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLEtBQUssRUFBRSxJQUFJO1lBRVgsdURBQXVEO1lBQ3ZELFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsSUFBSSxJQUFJO1lBRTdDLFdBQVc7WUFD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