@adaas/a-server 0.0.13 → 0.0.15
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.
- package/.nvmrc +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.js +7 -6
- package/dist/index.js.map +1 -1
- package/dist/src/components/A-CommandController/A-CommandController.component.d.ts +8 -0
- package/dist/src/components/A-CommandController/A-CommandController.component.js +53 -0
- package/dist/src/components/A-CommandController/A-CommandController.component.js.map +1 -0
- package/dist/src/components/{A_Controller/A_Controller.component.js → A-Controller/A-Controller.component.js} +1 -1
- package/dist/src/components/{A_Controller/A_Controller.component.js.map → A-Controller/A-Controller.component.js.map} +1 -1
- package/dist/src/components/A-Controller/A-Controller.component.types.js +2 -0
- package/dist/src/components/A-Controller/A-Controller.component.types.js.map +1 -0
- package/dist/src/components/A-EntityController/A-EntityController.component.js +1 -2
- package/dist/src/components/A-EntityController/A-EntityController.component.js.map +1 -1
- package/dist/src/components/A-ListingController/A-ListingController.component.d.ts +1 -1
- package/dist/src/components/A-ListingController/A-ListingController.component.js.map +1 -1
- package/dist/src/components/A-Router/A-Router.component.js +13 -10
- package/dist/src/components/A-Router/A-Router.component.js.map +1 -1
- package/dist/src/components/A-Router/A-Router.component.types.d.ts +7 -2
- package/dist/src/components/A-Router/A-Router.component.types.js.map +1 -1
- package/dist/src/components/A-ServerCORS/A_ServerCORS.component.d.ts +1 -1
- package/dist/src/components/A-ServerCORS/A_ServerCORS.component.js +3 -3
- package/dist/src/components/A-ServerCORS/A_ServerCORS.component.js.map +1 -1
- package/dist/src/components/A-ServerHealthMonitor/A-ServerHealthMonitor.component.d.ts +1 -1
- package/dist/src/components/A-ServerHealthMonitor/A-ServerHealthMonitor.component.js +1 -1
- package/dist/src/components/A-ServerHealthMonitor/A-ServerHealthMonitor.component.js.map +1 -1
- package/dist/src/components/A-ServerLogger/A-ServerLogger.constants.d.ts +22 -0
- package/dist/src/components/A-ServerLogger/A-ServerLogger.constants.js +31 -0
- package/dist/src/components/A-ServerLogger/A-ServerLogger.constants.js.map +1 -0
- package/dist/src/components/A-ServerLogger/A_ServerLogger.component.d.ts +2 -2
- package/dist/src/components/A-ServerLogger/A_ServerLogger.component.js +6 -6
- package/dist/src/components/A-ServerLogger/A_ServerLogger.component.js.map +1 -1
- package/dist/src/components/A-ServerLogger/A_ServerLogger.component.types.d.ts +2 -0
- package/dist/src/components/A-ServerProxy/A-ServerProxy.component.js +2 -2
- package/dist/src/components/A-ServerProxy/A-ServerProxy.component.js.map +1 -1
- package/dist/src/components/A-StaticLoader/A-StaticLoader.component.js +2 -2
- package/dist/src/components/A-StaticLoader/A-StaticLoader.component.js.map +1 -1
- package/dist/src/components/A-StaticLoader/A-StaticLoader.component.types.js +2 -2
- package/dist/src/components/A-StaticLoader/A-StaticLoader.component.types.js.map +1 -1
- package/dist/src/constants/env.constants.d.ts +10 -0
- package/dist/src/constants/env.constants.js +20 -0
- package/dist/src/constants/env.constants.js.map +1 -0
- package/dist/src/containers/{A-Server/A-Server.container.d.ts → A-Service/A-Service.container.d.ts} +6 -1
- package/dist/src/containers/{A-Server/A-Server.container.js → A-Service/A-Service.container.js} +40 -28
- package/dist/src/containers/A-Service/A-Service.container.js.map +1 -0
- package/dist/src/containers/{A-Server/A-Server.container.types.d.ts → A-Service/A-Service.container.types.d.ts} +3 -1
- package/dist/src/containers/{A-Server/A-Server.container.types.js → A-Service/A-Service.container.types.js} +3 -1
- package/dist/src/containers/A-Service/A-Service.container.types.js.map +1 -0
- package/dist/src/entities/A-Response/A-Response.entity.js.map +1 -1
- package/dist/src/entities/A_EntityList/A_EntityList.entity.d.ts +1 -0
- package/dist/src/entities/A_EntityList/A_EntityList.entity.js +3 -0
- package/dist/src/entities/A_EntityList/A_EntityList.entity.js.map +1 -1
- package/examples/microservices-server/components/repositories/Memory.repository.ts +2 -2
- package/examples/microservices-server/concept.ts +1 -1
- package/examples/simple-server/commands/SignIn.command.ts +10 -0
- package/examples/simple-server/concept.ts +10 -5
- package/index.ts +5 -4
- package/jest.config.ts +1 -1
- package/package.json +3 -3
- package/src/components/A-CommandController/A-CommandController.component.ts +40 -0
- package/src/components/A-EntityController/A-EntityController.component.ts +1 -6
- package/src/components/A-ListingController/A-ListingController.component.ts +1 -1
- package/src/components/A-Router/A-Router.component.ts +15 -11
- package/src/components/A-Router/A-Router.component.types.ts +9 -2
- package/src/components/A-ServerCORS/A_ServerCORS.component.ts +3 -3
- package/src/components/A-ServerHealthMonitor/A-ServerHealthMonitor.component.ts +2 -2
- package/src/components/A-ServerLogger/A-ServerLogger.constants.ts +27 -0
- package/src/components/A-ServerLogger/A_ServerLogger.component.ts +7 -13
- package/src/components/A-ServerLogger/A_ServerLogger.component.types.ts +14 -1
- package/src/components/A-ServerProxy/A-ServerProxy.component.ts +1 -1
- package/src/components/A-StaticLoader/A-StaticLoader.component.ts +1 -1
- package/src/components/A-StaticLoader/A-StaticLoader.component.types.ts +1 -1
- package/src/constants/env.constants.ts +26 -0
- package/src/containers/{A-Server/A-Server.container.ts → A-Service/A-Service.container.ts} +31 -20
- package/src/containers/{A-Server/A-Server.container.types.ts → A-Service/A-Service.container.types.ts} +2 -0
- package/src/entities/A-Response/A-Response.entity.ts +0 -2
- package/src/entities/A_EntityList/A_EntityList.entity.ts +5 -0
- package/tests/A-Service.test.ts +20 -0
- package/dist/src/components/A_Controller/A_Controller.component.types.js +0 -2
- package/dist/src/components/A_Controller/A_Controller.component.types.js.map +0 -1
- package/dist/src/containers/A-Server/A-Server.container.js.map +0 -1
- package/dist/src/containers/A-Server/A-Server.container.types.js.map +0 -1
- package/tests/app.test.ts +0 -29
- package/tests/decorator.test.ts +0 -33
- package/tests/default.test.ts +0 -121
- /package/dist/src/components/{A_Controller/A_Controller.component.d.ts → A-Controller/A-Controller.component.d.ts} +0 -0
- /package/dist/src/components/{A_Controller/A_Controller.component.types.d.ts → A-Controller/A-Controller.component.types.d.ts} +0 -0
- /package/src/components/{A_Controller/A_Controller.component.ts → A-Controller/A-Controller.component.ts} +0 -0
- /package/src/components/{A_Controller/A_Controller.component.types.ts → A-Controller/A-Controller.component.types.ts} +0 -0
|
@@ -11,14 +11,15 @@ import {
|
|
|
11
11
|
A_Meta,
|
|
12
12
|
A_Scope
|
|
13
13
|
} from "@adaas/a-concept";
|
|
14
|
-
import {
|
|
15
|
-
import { A_SERVER_TYPES__ServerFeature } from "@adaas/a-server/containers/A-
|
|
14
|
+
import { A_Service } from "@adaas/a-server/containers/A-Service/A-Service.container";
|
|
15
|
+
import { A_SERVER_TYPES__ServerFeature } from "@adaas/a-server/containers/A-Service/A-Service.container.types";
|
|
16
16
|
import { A_Request } from "@adaas/a-server/entities/A-Request/A-Request.entity";
|
|
17
17
|
import {
|
|
18
18
|
A_SERVER_TYPES__ARouterComponentMetaKey,
|
|
19
19
|
A_SERVER_TYPES__ARouterRouteConfig,
|
|
20
20
|
A_SERVER_TYPES__RouterMethod,
|
|
21
|
-
A_TYPES__ARouterComponentMeta
|
|
21
|
+
A_TYPES__ARouterComponentMeta,
|
|
22
|
+
A_TYPES__ARouterDefineRoute
|
|
22
23
|
} from "./A-Router.component.types";
|
|
23
24
|
import { A_Route } from "@adaas/a-server/entities/A-Route/A-Route.entity";
|
|
24
25
|
import { A_Response } from "@adaas/a-server/entities/A-Response/A-Response.entity";
|
|
@@ -154,11 +155,15 @@ export class A_Router extends A_Component {
|
|
|
154
155
|
|
|
155
156
|
const meta: A_Meta<A_TYPES__ARouterComponentMeta> = A_Context.meta<A_TYPES__ARouterComponentMeta>(target as any);
|
|
156
157
|
|
|
157
|
-
const routes = meta.get(A_SERVER_TYPES__ARouterComponentMetaKey.ROUTES) || new Map();
|
|
158
|
+
const routes = meta.get(A_SERVER_TYPES__ARouterComponentMetaKey.ROUTES) || new Map<string, A_TYPES__ARouterDefineRoute>();
|
|
158
159
|
|
|
159
|
-
const searchKey = route.toAFeatureExtension(['A_Router', '
|
|
160
|
+
const searchKey = route.toAFeatureExtension(['A_Router', 'A_Service']);
|
|
160
161
|
|
|
161
|
-
routes.set(searchKey.source,
|
|
162
|
+
routes.set(searchKey.source, {
|
|
163
|
+
component: target,
|
|
164
|
+
handler: propertyKey,
|
|
165
|
+
route
|
|
166
|
+
});
|
|
162
167
|
|
|
163
168
|
meta.set(A_SERVER_TYPES__ARouterComponentMetaKey.ROUTES, routes);
|
|
164
169
|
|
|
@@ -193,7 +198,7 @@ export class A_Router extends A_Component {
|
|
|
193
198
|
})
|
|
194
199
|
@A_Feature.Extend({
|
|
195
200
|
name: A_SERVER_TYPES__ServerFeature.onRequest,
|
|
196
|
-
scope: [
|
|
201
|
+
scope: [A_Service],
|
|
197
202
|
})
|
|
198
203
|
async identifyRoute(
|
|
199
204
|
@A_Inject(A_Request) request: A_Request,
|
|
@@ -203,10 +208,9 @@ export class A_Router extends A_Component {
|
|
|
203
208
|
@A_Inject(A_Logger) logger: A_Logger
|
|
204
209
|
) {
|
|
205
210
|
|
|
206
|
-
const
|
|
207
|
-
const route = new A_Route(url, method);
|
|
211
|
+
const route = request.route;
|
|
208
212
|
|
|
209
|
-
if (config.get('
|
|
213
|
+
if (config.get('A_CONCEPT_ENVIRONMENT') === 'development') {
|
|
210
214
|
logger.log(`Incoming request: ${request.method} ${request.url}`);
|
|
211
215
|
logger.log(`Identified route: ${route.toString()}`);
|
|
212
216
|
}
|
|
@@ -237,7 +241,7 @@ export class A_Router extends A_Component {
|
|
|
237
241
|
if (currentRoute) {
|
|
238
242
|
request.params = {
|
|
239
243
|
...request.params,
|
|
240
|
-
...currentRoute.extractParams(url)
|
|
244
|
+
...currentRoute.route.extractParams(request.url)
|
|
241
245
|
};
|
|
242
246
|
}
|
|
243
247
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A_TYPES__ComponentMeta, A_TYPES__ComponentMetaKey } from "@adaas/a-concept";
|
|
1
|
+
import { A_Component, A_TYPES__ComponentMeta, A_TYPES__ComponentMetaKey } from "@adaas/a-concept";
|
|
2
2
|
import { A_Route } from "@adaas/a-server/entities/A-Route/A-Route.entity";
|
|
3
3
|
|
|
4
4
|
|
|
@@ -13,10 +13,17 @@ export enum A_SERVER_TYPES__RouterMethod {
|
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
export type A_TYPES__ARouterComponentMeta = {
|
|
16
|
-
[A_SERVER_TYPES__ARouterComponentMetaKey.ROUTES]: Map<string,
|
|
16
|
+
[A_SERVER_TYPES__ARouterComponentMetaKey.ROUTES]: Map<string, A_TYPES__ARouterDefineRoute>
|
|
17
17
|
} & A_TYPES__ComponentMeta
|
|
18
18
|
|
|
19
19
|
|
|
20
|
+
export type A_TYPES__ARouterDefineRoute = {
|
|
21
|
+
component: A_Component,
|
|
22
|
+
handler: string,
|
|
23
|
+
route: A_Route
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
|
|
20
27
|
export enum A_SERVER_TYPES__ARouterComponentMetaKey {
|
|
21
28
|
ROUTES = 'ROUTES'
|
|
22
29
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { A_Component, A_Config, A_Feature, A_Inject } from '@adaas/a-concept';
|
|
2
2
|
import { A_SERVER_TYPES__CorsConfig } from './A_ServerCORS.component.types';
|
|
3
3
|
import { A_SERVER_DEFAULTS__CorsConfig } from './A_ServerCORS.component.defaults';
|
|
4
|
-
import { A_SERVER_TYPES__ServerFeature } from '@adaas/a-server/containers/A-
|
|
4
|
+
import { A_SERVER_TYPES__ServerFeature } from '@adaas/a-server/containers/A-Service/A-Service.container.types';
|
|
5
5
|
import { A_Request } from '@adaas/a-server/entities/A-Request/A-Request.entity';
|
|
6
6
|
import { A_Response } from '@adaas/a-server/entities/A-Response/A-Response.entity';
|
|
7
7
|
|
|
@@ -14,7 +14,7 @@ export class A_ServerCORS extends A_Component {
|
|
|
14
14
|
name: A_SERVER_TYPES__ServerFeature.beforeStart
|
|
15
15
|
})
|
|
16
16
|
async init(
|
|
17
|
-
@A_Inject(A_Config) config: A_Config<'ORIGIN'
|
|
17
|
+
@A_Inject(A_Config) config: A_Config<['ORIGIN', 'METHODS', 'HEADERS', 'CREDENTIALS', 'MAX_AGE']>,
|
|
18
18
|
) {
|
|
19
19
|
this.config = {
|
|
20
20
|
origin: config.get('ORIGIN') || A_SERVER_DEFAULTS__CorsConfig.origin,
|
|
@@ -27,7 +27,7 @@ export class A_ServerCORS extends A_Component {
|
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
@A_Feature.Extend({
|
|
30
|
-
name: A_SERVER_TYPES__ServerFeature.
|
|
30
|
+
name: A_SERVER_TYPES__ServerFeature.beforeRequest
|
|
31
31
|
})
|
|
32
32
|
public apply(
|
|
33
33
|
@A_Inject(A_Request) aReq: A_Request,
|
|
@@ -18,12 +18,12 @@ export class A_ServerHealthMonitor extends A_Component {
|
|
|
18
18
|
version: 'v1',
|
|
19
19
|
})
|
|
20
20
|
async get(
|
|
21
|
-
@A_Inject(A_Config) config: A_Config<'VERSION_PATH'
|
|
21
|
+
@A_Inject(A_Config) config: A_Config<['VERSION_PATH', 'EXPOSED_PROPERTIES']>,
|
|
22
22
|
@A_Inject(A_Request) request: A_Request,
|
|
23
23
|
@A_Inject(A_Response) response: A_Response,
|
|
24
24
|
@A_Inject(A_Logger) logger: A_Logger
|
|
25
25
|
): Promise<any> {
|
|
26
|
-
const packageJSON = await import(`${config.get('
|
|
26
|
+
const packageJSON = await import(`${config.get('A_CONCEPT_ROOT_FOLDER')}/package.json`);
|
|
27
27
|
const exposedProperties: Array<string> = config.get('EXPOSED_PROPERTIES')?.split(',') || [
|
|
28
28
|
'name',
|
|
29
29
|
'version',
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export const A_SERVER__A_SERVER_LOGGER_ENV_VARIABLES = {
|
|
2
|
+
// ----------------------------------------------------------
|
|
3
|
+
// A-ServerLogger Environment Variables
|
|
4
|
+
// ----------------------------------------------------------
|
|
5
|
+
// These environment variables are used by A-Concept core to configure the application
|
|
6
|
+
// ----------------------------------------------------------
|
|
7
|
+
/**
|
|
8
|
+
* Enable logging of 200 responses
|
|
9
|
+
*/
|
|
10
|
+
SERVER_IGNORE_LOG_200: 'SERVER_IGNORE_LOG_200',
|
|
11
|
+
/**
|
|
12
|
+
* Enable logging of 404 responses
|
|
13
|
+
*/
|
|
14
|
+
SERVER_IGNORE_LOG_404: 'SERVER_IGNORE_LOG_404',
|
|
15
|
+
/**
|
|
16
|
+
* Enable logging of 500 responses
|
|
17
|
+
*/
|
|
18
|
+
SERVER_IGNORE_LOG_500: 'SERVER_IGNORE_LOG_500',
|
|
19
|
+
/**
|
|
20
|
+
* Enable logging of 400 responses
|
|
21
|
+
*/
|
|
22
|
+
SERVER_IGNORE_LOG_400: 'SERVER_IGNORE_LOG_400',
|
|
23
|
+
/**
|
|
24
|
+
* Enable logging of default responses
|
|
25
|
+
*/
|
|
26
|
+
SERVER_IGNORE_LOG_DEFAULT: 'SERVER_IGNORE_LOG_DEFAULT',
|
|
27
|
+
} as const
|
|
@@ -1,25 +1,19 @@
|
|
|
1
1
|
import { A_Config, A_Feature, A_Inject, A_Logger, A_Scope } from "@adaas/a-concept";
|
|
2
|
-
import { A_SERVER_TYPES__ServerFeature } from "@adaas/a-server/containers/A-
|
|
2
|
+
import { A_SERVER_TYPES__ServerFeature } from "@adaas/a-server/containers/A-Service/A-Service.container.types";
|
|
3
3
|
import { A_Server } from "@adaas/a-server/context/A-Server/A_Server.context";
|
|
4
|
-
import { A_SERVER_TYPES__ServerLoggerRouteParams } from "./A_ServerLogger.component.types";
|
|
5
|
-
import {
|
|
4
|
+
import { A_SERVER_TYPES__ServerLoggerEnvVariables, A_SERVER_TYPES__ServerLoggerRouteParams } from "./A_ServerLogger.component.types";
|
|
5
|
+
import { A_Service } from "@adaas/a-server/containers/A-Service/A-Service.container";
|
|
6
6
|
import { A_Request } from "@adaas/a-server/entities/A-Request/A-Request.entity";
|
|
7
7
|
import { A_Response } from "@adaas/a-server/entities/A-Response/A-Response.entity";
|
|
8
8
|
import { A_SERVER_TYPES__ResponseEvent } from "@adaas/a-server/entities/A-Response/A-Response.entity.types";
|
|
9
9
|
import { A_Route } from "@adaas/a-server/entities/A-Route/A-Route.entity";
|
|
10
10
|
import { A_SERVER_TYPES__RequestEvent } from "@adaas/a-server/entities/A-Request/A-Request.entity.types";
|
|
11
|
+
import { A_TYPES__ConceptENVVariables } from "@adaas/a-concept/dist/src/constants/env.constants";
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
export class A_ServerLogger extends A_Logger {
|
|
14
15
|
|
|
15
|
-
protected config!: A_Config<
|
|
16
|
-
'DEV_MODE'
|
|
17
|
-
| 'SERVER_IGNORE_LOG_200'
|
|
18
|
-
| 'SERVER_IGNORE_LOG_404'
|
|
19
|
-
| 'SERVER_IGNORE_LOG_500'
|
|
20
|
-
| 'SERVER_IGNORE_LOG_400'
|
|
21
|
-
| 'SERVER_IGNORE_LOG_DEFAULT'
|
|
22
|
-
>
|
|
16
|
+
protected config!: A_Config<A_SERVER_TYPES__ServerLoggerEnvVariables>
|
|
23
17
|
|
|
24
18
|
|
|
25
19
|
|
|
@@ -53,7 +47,7 @@ export class A_ServerLogger extends A_Logger {
|
|
|
53
47
|
@A_Feature.Define({ invoke: false })
|
|
54
48
|
@A_Feature.Extend({
|
|
55
49
|
name: A_SERVER_TYPES__ServerFeature.afterStart,
|
|
56
|
-
scope: [
|
|
50
|
+
scope: [A_Service]
|
|
57
51
|
})
|
|
58
52
|
logStart(
|
|
59
53
|
@A_Inject(A_Server) server: A_Server,
|
|
@@ -72,7 +66,7 @@ export class A_ServerLogger extends A_Logger {
|
|
|
72
66
|
|
|
73
67
|
@A_Feature.Extend({
|
|
74
68
|
name: A_SERVER_TYPES__ServerFeature.afterStop,
|
|
75
|
-
scope: [
|
|
69
|
+
scope: [A_Service]
|
|
76
70
|
})
|
|
77
71
|
logStop(
|
|
78
72
|
@A_Inject(A_Server) server: A_Server,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { A_TYPES__ConceptENVVariables } from "@adaas/a-concept/dist/src/constants/env.constants"
|
|
1
2
|
|
|
2
3
|
|
|
3
4
|
export type A_SERVER_TYPES__ServerLoggerRouteParams = {
|
|
@@ -5,4 +6,16 @@ export type A_SERVER_TYPES__ServerLoggerRouteParams = {
|
|
|
5
6
|
url: string,
|
|
6
7
|
status: number,
|
|
7
8
|
responseTime: number
|
|
8
|
-
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
export type A_SERVER_TYPES__ServerLoggerEnvVariables = Array<
|
|
13
|
+
|
|
14
|
+
'SERVER_IGNORE_LOG_200'
|
|
15
|
+
| 'SERVER_IGNORE_LOG_404'
|
|
16
|
+
| 'SERVER_IGNORE_LOG_500'
|
|
17
|
+
| 'SERVER_IGNORE_LOG_400'
|
|
18
|
+
| 'SERVER_IGNORE_LOG_DEFAULT'
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
> | A_TYPES__ConceptENVVariables
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { A_Component, A_Concept, A_Feature, A_Inject, A_Logger } from "@adaas/a-concept";
|
|
2
|
-
import { A_SERVER_TYPES__ServerFeature } from "@adaas/a-server/containers/A-
|
|
2
|
+
import { A_SERVER_TYPES__ServerFeature } from "@adaas/a-server/containers/A-Service/A-Service.container.types";
|
|
3
3
|
import { A_ProxyConfig } from "@adaas/a-server/context/A_ProxyConfig/A_ProxyConfig.context";
|
|
4
4
|
import { A_Request } from "@adaas/a-server/entities/A-Request/A-Request.entity";
|
|
5
5
|
import { A_Response } from "@adaas/a-server/entities/A-Response/A-Response.entity";
|
|
@@ -4,7 +4,7 @@ import path from "path";
|
|
|
4
4
|
import { URL } from "url";
|
|
5
5
|
import { A_Request } from "@adaas/a-server/entities/A-Request/A-Request.entity";
|
|
6
6
|
import { A_Response } from "@adaas/a-server/entities/A-Response/A-Response.entity";
|
|
7
|
-
import { A_SERVER_TYPES__ServerFeature } from "@adaas/a-server/containers/A-
|
|
7
|
+
import { A_SERVER_TYPES__ServerFeature } from "@adaas/a-server/containers/A-Service/A-Service.container.types";
|
|
8
8
|
import { A_Route } from "@adaas/a-server/entities/A-Route/A-Route.entity";
|
|
9
9
|
import { A_StaticConfig } from "@adaas/a-server/context/A-StaticConfig/A-StaticConfig.context";
|
|
10
10
|
|
|
@@ -5,7 +5,7 @@ import path from "path";
|
|
|
5
5
|
import { URL } from "url";
|
|
6
6
|
import { A_Request } from "@adaas/a-server/entities/A-Request/A-Request.entity";
|
|
7
7
|
import { A_Response } from "@adaas/a-server/entities/A-Response/A-Response.entity";
|
|
8
|
-
import { A_SERVER_TYPES__ServerFeature } from "@adaas/a-server/containers/A-
|
|
8
|
+
import { A_SERVER_TYPES__ServerFeature } from "@adaas/a-server/containers/A-Service/A-Service.container.types";
|
|
9
9
|
import { A_Route } from "@adaas/a-server/entities/A-Route/A-Route.entity";
|
|
10
10
|
|
|
11
11
|
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export const A_SERVER_CONSTANTS__DEFAULT_ENV_VARIABLES = {
|
|
2
|
+
// ----------------------------------------------------------
|
|
3
|
+
// A-Server Environment Variables
|
|
4
|
+
// ----------------------------------------------------------
|
|
5
|
+
// These environment variables are used by A-Server to configure the application
|
|
6
|
+
// ----------------------------------------------------------
|
|
7
|
+
/**
|
|
8
|
+
* Port for the server to listen on
|
|
9
|
+
* [!] Default is 3000
|
|
10
|
+
* @default 3000
|
|
11
|
+
*/
|
|
12
|
+
A_SERVER_PORT: 'A_SERVER_PORT',
|
|
13
|
+
|
|
14
|
+
} as const;
|
|
15
|
+
|
|
16
|
+
export type A_TYPES__ServerENVVariables = (typeof A_SERVER_CONSTANTS__DEFAULT_ENV_VARIABLES)[keyof typeof A_SERVER_CONSTANTS__DEFAULT_ENV_VARIABLES][];
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
export const A_SERVER_CONSTANTS__DEFAULT_ENV_VARIABLES_ARRAY = [
|
|
21
|
+
A_SERVER_CONSTANTS__DEFAULT_ENV_VARIABLES.A_SERVER_PORT,
|
|
22
|
+
] as const;
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
import { A_Concept, A_Config, A_Container, A_Context, A_Errors, A_Feature, A_Inject, A_Logger, A_Scope, A_TYPES__ComponentMetaKey, } from "@adaas/a-concept";
|
|
2
2
|
import { createServer, IncomingMessage, Server, ServerResponse } from "http";
|
|
3
|
-
import { A_SERVER_TYPES__ServerFeature, A_SERVER_TYPES__ServerFeatures } from "./A-
|
|
3
|
+
import { A_SERVER_TYPES__ServerFeature, A_SERVER_TYPES__ServerFeatures } from "./A-Service.container.types";
|
|
4
4
|
import { A_Server } from "@adaas/a-server/context/A-Server/A_Server.context";
|
|
5
5
|
import { A_Request } from "@adaas/a-server/entities/A-Request/A-Request.entity";
|
|
6
6
|
import { A_Response } from "@adaas/a-server/entities/A-Response/A-Response.entity";
|
|
7
7
|
import crypto from 'crypto';
|
|
8
|
+
import { A_SERVER_CONSTANTS__DEFAULT_ENV_VARIABLES_ARRAY, A_TYPES__ServerENVVariables } from "@adaas/a-server/constants/env.constants";
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
|
|
11
12
|
|
|
12
|
-
|
|
13
|
+
/**
|
|
14
|
+
* A-Service is a container that can run different types of services, such as HTTP servers, workers, etc.
|
|
15
|
+
* Depending on the provided config and configuration, it will load the necessary components and start the service.
|
|
16
|
+
*
|
|
17
|
+
*/
|
|
18
|
+
export class A_Service extends A_Container {
|
|
13
19
|
|
|
14
20
|
private server!: Server;
|
|
15
21
|
private port: number = 3000;
|
|
@@ -22,25 +28,35 @@ export class A_ServerContainer extends A_Container {
|
|
|
22
28
|
this.Scope.register(errorsRegistry);
|
|
23
29
|
}
|
|
24
30
|
|
|
31
|
+
let config: A_Config<A_TYPES__ServerENVVariables>;
|
|
32
|
+
let aServer: A_Server;
|
|
25
33
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
variables: ['DEV_MODE', 'CONFIG_VERBOSE', 'PORT'],
|
|
34
|
+
if (!this.Scope.has(A_Config<A_TYPES__ServerENVVariables>)) {
|
|
35
|
+
const config = new A_Config<A_TYPES__ServerENVVariables>({
|
|
36
|
+
variables: [...Array.from(A_SERVER_CONSTANTS__DEFAULT_ENV_VARIABLES_ARRAY)],
|
|
30
37
|
defaults: {
|
|
31
|
-
|
|
32
|
-
CONFIG_VERBOSE: true,
|
|
33
|
-
PORT: 3000
|
|
38
|
+
A_SERVER_PORT: 3000
|
|
34
39
|
}
|
|
35
40
|
});
|
|
36
41
|
|
|
37
42
|
this.Scope.register(config);
|
|
38
43
|
}
|
|
39
44
|
|
|
40
|
-
|
|
45
|
+
config = this.Scope.resolve(A_Config) as A_Config<A_TYPES__ServerENVVariables>;
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
if (!this.Scope.has(A_Server)) {
|
|
49
|
+
aServer = new A_Server({
|
|
50
|
+
port: config.get('A_SERVER_PORT'),
|
|
51
|
+
name: this.name,
|
|
52
|
+
version: 'v1'
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
|
|
41
57
|
|
|
42
58
|
// Set the server to listen on port 3000
|
|
43
|
-
const port = config.get('
|
|
59
|
+
const port = config.get('A_SERVER_PORT');
|
|
44
60
|
|
|
45
61
|
// Create the HTTP server
|
|
46
62
|
this.server = createServer(this.onRequest.bind(this));
|
|
@@ -52,14 +68,6 @@ export class A_ServerContainer extends A_Container {
|
|
|
52
68
|
});
|
|
53
69
|
|
|
54
70
|
this.Scope.register(newServer);
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
// } else {
|
|
61
|
-
// this.server = existedServer;
|
|
62
|
-
// }
|
|
63
71
|
}
|
|
64
72
|
|
|
65
73
|
protected listen(): Promise<void> {
|
|
@@ -102,7 +110,7 @@ export class A_ServerContainer extends A_Container {
|
|
|
102
110
|
|
|
103
111
|
@A_Concept.Stop()
|
|
104
112
|
/**
|
|
105
|
-
* Stop
|
|
113
|
+
* Stop service
|
|
106
114
|
*/
|
|
107
115
|
async stop() {
|
|
108
116
|
await this.call(A_SERVER_TYPES__ServerFeature.beforeStop);
|
|
@@ -134,11 +142,14 @@ export class A_ServerContainer extends A_Container {
|
|
|
134
142
|
entities: [req, res],
|
|
135
143
|
});
|
|
136
144
|
|
|
145
|
+
await this.call(A_SERVER_TYPES__ServerFeature.beforeRequest, scope);
|
|
137
146
|
await this.call(A_SERVER_TYPES__ServerFeature.onRequest, scope);
|
|
147
|
+
await this.call(A_SERVER_TYPES__ServerFeature.afterRequest, scope);
|
|
138
148
|
|
|
139
149
|
await res.status(200).send();
|
|
140
150
|
|
|
141
151
|
} catch (error) {
|
|
152
|
+
|
|
142
153
|
return res.failed(error);
|
|
143
154
|
}
|
|
144
155
|
}
|
|
@@ -22,6 +22,11 @@ export class A_EntityList<
|
|
|
22
22
|
A_SERVER_TYPES__A_EntityListConstructor,
|
|
23
23
|
A_SERVER_TYPES__A_EntityListSerialized
|
|
24
24
|
> {
|
|
25
|
+
|
|
26
|
+
static get scope(): string {
|
|
27
|
+
return 'a-server';
|
|
28
|
+
}
|
|
29
|
+
|
|
25
30
|
protected _entityConstructor!: new (...args: ConstructorParameters<typeof A_Entity>) => EntityType;
|
|
26
31
|
protected _items: Array<EntityType> = [];
|
|
27
32
|
protected _pagination: A_SERVER_TYPES__A_EntityListPagination = {
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { A_Service } from '@adaas/a-server/containers/A-Service/A-Service.container';
|
|
2
|
+
import { A_Server } from '@adaas/a-server/context/A-Server/A_Server.context';
|
|
3
|
+
|
|
4
|
+
jest.retryTimes(0);
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
describe('A-Server Tests', () => {
|
|
8
|
+
it('Should be possible to create a server Container', async () => {
|
|
9
|
+
const server1 = new A_Service({
|
|
10
|
+
name: 'test-server-1'
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
await server1.load();
|
|
14
|
+
|
|
15
|
+
expect(server1.name).toBe('test-server-1');
|
|
16
|
+
expect(server1.Scope.resolve(A_Server)).toBeInstanceOf(A_Server);
|
|
17
|
+
expect(server1.Scope.resolve(A_Server).port).toBe(3000);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"A_Controller.component.types.js","sourceRoot":"","sources":["../../../../src/components/A_Controller/A_Controller.component.types.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"A-Server.container.js","sourceRoot":"","sources":["../../../../src/containers/A-Server/A-Server.container.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"A-Server.container.types.js","sourceRoot":"","sources":["../../../../src/containers/A-Server/A-Server.container.types.ts"],"names":[],"mappings":";;;AAWA,IAAY,6BAMX;AAND,WAAY,6BAA6B;IACrC,4DAA2B,CAAA;IAC3B,0DAAyB,CAAA;IACzB,0DAAyB,CAAA;IACzB,wDAAuB,CAAA;IACvB,wDAAuB,CAAA;AAC3B,CAAC,EANW,6BAA6B,6CAA7B,6BAA6B,QAMxC;AAaD,IAAY,4BAWX;AAXD,WAAY,4BAA4B;IACpC,2CAAW,CAAA;IACX,6CAAa,CAAA;IACb,2CAAW,CAAA;IACX,iDAAiB,CAAA;IACjB,+CAAe,CAAA;IACf,mDAAmB,CAAA;IACnB,6CAAa,CAAA;IACb,mDAAmB,CAAA;IACnB,+CAAe,CAAA;IACf,mDAAmB,CAAA;AACvB,CAAC,EAXW,4BAA4B,4CAA5B,4BAA4B,QAWvC"}
|
package/tests/app.test.ts
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { A_ARC_MaskQueryBuilder } from '@adaas/a-arc';
|
|
2
|
-
import { A_EXPRESS_App } from '@adaas/a-sdk/global/A_EXPRESS_App.class';
|
|
3
|
-
import { config } from 'dotenv';
|
|
4
|
-
config();
|
|
5
|
-
jest.retryTimes(0);
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
describe('App', () => {
|
|
9
|
-
it('Should create an app', async () => {
|
|
10
|
-
const app = new A_EXPRESS_App({
|
|
11
|
-
app: {
|
|
12
|
-
name: 'test',
|
|
13
|
-
},
|
|
14
|
-
context: {
|
|
15
|
-
namespace: 'test',
|
|
16
|
-
errors: []
|
|
17
|
-
},
|
|
18
|
-
routes: [
|
|
19
|
-
{
|
|
20
|
-
version: 'v1',
|
|
21
|
-
controllers: []
|
|
22
|
-
}
|
|
23
|
-
],
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
await app.start();
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
});
|
package/tests/decorator.test.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
// import { config } from 'dotenv';
|
|
2
|
-
// config();
|
|
3
|
-
// jest.retryTimes(0);
|
|
4
|
-
// import { A_EXPRESS_EntityController } from '@adaas/a-sdk/global/A_EXPRESS_EntityController.class';
|
|
5
|
-
// import { A_EXPRESS_TYPES__EntityControllerConfig } from '@adaas/a-sdk/types/A_EXPRESS_EntityController.types';
|
|
6
|
-
// import { A_EXPRESS_ValidateAccess } from '../src/decorators/ValidateAccess.decorator';
|
|
7
|
-
// import { A_SDK_TYPES__Required, A_SDK_TYPES__Dictionary } from '@adaas/a-sdk-types';
|
|
8
|
-
|
|
9
|
-
// describe('Decorators', () => {
|
|
10
|
-
// it('Should create decorator', async () => {
|
|
11
|
-
|
|
12
|
-
// class Test extends A_EXPRESS_EntityController {
|
|
13
|
-
|
|
14
|
-
// protected CONTROLLER_CONFIG: A_SDK_TYPES__Required<Partial<A_EXPRESS_TYPES__EntityControllerConfig<A_SDK_TYPES__Dictionary<any>>>, ['entity']> = {
|
|
15
|
-
// entity: 'users',
|
|
16
|
-
// };
|
|
17
|
-
|
|
18
|
-
// @A_EXPRESS_ValidateAccess<Test>((qb, self, req) => {
|
|
19
|
-
// return qb;
|
|
20
|
-
// })
|
|
21
|
-
// async test() {
|
|
22
|
-
// return 'test';
|
|
23
|
-
// }
|
|
24
|
-
// }
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
// const foo = new Test();
|
|
28
|
-
|
|
29
|
-
// await foo.test();
|
|
30
|
-
|
|
31
|
-
// });
|
|
32
|
-
|
|
33
|
-
// });
|