You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

91 lines
2.1 KiB

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<M extends Microservice = Microservice> extends InternalService<M>
{
/**
* 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<MiddlewareMethod<any>, 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);
}
}
}