kool-koala 1.6.2 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,11 @@
1
1
  import { ControllerConstructor } from "../controllers";
2
- import { AuthenticableEntity } from "../types";
2
+ import { AuthenticableEntity, Context } from "../types";
3
3
  import { StringEnum } from "../types/common/string-enum";
4
4
  import { JwtConfigurationParameters } from "./jwt-configuration-parameters";
5
5
  import { DatabaseConfigurationParamters } from "./database-configuration-paramters";
6
6
  import { RepositoryBase } from "../database";
7
7
  import { StaticFilesConfigurationParameters } from "./static-files-configuration-parameters";
8
+ import { Next } from "koa";
8
9
  export interface ConfigurationParameters<U extends AuthenticableEntity = AuthenticableEntity, P extends StringEnum = {}> {
9
10
  port: number;
10
11
  controllers?: (ControllerConstructor)[];
@@ -14,4 +15,5 @@ export interface ConfigurationParameters<U extends AuthenticableEntity = Authent
14
15
  permissionType?: P;
15
16
  restPrefix?: string;
16
17
  staticFiles?: StaticFilesConfigurationParameters[];
18
+ middlewares?: ((context: Context, next: Next) => Promise<void>)[];
17
19
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/../src/common/configuration-parameters.ts"],"names":[],"mappings":"","file":"configuration-parameters.js","sourcesContent":["import { ControllerConstructor } from \"../controllers\";\nimport { AuthenticableEntity } from \"../types\";\nimport { StringEnum } from \"../types/common/string-enum\";\nimport { JwtConfigurationParameters } from \"./jwt-configuration-parameters\";\nimport { DatabaseConfigurationParamters } from \"./database-configuration-paramters\";\nimport { RepositoryBase } from \"../database\";\nimport { StaticFilesConfigurationParameters } from \"./static-files-configuration-parameters\";\n\nexport interface ConfigurationParameters<\n U extends AuthenticableEntity = AuthenticableEntity,\n P extends StringEnum = {}\n> {\n port: number,\n controllers?: (ControllerConstructor)[],\n database?: DatabaseConfigurationParamters,\n jwt?: JwtConfigurationParameters,\n userRepository?: RepositoryBase<U>,\n permissionType?: P,\n restPrefix?: string,\n staticFiles?: StaticFilesConfigurationParameters[]\n}\n"]}
1
+ {"version":3,"sources":["../src/../src/common/configuration-parameters.ts"],"names":[],"mappings":"","file":"configuration-parameters.js","sourcesContent":["import { ControllerConstructor } from \"../controllers\";\nimport { AuthenticableEntity, Context } from \"../types\";\nimport { StringEnum } from \"../types/common/string-enum\";\nimport { JwtConfigurationParameters } from \"./jwt-configuration-parameters\";\nimport { DatabaseConfigurationParamters } from \"./database-configuration-paramters\";\nimport { RepositoryBase } from \"../database\";\nimport { StaticFilesConfigurationParameters } from \"./static-files-configuration-parameters\";\nimport { Next } from \"koa\";\n\nexport interface ConfigurationParameters<\n U extends AuthenticableEntity = AuthenticableEntity,\n P extends StringEnum = {}\n> {\n port: number,\n controllers?: (ControllerConstructor)[],\n database?: DatabaseConfigurationParamters,\n jwt?: JwtConfigurationParameters,\n userRepository?: RepositoryBase<U>,\n permissionType?: P,\n restPrefix?: string,\n staticFiles?: StaticFilesConfigurationParameters[]\n middlewares?: ((context: Context, next: Next) => Promise<void>)[];\n}\n"]}
@@ -14,4 +14,5 @@ export declare class Configuration<U extends AuthenticableEntity, P extends Stri
14
14
  getPermissionType(): P;
15
15
  getRestPrefix(): string;
16
16
  getStaticFilesConfiguration(): import("./static-files-configuration-parameters").StaticFilesConfigurationParameters[];
17
+ getMiddlewares(): ((context: import("..").Context, next: import("koa").Next) => Promise<void>)[];
17
18
  }
@@ -33,6 +33,9 @@ class Configuration {
33
33
  getStaticFilesConfiguration() {
34
34
  return this.parameters.staticFiles;
35
35
  }
36
+ getMiddlewares() {
37
+ return this.parameters.middlewares;
38
+ }
36
39
  }
