import { FastifyInstance, BootstrapOptions } from "./types"; import * as IO from "socket.io"; import fastify = require("fastify"); import dotenv = require("dotenv"); import { Plugin } from "./plugin"; import { Controller } from "./controller"; import { Module, DefaultModule } from "./module"; import { Repository } from "./repository"; function registerPlugins(server: FastifyInstance, plugins: Plugin[]) { plugins.forEach(plugin => { server.register(plugin.handler, plugin.options); }); } function registerControllers( server: FastifyInstance, controllers: Controller[] ) { controllers.forEach(controller => { server.register(controller.handler, { prefix: controller.path }); }); } function registerRepositories( server: FastifyInstance, repositories: Repository[] ) { repositories.forEach(repository => { server.register(repository.controller.handler, { prefix: repository.controller.path }); }); } function registerModules( server: FastifyInstance, modules: Module[], wss?: IO.Server ) { modules.forEach(module => { const { plugins, controllers, repositories } = module; if (wss) { registerWebsockets(wss, repositories); } registerPlugins(server, plugins); registerControllers(server, controllers); registerRepositories(server, repositories); }); } function registerWebsockets(wss: IO.Server, repositories: Repository[]) { repositories.forEach(repo => { if (!repo.websocket) { return; } wss.on("connection", socket => { repo.model.findAll().then(all => { socket.emit(`${repo.name}`, all); }); }); }); } function startServer(port: string, server: FastifyInstance) { server.listen(port, error => { if (error) { server.log.error(error); process.exit(1); return; } server.log.info(` > Server running on PORT ${port}`); return; }); } export function bootstrap({ modules }: BootstrapOptions): void { dotenv.config(); const port = process.env.PORT || "3000"; const server = fastify(); const wss = IO(server.server); modules = [DefaultModule, ...modules]; registerModules(server, modules, wss); return startServer(port, server); }