import fastify, { FastifyInstance } from "fastify"; import fastifyCookie from "fastify-cookie"; import fastifyFormBody from "fastify-formbody"; import fastifyMultipart from "fastify-multipart"; import { InternalService, Microservice } from "@autoplex/microservice"; import { RouteRegisterFactory, RouteFactory } from "./RouteRegisterFactory"; import { MiddlewareMethod } from "./middleware"; export abstract class WebServerService extends InternalService { /** * The application key to sign cookies with */ protected abstract readonly APP_KEY: string; /** * The port to host the webserver on */ protected abstract readonly PORT: number; /** * The list of routes to register */ protected abstract readonly ROUTES: RouteFactory, M>[]; /** * The internal webserver instance */ protected fastify!: FastifyInstance; /** * Boot the webserver */ public override async boot() { // Create the Fastify instance this.fastify = fastify(); // Install plugins await this.registerPlugins(this.fastify); // Register the routes this.registerRoutes(this.fastify); } /** * Start the webserver */ public override start() { // Start listening this.fastify.listen(this.PORT, "0.0.0.0"); this.log("Webserver listening on port:", this.PORT); } /** * Shutdown the webserver */ public override async shutdown() { this.log("Webserver shutting down"); await this.fastify.close(); } // --------------------------------------------------------------------------------------------- /** * Register required Fastify plugins */ protected async registerPlugins(fastify: FastifyInstance) { return Promise.all([ fastify.register(fastifyCookie, { secret: this.APP_KEY }), fastify.register(fastifyFormBody), fastify.register(fastifyMultipart, { limits: { fileSize: 16*1024*1024, files: 50 } }) ]); } /** * Register all route groups */ protected registerRoutes(fastify: FastifyInstance) { let factory = new RouteRegisterFactory(this, fastify, this.app); for (let group in this.ROUTES) { this.ROUTES[group](factory, this.app); } } }