37
40
  exports.Configuration = Configuration;
38
41
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/../src/common/configuration.ts"],"names":[],"mappings":";;;AAKA,MAAa,aAAa;IAIxB,YACU,UAAyC;QAAzC,eAAU,GAAV,UAAU,CAA+B;IAC/C,CAAC;IACL,MAAM,CAAC,WAAW,CAGhB,uBAAsD;QACtD,OAAO,IAAI,aAAa,CACtB,uBAAuB,CACxB,CAAC;IACJ,CAAC;IACD,cAAc;QACZ,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;IACrC,CAAC;IACD,WAAW;QACT,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;IAClC,CAAC;IACD,OAAO;QACL,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;IAC9B,CAAC;IACD,gBAAgB;QACd,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;IAC7B,CAAC;IACD,iBAAiB;QACf,OAAO,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;IACxC,CAAC;IACD,iBAAiB;QACf,OAAO,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;IACxC,CAAC;IACD,aAAa;;QACX,OAAO,MAAA,IAAI,CAAC,UAAU,CAAC,UAAU,mCAAI,MAAM,CAAC;IAC9C,CAAC;IACD,2BAA2B;QACzB,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;IACrC,CAAC;CACF;AAvCD,sCAuCC","file":"configuration.js","sourcesContent":["import { AuthenticableEntity } from \"../types/entities/authenticable-entity\";\nimport { ConfigurationParameters } from \"./configuration-parameters\";\nimport { StringEnum } from \"../types/common/string-enum\";\nimport { JwtConfigurationParameters } from \"./jwt-configuration-parameters\";\n\nexport class Configuration<\n U extends AuthenticableEntity,\n P extends StringEnum\n> {\n constructor(\n private parameters: ConfigurationParameters<U, P>\n ) { }\n static instantiate<\n T extends AuthenticableEntity,\n Q extends StringEnum\n >(configurationParameters: ConfigurationParameters<T, Q>): Configuration<T, Q> {\n return new Configuration<T, Q>(\n configurationParameters\n );\n }\n getControllers() {\n return this.parameters.controllers;\n }\n getDatabase() {\n return this.parameters.database;\n }\n getPort(): number {\n return this.parameters.port;\n }\n getJwtParameters(): JwtConfigurationParameters {\n return this.parameters.jwt;\n }\n getUserRepository() {\n return this.parameters.userRepository;\n }\n getPermissionType() {\n return this.parameters.permissionType;\n }\n getRestPrefix() {\n return this.parameters.restPrefix ?? '/api';\n }\n getStaticFilesConfiguration() {\n return this.parameters.staticFiles;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/../src/common/configuration.ts"],"names":[],"mappings":";;;AAKA,MAAa,aAAa;IAIxB,YACU,UAAyC;QAAzC,eAAU,GAAV,UAAU,CAA+B;IAC/C,CAAC;IACL,MAAM,CAAC,WAAW,CAGhB,uBAAsD;QACtD,OAAO,IAAI,aAAa,CACtB,uBAAuB,CACxB,CAAC;IACJ,CAAC;IACD,cAAc;QACZ,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;IACrC,CAAC;IACD,WAAW;QACT,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;IAClC,CAAC;IACD,OAAO;QACL,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;IAC9B,CAAC;IACD,gBAAgB;QACd,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;IAC7B,CAAC;IACD,iBAAiB;QACf,OAAO,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;IACxC,CAAC;IACD,iBAAiB;QACf,OAAO,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;IACxC,CAAC;IACD,aAAa;;QACX,OAAO,MAAA,IAAI,CAAC,UAAU,CAAC,UAAU,mCAAI,MAAM,CAAC;IAC9C,CAAC;IACD,2BAA2B;QACzB,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;IACrC,CAAC;IACD,cAAc;QACZ,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;IACrC,CAAC;CACF;AA1CD,sCA0CC","file":"configuration.js","sourcesContent":["import { AuthenticableEntity } from \"../types/entities/authenticable-entity\";\nimport { ConfigurationParameters } from \"./configuration-parameters\";\nimport { StringEnum } from \"../types/common/string-enum\";\nimport { JwtConfigurationParameters } from \"./jwt-configuration-parameters\";\n\nexport class Configuration<\n U extends AuthenticableEntity,\n P extends StringEnum\n> {\n constructor(\n private parameters: ConfigurationParameters<U, P>\n ) { }\n static instantiate<\n T extends AuthenticableEntity,\n Q extends StringEnum\n >(configurationParameters: ConfigurationParameters<T, Q>): Configuration<T, Q> {\n return new Configuration<T, Q>(\n configurationParameters\n );\n }\n getControllers() {\n return this.parameters.controllers;\n }\n getDatabase() {\n return this.parameters.database;\n }\n getPort(): number {\n return this.parameters.port;\n }\n getJwtParameters(): JwtConfigurationParameters {\n return this.parameters.jwt;\n }\n getUserRepository() {\n return this.parameters.userRepository;\n }\n getPermissionType() {\n return this.parameters.permissionType;\n }\n getRestPrefix() {\n return this.parameters.restPrefix ?? '/api';\n }\n getStaticFilesConfiguration() {\n return this.parameters.staticFiles;\n }\n getMiddlewares() {\n return this.parameters.middlewares;\n }\n}\n"]}
@@ -24,8 +24,9 @@ export declare class KoalApp<U extends AuthenticableEntity, P extends StringEnum
24
24
  setupDatabaseConnection(): Promise<void>;
