UNPKG

@httpc/kit

Version:

httpc toolbox for building function-based API with minimal code and end-to-end type safety

61 lines (60 loc) 2.1 kB
import assert from "assert"; import { createHttpCServer } from "@httpc/server"; import { initializeContainer, RESOLVE } from "./di"; import { container } from "tsyringe"; export class Application { constructor(options) { this.options = options; this._isInitialized = false; this._server = undefined; this._logger = undefined; } get server() { assert(this._server, "Application not initialized"); return this._server; } get logger() { assert(this._logger, "Application not initialized"); return this._logger; } async initialize() { this._server = this._createServer(); await initializeContainer(); this._logger = RESOLVE(container, "ApplicationLogger"); this._isInitialized = true; } getHttpCRequestProcessor() { return this.server.getHttpCRequestProcessor(); } start(port) { assert(this._isInitialized, "Application not initialized"); return new Promise(resolve => { this.server.listen(port ?? this.options.port, resolve); const address = this.server.address(); const listening = typeof address === "string" ? address : address?.port; this.logger.info("Started: listening on %s", listening); }); } async stop(waitPending = false) { await new Promise((resolve, reject) => { if (waitPending) { this.logger.verbose("Stopping: wait for pending connection"); this.server.once("close", resolve); } this.server.close(err => { if (err) reject(err); else if (!waitPending) { resolve(); } }); }); this.logger.info("Stopped"); } _createServer() { return createHttpCServer({ ...this.options, log: false, // disable server logging, as it's handled by application services }); } }