UNPKG

@api.global/typedserver

Version:

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

265 lines 26 kB
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) { var useValue = arguments.length > 2; for (var i = 0; i < initializers.length; i++) { value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg); } return useValue ? value : void 0; }; var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) { function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; } var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value"; var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null; var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {}); var _, done = false; for (var i = decorators.length - 1; i >= 0; i--) { var context = {}; for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p]; for (var p in contextIn.access) context.access[p] = contextIn.access[p]; context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); }; var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context); if (kind === "accessor") { if (result === void 0) continue; if (result === null || typeof result !== "object") throw new TypeError("Object expected"); if (_ = accept(result.get)) descriptor.get = _; if (_ = accept(result.set)) descriptor.set = _; if (_ = accept(result.init)) initializers.unshift(_); } else if (_ = accept(result)) { if (kind === "field") initializers.unshift(_); else descriptor[key] = _; } } if (target) Object.defineProperty(target, contextIn.name, descriptor); done = true; }; import * as plugins from '../plugins.js'; import * as paths from '../paths.js'; /** * Built-in routes controller for TypedServer * Handles robots.txt, manifest.json, sitemap, feed, appversion */ let BuiltInRoutesController = (() => { let _classDecorators = [plugins.smartserve.Route('')]; let _classDescriptor; let _classExtraInitializers = []; let _classThis; let _instanceExtraInitializers = []; let _getRobots_decorators; let _getManifest_decorators; let _getSitemap_decorators; let _getSitemapNews_decorators; let _getFeed_decorators; let _getAppVersion_decorators; let _getSwDash_decorators; let _getSwDashMetrics_decorators; let _getSwDashResources_decorators; let _getSwDashEvents_decorators; let _getSwDashEventsCount_decorators; let _getSwDashCumulativeMetrics_decorators; let _getSwDashSpeedtest_decorators; let _getSwDashBundle_decorators; let _getServiceWorkerBundle_decorators; var BuiltInRoutesController = class { static { _classThis = this; } static { const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0; _getRobots_decorators = [plugins.smartserve.Get('/robots.txt')]; _getManifest_decorators = [plugins.smartserve.Get('/manifest.json')]; _getSitemap_decorators = [plugins.smartserve.Get('/sitemap')]; _getSitemapNews_decorators = [plugins.smartserve.Get('/sitemap-news')]; _getFeed_decorators = [plugins.smartserve.Get('/feed')]; _getAppVersion_decorators = [plugins.smartserve.Get('/appversion')]; _getSwDash_decorators = [plugins.smartserve.Get('/sw-dash')]; _getSwDashMetrics_decorators = [plugins.smartserve.Get('/sw-dash/metrics')]; _getSwDashResources_decorators = [plugins.smartserve.Get('/sw-dash/resources')]; _getSwDashEvents_decorators = [plugins.smartserve.Get('/sw-dash/events')]; _getSwDashEventsCount_decorators = [plugins.smartserve.Get('/sw-dash/events/count')]; _getSwDashCumulativeMetrics_decorators = [plugins.smartserve.Get('/sw-dash/cumulative-metrics')]; _getSwDashSpeedtest_decorators = [plugins.smartserve.Get('/sw-dash/speedtest')]; _getSwDashBundle_decorators = [plugins.smartserve.Get('/sw-dash/bundle.js')]; _getServiceWorkerBundle_decorators = [plugins.smartserve.Get('/serviceworker.bundle.js')]; __esDecorate(this, null, _getRobots_decorators, { kind: "method", name: "getRobots", static: false, private: false, access: { has: obj => "getRobots" in obj, get: obj => obj.getRobots }, metadata: _metadata }, null, _instanceExtraInitializers); __esDecorate(this, null, _getManifest_decorators, { kind: "method", name: "getManifest", static: false, private: false, access: { has: obj => "getManifest" in obj, get: obj => obj.getManifest }, metadata: _metadata }, null, _instanceExtraInitializers); __esDecorate(this, null, _getSitemap_decorators, { kind: "method", name: "getSitemap", static: false, private: false, access: { has: obj => "getSitemap" in obj, get: obj => obj.getSitemap }, metadata: _metadata }, null, _instanceExtraInitializers); __esDecorate(this, null, _getSitemapNews_decorators, { kind: "method", name: "getSitemapNews", static: false, private: false, access: { has: obj => "getSitemapNews" in obj, get: obj => obj.getSitemapNews }, metadata: _metadata }, null, _instanceExtraInitializers); __esDecorate(this, null, _getFeed_decorators, { kind: "method", name: "getFeed", static: false, private: false, access: { has: obj => "getFeed" in obj, get: obj => obj.getFeed }, metadata: _metadata }, null, _instanceExtraInitializers); __esDecorate(this, null, _getAppVersion_decorators, { kind: "method", name: "getAppVersion", static: false, private: false, access: { has: obj => "getAppVersion" in obj, get: obj => obj.getAppVersion }, metadata: _metadata }, null, _instanceExtraInitializers); __esDecorate(this, null, _getSwDash_decorators, { kind: "method", name: "getSwDash", static: false, private: false, access: { has: obj => "getSwDash" in obj, get: obj => obj.getSwDash }, metadata: _metadata }, null, _instanceExtraInitializers); __esDecorate(this, null, _getSwDashMetrics_decorators, { kind: "method", name: "getSwDashMetrics", static: false, private: false, access: { has: obj => "getSwDashMetrics" in obj, get: obj => obj.getSwDashMetrics }, metadata: _metadata }, null, _instanceExtraInitializers); __esDecorate(this, null, _getSwDashResources_decorators, { kind: "method", name: "getSwDashResources", static: false, private: false, access: { has: obj => "getSwDashResources" in obj, get: obj => obj.getSwDashResources }, metadata: _metadata }, null, _instanceExtraInitializers); __esDecorate(this, null, _getSwDashEvents_decorators, { kind: "method", name: "getSwDashEvents", static: false, private: false, access: { has: obj => "getSwDashEvents" in obj, get: obj => obj.getSwDashEvents }, metadata: _metadata }, null, _instanceExtraInitializers); __esDecorate(this, null, _getSwDashEventsCount_decorators, { kind: "method", name: "getSwDashEventsCount", static: false, private: false, access: { has: obj => "getSwDashEventsCount" in obj, get: obj => obj.getSwDashEventsCount }, metadata: _metadata }, null, _instanceExtraInitializers); __esDecorate(this, null, _getSwDashCumulativeMetrics_decorators, { kind: "method", name: "getSwDashCumulativeMetrics", static: false, private: false, access: { has: obj => "getSwDashCumulativeMetrics" in obj, get: obj => obj.getSwDashCumulativeMetrics }, metadata: _metadata }, null, _instanceExtraInitializers); __esDecorate(this, null, _getSwDashSpeedtest_decorators, { kind: "method", name: "getSwDashSpeedtest", static: false, private: false, access: { has: obj => "getSwDashSpeedtest" in obj, get: obj => obj.getSwDashSpeedtest }, metadata: _metadata }, null, _instanceExtraInitializers); __esDecorate(this, null, _getSwDashBundle_decorators, { kind: "method", name: "getSwDashBundle", static: false, private: false, access: { has: obj => "getSwDashBundle" in obj, get: obj => obj.getSwDashBundle }, metadata: _metadata }, null, _instanceExtraInitializers); __esDecorate(this, null, _getServiceWorkerBundle_decorators, { kind: "method", name: "getServiceWorkerBundle", static: false, private: false, access: { has: obj => "getServiceWorkerBundle" in obj, get: obj => obj.getServiceWorkerBundle }, metadata: _metadata }, null, _instanceExtraInitializers); __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers); BuiltInRoutesController = _classThis = _classDescriptor.value; if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata }); __runInitializers(_classThis, _classExtraInitializers); } options = __runInitializers(this, _instanceExtraInitializers); constructor(options) { this.options = options; } async getRobots(ctx) { if (!this.options.robots || !this.options.domain) { throw new plugins.smartserve.RouteNotFoundError(ctx.path, ctx.method); } const robotsContent = [ 'User-agent: *', 'Allow: /', `Sitemap: https://${this.options.domain}/sitemap`, ]; if (this.options.blockWaybackMachine) { robotsContent.push('', 'User-agent: ia_archiver', 'Disallow: /'); } return new Response(robotsContent.join('\n'), { status: 200, headers: { 'Content-Type': 'text/plain' }, }); } async getManifest(ctx) { if (!this.options.manifest) { throw new plugins.smartserve.RouteNotFoundError(ctx.path, ctx.method); } return new Response(this.options.manifest.jsonString(), { status: 200, headers: { 'Content-Type': 'application/json' }, }); } async getSitemap(ctx) { if (!this.options.sitemap || !this.options.domain) { throw new plugins.smartserve.RouteNotFoundError(ctx.path, ctx.method); } const smartsitemap = new plugins.smartsitemap.SmartSitemap(); const urls = this.options.getSitemapUrls(); const sitemapXml = await smartsitemap.createSitemapFromUrlInfoArray(urls); return new Response(sitemapXml, { status: 200, headers: { 'Content-Type': 'application/xml' }, }); } async getSitemapNews(ctx) { if (!this.options.sitemap || !this.options.domain || !this.options.articleGetterFunction) { throw new plugins.smartserve.RouteNotFoundError(ctx.path, ctx.method); } const smartsitemap = new plugins.smartsitemap.SmartSitemap(); const articles = await this.options.articleGetterFunction(); const sitemapNewsXml = await smartsitemap.createSitemapNewsFromArticleArray(articles); return new Response(sitemapNewsXml, { status: 200, headers: { 'Content-Type': 'application/xml' }, }); } async getFeed(ctx) { if (!this.options.feed || !this.options.feedMetadata) { throw new plugins.smartserve.RouteNotFoundError(ctx.path, ctx.method); } const smartfeed = new plugins.smartfeed.Smartfeed(); const articles = this.options.articleGetterFunction ? await this.options.articleGetterFunction() : []; const feedXml = await smartfeed.createFeedFromArticleArray(this.options.feedMetadata, articles); return new Response(feedXml, { status: 200, headers: { 'Content-Type': 'application/atom+xml' }, }); } async getAppVersion(ctx) { if (!this.options.appVersion) { throw new plugins.smartserve.RouteNotFoundError(ctx.path, ctx.method); } return new Response(this.options.appVersion, { status: 200, headers: { 'Content-Type': 'text/plain' }, }); } async getSwDash(ctx) { // Import shared HTML from interfaces const { SW_DASH_HTML } = await import('../../dist_ts_interfaces/serviceworker.js'); return new Response(SW_DASH_HTML, { status: 200, headers: { 'Content-Type': 'text/html' }, }); } // SW-dash data routes - return empty/unavailable when SW isn't active async getSwDashMetrics() { return new Response(JSON.stringify({ error: 'Service worker not active', data: null }), { status: 503, headers: { 'Content-Type': 'application/json' }, }); } async getSwDashResources() { return new Response(JSON.stringify({ error: 'Service worker not active', resources: [], domains: [], contentTypes: [], resourceCount: 0 }), { status: 503, headers: { 'Content-Type': 'application/json' }, }); } async getSwDashEvents() { return new Response(JSON.stringify({ error: 'Service worker not active', events: [], total: 0 }), { status: 503, headers: { 'Content-Type': 'application/json' }, }); } async getSwDashEventsCount() { return new Response(JSON.stringify({ error: 'Service worker not active', count: 0 }), { status: 503, headers: { 'Content-Type': 'application/json' }, }); } async getSwDashCumulativeMetrics() { return new Response(JSON.stringify({ error: 'Service worker not active', data: null }), { status: 503, headers: { 'Content-Type': 'application/json' }, }); } async getSwDashSpeedtest() { return new Response(JSON.stringify({ error: 'Service worker not active - speedtest unavailable' }), { status: 503, headers: { 'Content-Type': 'application/json' }, }); } async getSwDashBundle(ctx) { try { const bundleContent = (await plugins.fsInstance .file(paths.swdashBundlePath) .encoding('utf8') .read()); return new Response(bundleContent, { status: 200, headers: { 'Content-Type': 'text/javascript', 'Cache-Control': 'no-cache', }, }); } catch (error) { console.error('Failed to serve sw-dash bundle:', error); return new Response('SW-Dash bundle not found', { status: 404 }); } } async getServiceWorkerBundle() { try { const bundleContent = (await plugins.fsInstance .file(paths.serviceworkerBundlePath) .encoding('utf8') .read()); return new Response(bundleContent, { status: 200, headers: { 'Content-Type': 'text/javascript', 'Cache-Control': 'no-cache', }, }); } catch (error) { console.error('Failed to serve serviceworker bundle:', error); return new Response('ServiceWorker bundle not found', { status: 404 }); } } }; return BuiltInRoutesController = _classThis; })(); export { BuiltInRoutesController }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5idWlsdGluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvY29udHJvbGxlcnMvY29udHJvbGxlci5idWlsdGluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEtBQUssS0FBSyxNQUFNLGFBQWEsQ0FBQztBQUVyQzs7O0dBR0c7SUFFVSx1QkFBdUI7NEJBRG5DLE9BQU8sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3FDQW1CMUIsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDO3VDQXNCckMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUM7c0NBWXhDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQzswQ0FnQmxDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQzttQ0FnQnZDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQzt5Q0FzQi9CLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQztxQ0FZckMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDOzRDQVdsQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQzs4Q0FRMUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUM7MkNBUTVDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDO2dEQVF6QyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQztzREFRL0MsT0FBTyxDQUFDLFVBQVUsQ0FBQyxH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