25
25
  setupErrorHandler(): void;
26
26
  setupTransaction(): void;
27
- registerStaticFileServerMiddleware(): void;
28
27
  registerEndpoints(): void;
28
+ registerStaticFileServerMiddleware(): void;
29
+ registerMiddlewaresFromConfiguration(): void;
29
30
  start(callback?: (configuration: Configuration<U, P>) => void): Promise<void>;
30
31
  stop(): Promise<void>;
31
32
  authorizationHeaderParser(context: Context, next: Next): Promise<void>;
package/common/koalapp.js CHANGED
@@ -19,7 +19,6 @@ const status_code_1 = require("./status-code");
19
19
  const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
20
20
  const koa_bodyparser_1 = __importDefault(require("koa-bodyparser"));
21
21
  const types_1 = require("../types");
22
- const koa_static_1 = __importDefault(require("koa-static"));
23
22
  const path_1 = __importDefault(require("path"));
24
23
  const fs_1 = __importDefault(require("fs"));
25
24
  const error_handler_middleware_1 = require("../middlewares/error-handler-middleware");
@@ -66,6 +65,8 @@ class KoalApp {
66
65
  console.log("Authorization header parser initialized.");
67
66
  this.koa.use((0, koa_bodyparser_1.default)());
68
67
  console.log("Body parser initialized.");
68
+ this.registerMiddlewaresFromConfiguration();
69
+ console.log("Middlewares registered from configuration.");
69
70
  this.registerEndpoints();
70
71
  console.log("Endpoints registered.");
71
72
  this.registerStaticFileServerMiddleware();
@@ -91,34 +92,62 @@ class KoalApp {
91
92
  setupTransaction() {
92
93
  this.koa.use(transaction_middleware_1.transactionMiddleware);
93
94
  }
94
- registerStaticFileServerMiddleware() {
95
- if (!this.configuration.getStaticFilesConfiguration()) {
96
- return;
97
- }
98
- for (const staticFilesConfig of this.configuration.getStaticFilesConfiguration()) {
99
- const staticFilesPath = path_1.default.isAbsolute(staticFilesConfig.folder) ? staticFilesConfig.folder : path_1.default.join(path_1.default.dirname(require.main.filename), staticFilesConfig.folder);
100
- console.log(`Serving files from: ${staticFilesPath}`);
101
- this.koa.use((0, koa_static_1.default)(staticFilesPath));
102
- this.koa.use((ctx, next) => __awaiter(this, void 0, void 0, function* () {
103
- var _a, _b;
104
- console.log(`Request received for static file: ${ctx.request.path}`);
105
- const requestPath = ctx.request.path;
106
- if (!requestPath.startsWith(this.configuration.getRestPrefix()) && !/\.[a-z]+$/.test(requestPath)) {
107
- ctx.type = (_a = staticFilesConfig.defaultFileMimeType) !== null && _a !== void 0 ? _a : 'html';
108
- ctx.body = fs_1.default.createReadStream(path_1.default.join(staticFilesPath, (_b = staticFilesConfig.defaultFile) !== null && _b !== void 0 ? _b : 'index.html'));
109
- }
110
- else {
111
- yield next();
112
- }
113
- }));
114
- }
115
- }
116
95
  registerEndpoints() {
117
96
  this.routerService = new router_service_1.RouterService(this.configuration.getControllers());
118
97
  this.koa
119
98
  .use(this.routerService.getRoutes())
120
99
  .use(this.routerService.allowedMethods());
121
100
  }
101
+ registerStaticFileServerMiddleware() {
102
+ const configs = this.configuration.getStaticFilesConfiguration();
103
+ if (!configs)
104
+ return;
105
+ this.koa.use((ctx, next) => __awaiter(this, void 0, void 0, function* () {
106
+ var _a, _b;
107
+ const requestPath = ctx.request.path.replace(/^\//, "");
108
+ let fileServed = false;
109
+ for (const staticFilesConfig of configs) {
110
+ const staticFilesPath = path_1.default.isAbsolute(staticFilesConfig.folder)
111
+ ? staticFilesConfig.folder
112
+ : path_1.default.join(path_1.default.dirname(require.main.filename), staticFilesConfig.folder);
113
+ console.log(`Checking static files in: ${staticFilesPath}`);
114
+ const filePath = path_1.default.join(staticFilesPath, requestPath);
115
+ if (fs_1.default.existsSync(filePath) && fs_1.default.statSync(filePath).isFile()) {
116
+ ctx.type = path_1.default.extname(filePath).slice(1) || "application/octet-stream";
117
+ const stat = fs_1.default.statSync(filePath);
118
+ ctx.set("Content-Length", stat.size.toString());
119
+ ctx.body = fs_1.default.createReadStream(filePath);
120
+ fileServed = true;
121
+ break;
122
+ }
123
+ }
124
+ if (!fileServed) {
125
+ for (const staticFilesConfig of configs) {
126
+ const staticFilesPath = path_1.default.isAbsolute(staticFilesConfig.folder)
127
+ ? staticFilesConfig.folder
128
+ : path_1.default.join(path_1.default.dirname(require.main.filename), staticFilesConfig.folder);
129
+ const defaultFile = (_a = staticFilesConfig.defaultFile) !== null && _a !== void 0 ? _a : "index.html";
130
+ const defaultFilePath = path_1.default.join(staticFilesPath, defaultFile);
131
+ if (fs_1.default.existsSync(defaultFilePath) && fs_1.default.statSync(defaultFilePath).isFile()) {
132
+ ctx.type = (_b = staticFilesConfig.defaultFileMimeType) !== null && _b !== void 0 ? _b : "text/html";
133
+ const stat = fs_1.default.statSync(defaultFilePath);
134
+ ctx.set("Content-Length", stat.size.toString());
135
+ ctx.body = fs_1.default.createReadStream(defaultFilePath);
136
+ fileServed = true;
137
+ break;
138
+ }
139
+ }
140
+ }
141
+ if (!fileServed) {
142
+ yield next();
143
+ }
144
+ }));
145
+ }
146
+ registerMiddlewaresFromConfiguration() {
147
+ for (const middleware of this.configuration.getMiddlewares() || []) {
148
+ this.koa.use(middleware);
149
+ }
150
+ }
122
151
  start(callback) {
123
152
  return __awaiter(this, void 0, void 0, function* () {
124
153
  this.server = this.koa.listen(this.configuration.getPort(), () => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/../src/common/koalapp.ts"],"names":[],"mappings":"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","file":"koalapp.js","sourcesContent":["import Koa, { Next } from 'koa';\nimport { Configuration } from './configuration';\nimport { RouterService } from '../services/router-service';\nimport { AuthenticableEntity } from '../types/entities/authenticable-entity';\nimport { DataSource } from 'typeorm';\nimport { StatusCode } from './status-code';\nimport jwt from 'jsonwebtoken';\nimport bodyParser from 'koa-bodyparser';\nimport { BaseResponse, ErrorBase } from '../types';\nimport serve from \"koa-static\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { AuthorizationService } from '../services';\nimport { StringEnum } from '../types/common/string-enum';\nimport { errorHandlerMiddleware } from '../middlewares/error-handler-middleware';\nimport { transactionMiddleware } from '../middlewares/transaction-middleware';\nimport { Server } from 'http';\nimport { Context } from '../types/common/context';\n\nexport class KoalApp<\n U extends AuthenticableEntity,\n P extends StringEnum\n> {\n private static instance: KoalApp<any, any>;\n\n private koa = new Koa();\n private routerService: RouterService;\n private databaseConnection: DataSource;\n\n private server: Server;\n\n private authorizationService: AuthorizationService<U, P>;\n\n private constructor(private configuration: Configuration<U, P>) {\n }\n\n public static getInstance<\n T extends AuthenticableEntity,\n Q extends StringEnum\n >(configuration?: Configuration<T, Q>): KoalApp<T, Q> {\n if (!KoalApp.instance) {\n if (!configuration) {\n throw new Error(\"Configuration is required\");\n }\n KoalApp.instance = new KoalApp(configuration!);\n }\n return KoalApp.instance;\n }\n\n public static async resetInstance() {\n await KoalApp.getInstance().getDatabaseConnection().destroy();\n KoalApp.instance = undefined;\n }\n\n public getConfiguration(): Configuration<U, P> {\n return this.configuration;\n }\n\n public getRouterService(): RouterService {\n return this.routerService;\n }\n\n public getDatabaseConnection(): DataSource {\n return this.databaseConnection;\n }\n async initialize() {\n try {\n await this.setupDatabaseConnection();\n console.log(\"Database connection initialized.\");\n this.setupErrorHandler();\n console.log(\"Error handler initialized.\");\n this.setupTransaction();\n console.log(\"Transaction starter middleware initialized.\");\n this.koa.use(this.authorizationHeaderParser.bind(this));\n console.log(\"Authorization header parser initialized.\");\n this.koa.use(bodyParser());\n console.log(\"Body parser initialized.\");\n this.registerEndpoints();\n console.log(\"Endpoints registered.\");\n this.registerStaticFileServerMiddleware();\n console.log(\"Static file server initialized.\");\n } catch (error) {\n console.log(\"Error during database initialization...\", error);\n throw new Error('Error during application intialization...');\n }\n }\n async setupDatabaseConnection() {\n if (this.configuration.getDatabase()) {\n this.databaseConnection = await this.configuration.getDatabase().dataSource.initialize();\n await this.databaseConnection.runMigrations();\n }\n }\n setupErrorHandler() {\n this.koa.use(errorHandlerMiddleware);\n }\n setupTransaction() {\n this.koa.use(transactionMiddleware);\n }\n\n registerStaticFileServerMiddleware() {\n if (!this.configuration.getStaticFilesConfiguration()) {\n return;\n }\n for (const staticFilesConfig of this.configuration.getStaticFilesConfiguration()) {\n const staticFilesPath = path.isAbsolute(staticFilesConfig.folder) ? staticFilesConfig.folder : path.join(path.dirname(require.main.filename), staticFilesConfig.folder);\n console.log(`Serving files from: ${staticFilesPath}`);\n this.koa.use(serve(staticFilesPath));\n this.koa.use(async (ctx, next) => {\n console.log(`Request received for static file: ${ctx.request.path}`);\n const requestPath = ctx.request.path;\n\n if (!requestPath.startsWith(this.configuration.getRestPrefix()) && !/\\.[a-z]+$/.test(requestPath)) {\n ctx.type = staticFilesConfig.defaultFileMimeType ?? 'html';\n ctx.body = fs.createReadStream(path.join(staticFilesPath, staticFilesConfig.defaultFile ?? 'index.html'));\n } else {\n await next();\n }\n });\n }\n }\n\n registerEndpoints() {\n this.routerService = new RouterService(\n this.configuration.getControllers()\n );\n this.koa\n .use(this.routerService.getRoutes())\n .use(this.routerService.allowedMethods());\n }\n\n async start(callback?: (configuration: Configuration<U, P>) => void) {\n this.server = this.koa.listen(this.configuration.getPort(), () => {\n if (callback) {\n callback(this.configuration);\n }\n });\n }\n\n stop() {\n return new Promise<void>((resolve, reject) => {\n if (this.server) {\n this.server.close((error) => {\n if (!error) {\n resolve();\n }\n else {\n reject();\n }\n });\n this.server = undefined;\n }\n else {\n reject();\n }\n });\n }\n\n async authorizationHeaderParser(context: Context, next: Next) {\n const authHeader = context.headers.authorization;\n if (authHeader) {\n const token = authHeader.split(' ')[1];\n try {\n context.state.user = <AuthenticableEntity>jwt.verify(token, this.configuration.getJwtParameters().secretKey);\n await next();\n } catch (error) {\n context.status = StatusCode.UNAUTHORIZED;\n context.body = {\n success: false,\n message: 'Invalid token'\n }\n }\n }\n else {\n await next();\n }\n }\n\n async errorHandler(context: Context, next: Next) {\n try {\n await next();\n } catch (error) {\n if (error instanceof ErrorBase) {\n context.status = error.getStatusCode();\n context.body = <BaseResponse>{\n success: false,\n message: error.message\n };\n }\n else {\n console.log(error);\n context.status = StatusCode.INTERNAL_SERVER_ERROR;\n context.body = <BaseResponse>{\n success: false\n };\n }\n }\n }\n\n getAuthorizationService() {\n return this.authorizationService;\n }\n}"]}
1
+ {"version":3,"sources":["../src/../src/common/koalapp.ts"],"names":[],"mappings":"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","file":"koalapp.js","sourcesContent":["import Koa, { Next } from 'koa';\nimport { Configuration } from './configuration';\nimport { RouterService } from '../services/router-service';\nimport { AuthenticableEntity } from '../types/entities/authenticable-entity';\nimport { DataSource } from 'typeorm';\nimport { StatusCode } from './status-code';\nimport jwt from 'jsonwebtoken';\nimport bodyParser from 'koa-bodyparser';\nimport { BaseResponse, ErrorBase } from '../types';\nimport path from \"path\";\nimport fs from \"fs\";\nimport { AuthorizationService } from '../services';\nimport { StringEnum } from '../types/common/string-enum';\nimport { errorHandlerMiddleware } from '../middlewares/error-handler-middleware';\nimport { transactionMiddleware } from '../middlewares/transaction-middleware';\nimport { Server } from 'http';\nimport { Context } from '../types/common/context';\n\nexport class KoalApp<\n U extends AuthenticableEntity,\n P extends StringEnum\n> {\n private static instance: KoalApp<any, any>;\n\n private koa = new Koa();\n private routerService: RouterService;\n private databaseConnection: DataSource;\n\n private server: Server;\n\n private authorizationService: AuthorizationService<U, P>;\n\n private constructor(private configuration: Configuration<U, P>) {\n }\n\n public static getInstance<\n T extends AuthenticableEntity,\n Q extends StringEnum\n >(configuration?: Configuration<T, Q>): KoalApp<T, Q> {\n if (!KoalApp.instance) {\n if (!configuration) {\n throw new Error(\"Configuration is required\");\n }\n KoalApp.instance = new KoalApp(configuration!);\n }\n return KoalApp.instance;\n }\n\n public static async resetInstance() {\n await KoalApp.getInstance().getDatabaseConnection().destroy();\n KoalApp.instance = undefined;\n }\n\n public getConfiguration(): Configuration<U, P> {\n return this.configuration;\n }\n\n public getRouterService(): RouterService {\n return this.routerService;\n }\n\n public getDatabaseConnection(): DataSource {\n return this.databaseConnection;\n }\n async initialize() {\n try {\n await this.setupDatabaseConnection();\n console.log(\"Database connection initialized.\");\n this.setupErrorHandler();\n console.log(\"Error handler initialized.\");\n this.setupTransaction();\n console.log(\"Transaction starter middleware initialized.\");\n this.koa.use(this.authorizationHeaderParser.bind(this));\n console.log(\"Authorization header parser initialized.\");\n this.koa.use(bodyParser());\n console.log(\"Body parser initialized.\");\n this.registerMiddlewaresFromConfiguration();\n console.log(\"Middlewares registered from configuration.\");\n this.registerEndpoints();\n console.log(\"Endpoints registered.\");\n this.registerStaticFileServerMiddleware();\n console.log(\"Static file server initialized.\");\n } catch (error) {\n console.log(\"Error during database initialization...\", error);\n throw new Error('Error during application intialization...');\n }\n }\n async setupDatabaseConnection() {\n if (this.configuration.getDatabase()) {\n this.databaseConnection = await this.configuration.getDatabase().dataSource.initialize();\n await this.databaseConnection.runMigrations();\n }\n }\n setupErrorHandler() {\n this.koa.use(errorHandlerMiddleware);\n }\n setupTransaction() {\n this.koa.use(transactionMiddleware);\n }\n\n registerEndpoints() {\n this.routerService = new RouterService(\n this.configuration.getControllers()\n );\n this.koa\n .use(this.routerService.getRoutes())\n .use(this.routerService.allowedMethods());\n }\n\n registerStaticFileServerMiddleware() {\n const configs = this.configuration.getStaticFilesConfiguration();\n if (!configs) return;\n\n this.koa.use(async (ctx: Context, next: () => Promise<void>) => {\n const requestPath = ctx.request.path.replace(/^\\//, \"\");\n let fileServed = false;\n\n for (const staticFilesConfig of configs) {\n const staticFilesPath = path.isAbsolute(staticFilesConfig.folder)\n ? staticFilesConfig.folder\n : path.join(path.dirname(require.main.filename), staticFilesConfig.folder);\n console.log(`Checking static files in: ${staticFilesPath}`);\n\n const filePath = path.join(staticFilesPath, requestPath);\n\n if (fs.existsSync(filePath) && fs.statSync(filePath).isFile()) {\n ctx.type = path.extname(filePath).slice(1) || \"application/octet-stream\";\n const stat = fs.statSync(filePath);\n ctx.set(\"Content-Length\", stat.size.toString());\n ctx.body = fs.createReadStream(filePath);\n fileServed = true;\n break;\n }\n }\n\n if (!fileServed) {\n for (const staticFilesConfig of configs) {\n const staticFilesPath = path.isAbsolute(staticFilesConfig.folder)\n ? staticFilesConfig.folder\n : path.join(path.dirname(require.main.filename), staticFilesConfig.folder);\n const defaultFile = staticFilesConfig.defaultFile ?? \"index.html\";\n const defaultFilePath = path.join(staticFilesPath, defaultFile);\n\n if (fs.existsSync(defaultFilePath) && fs.statSync(defaultFilePath).isFile()) {\n ctx.type = staticFilesConfig.defaultFileMimeType ?? \"text/html\";\n const stat = fs.statSync(defaultFilePath);\n ctx.set(\"Content-Length\", stat.size.toString());\n ctx.body = fs.createReadStream(defaultFilePath);\n fileServed = true;\n break;\n }\n }\n }\n\n if (!fileServed) {\n await next();\n }\n });\n }\n\n registerMiddlewaresFromConfiguration() {\n for (const middleware of this.configuration.getMiddlewares() || []) {\n this.koa.use(middleware);\n }\n }\n\n async start(callback?: (configuration: Configuration<U, P>) => void) {\n this.server = this.koa.listen(this.configuration.getPort(), () => {\n if (callback) {\n callback(this.configuration);\n }\n });\n }\n\n stop() {\n return new Promise<void>((resolve, reject) => {\n if (this.server) {\n this.server.close((error) => {\n if (!error) {\n resolve();\n }\n else {\n reject();\n }\n });\n this.server = undefined;\n }\n else {\n reject();\n }\n });\n }\n\n async authorizationHeaderParser(context: Context, next: Next) {\n const authHeader = context.headers.authorization;\n if (authHeader) {\n const token = authHeader.split(' ')[1];\n try {\n context.state.user = <AuthenticableEntity>jwt.verify(token, this.configuration.getJwtParameters().secretKey);\n await next();\n } catch (error) {\n context.status = StatusCode.UNAUTHORIZED;\n context.body = {\n success: false,\n message: 'Invalid token'\n }\n }\n }\n else {\n await next();\n }\n }\n\n async errorHandler(context: Context, next: Next) {\n try {\n await next();\n } catch (error) {\n if (error instanceof ErrorBase) {\n context.status = error.getStatusCode();\n context.body = <BaseResponse>{\n success: false,\n message: error.message\n };\n }\n else {\n console.log(error);\n context.status = StatusCode.INTERNAL_SERVER_ERROR;\n context.body = <BaseResponse>{\n success: false\n };\n }\n }\n }\n\n getAuthorizationService() {\n return this.authorizationService;\n }\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kool-koala",
3
- "version": "1.6.2",
3
+ "version": "1.7.1",
4
4
  "description": "Full-stack framework to create NodeJS applications on server side and Angular applications on the client side with ease.",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -73,7 +73,6 @@
73
73
  "koa": "^2.16.0",
74
74
  "koa-bodyparser": "^4.4.1",
75
75
  "koa-router": "^13.0.1",
76
- "koa-static": "^5.0.0",
77
76
  "reflect-metadata": "^0.2.2",
78
77
  "typeorm": "^0.3.22",
79
78
  "yargs": "^17.7.2"