@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
JavaScript
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
});
}
}