@webda/core 2.0.0-beta.3 → 2.0.0
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/lib/application.d.ts +5 -5
- package/lib/application.js +71 -84
- package/lib/application.js.map +1 -1
- package/lib/application.spec.js +121 -140
- package/lib/application.spec.js.map +1 -1
- package/lib/core.d.ts +20 -24
- package/lib/core.js +222 -315
- package/lib/core.js.map +1 -1
- package/lib/core.spec.js +332 -406
- package/lib/core.spec.js.map +1 -1
- package/lib/index.d.ts +49 -48
- package/lib/index.js +53 -70
- package/lib/index.js.map +1 -1
- package/lib/models/aclmodel.d.ts +2 -2
- package/lib/models/aclmodel.js +63 -90
- package/lib/models/aclmodel.js.map +1 -1
- package/lib/models/aclmodel.spec.js +127 -152
- package/lib/models/aclmodel.spec.js.map +1 -1
- package/lib/models/coremodel.d.ts +7 -6
- package/lib/models/coremodel.js +65 -113
- package/lib/models/coremodel.js.map +1 -1
- package/lib/models/coremodel.spec.js +88 -107
- package/lib/models/coremodel.spec.js.map +1 -1
- package/lib/models/deployment.js +1 -2
- package/lib/models/ident.d.ts +3 -3
- package/lib/models/ident.js +4 -9
- package/lib/models/ident.js.map +1 -1
- package/lib/models/ident.spec.js +9 -11
- package/lib/models/ident.spec.js.map +1 -1
- package/lib/models/ownermodel.d.ts +2 -2
- package/lib/models/ownermodel.js +39 -62
- package/lib/models/ownermodel.js.map +1 -1
- package/lib/models/ownermodel.spec.js +126 -168
- package/lib/models/ownermodel.spec.js.map +1 -1
- package/lib/models/rolemodel.d.ts +1 -1
- package/lib/models/rolemodel.js +24 -40
- package/lib/models/rolemodel.js.map +1 -1
- package/lib/models/rolemodel.spec.js +44 -63
- package/lib/models/rolemodel.spec.js.map +1 -1
- package/lib/models/user.d.ts +3 -3
- package/lib/models/user.js +3 -8
- package/lib/models/user.js.map +1 -1
- package/lib/models/user.spec.js +14 -16
- package/lib/models/user.spec.js.map +1 -1
- package/lib/queues/filequeue.d.ts +2 -2
- package/lib/queues/filequeue.js +72 -93
- package/lib/queues/filequeue.js.map +1 -1
- package/lib/queues/filequeue.spec.js +53 -70
- package/lib/queues/filequeue.spec.js.map +1 -1
- package/lib/queues/memoryqueue.d.ts +2 -2
- package/lib/queues/memoryqueue.js +37 -61
- package/lib/queues/memoryqueue.js.map +1 -1
- package/lib/queues/memoryqueue.spec.js +142 -165
- package/lib/queues/memoryqueue.spec.js.map +1 -1
- package/lib/queues/pubsubservice.d.ts +2 -2
- package/lib/queues/pubsubservice.js +3 -7
- package/lib/queues/pubsubservice.js.map +1 -1
- package/lib/queues/queue.spec.d.ts +1 -1
- package/lib/queues/queue.spec.js +42 -56
- package/lib/queues/queue.spec.js.map +1 -1
- package/lib/queues/queueservice.d.ts +3 -3
- package/lib/queues/queueservice.js +51 -67
- package/lib/queues/queueservice.js.map +1 -1
- package/lib/router.d.ts +3 -3
- package/lib/router.js +46 -47
- package/lib/router.js.map +1 -1
- package/lib/router.spec.js +64 -61
- package/lib/router.spec.js.map +1 -1
- package/lib/services/asyncevents.d.ts +2 -2
- package/lib/services/asyncevents.js +44 -64
- package/lib/services/asyncevents.js.map +1 -1
- package/lib/services/asyncevents.spec.js +81 -98
- package/lib/services/asyncevents.spec.js.map +1 -1
- package/lib/services/authentication.d.ts +23 -13
- package/lib/services/authentication.js +537 -563
- package/lib/services/authentication.js.map +1 -1
- package/lib/services/authentication.spec.js +411 -447
- package/lib/services/authentication.spec.js.map +1 -1
- package/lib/services/binary.d.ts +7 -5
- package/lib/services/binary.js +211 -244
- package/lib/services/binary.js.map +1 -1
- package/lib/services/binary.spec.d.ts +3 -3
- package/lib/services/binary.spec.js +390 -443
- package/lib/services/binary.spec.js.map +1 -1
- package/lib/services/cloudbinary.d.ts +3 -3
- package/lib/services/cloudbinary.js +45 -70
- package/lib/services/cloudbinary.js.map +1 -1
- package/lib/services/cloudbinary.spec.d.ts +3 -3
- package/lib/services/cloudbinary.spec.js +133 -162
- package/lib/services/cloudbinary.spec.js.map +1 -1
- package/lib/services/configuration.d.ts +1 -1
- package/lib/services/configuration.js +78 -105
- package/lib/services/configuration.js.map +1 -1
- package/lib/services/configuration.spec.js +63 -83
- package/lib/services/configuration.spec.js.map +1 -1
- package/lib/services/cron.d.ts +3 -2
- package/lib/services/cron.js +9 -13
- package/lib/services/cron.js.map +1 -1
- package/lib/services/cron.spec.js +18 -21
- package/lib/services/cron.spec.js.map +1 -1
- package/lib/services/cryptoservice.d.ts +9 -4
- package/lib/services/cryptoservice.js +187 -221
- package/lib/services/cryptoservice.js.map +1 -1
- package/lib/services/cryptoservice.spec.js +88 -115
- package/lib/services/cryptoservice.spec.js.map +1 -1
- package/lib/services/debugmailer.d.ts +1 -1
- package/lib/services/debugmailer.js +13 -34
- package/lib/services/debugmailer.js.map +1 -1
- package/lib/services/debugmailer.spec.js +16 -29
- package/lib/services/debugmailer.spec.js.map +1 -1
- package/lib/services/echo.d.ts +2 -2
- package/lib/services/echo.js +15 -31
- package/lib/services/echo.js.map +1 -1
- package/lib/services/echo.spec.js +27 -40
- package/lib/services/echo.spec.js.map +1 -1
- package/lib/services/filebinary.d.ts +5 -5
- package/lib/services/filebinary.js +165 -210
- package/lib/services/filebinary.js.map +1 -1
- package/lib/services/filebinary.spec.d.ts +2 -1
- package/lib/services/filebinary.spec.js +106 -116
- package/lib/services/filebinary.spec.js.map +1 -1
- package/lib/services/fileconfiguration.d.ts +1 -1
- package/lib/services/fileconfiguration.js +25 -44
- package/lib/services/fileconfiguration.js.map +1 -1
- package/lib/services/fileconfiguration.spec.js +79 -109
- package/lib/services/fileconfiguration.spec.js.map +1 -1
- package/lib/services/invitationservice.d.ts +7 -7
- package/lib/services/invitationservice.js +274 -314
- package/lib/services/invitationservice.js.map +1 -1
- package/lib/services/invitationservice.spec.js +442 -448
- package/lib/services/invitationservice.spec.js.map +1 -1
- package/lib/services/kubernetesconfiguration.d.ts +1 -1
- package/lib/services/kubernetesconfiguration.js +41 -60
- package/lib/services/kubernetesconfiguration.js.map +1 -1
- package/lib/services/kubernetesconfiguration.spec.js +80 -98
- package/lib/services/kubernetesconfiguration.spec.js.map +1 -1
- package/lib/services/mailer.d.ts +4 -4
- package/lib/services/mailer.js +62 -86
- package/lib/services/mailer.js.map +1 -1
- package/lib/services/mailer.spec.js +86 -127
- package/lib/services/mailer.spec.js.map +1 -1
- package/lib/services/notificationservice.d.ts +3 -3
- package/lib/services/notificationservice.js +21 -42
- package/lib/services/notificationservice.js.map +1 -1
- package/lib/services/notificationservice.spec.js +47 -73
- package/lib/services/notificationservice.spec.js.map +1 -1
- package/lib/services/oauth.d.ts +4 -4
- package/lib/services/oauth.js +68 -83
- package/lib/services/oauth.js.map +1 -1
- package/lib/services/oauth.spec.js +130 -156
- package/lib/services/oauth.spec.js.map +1 -1
- package/lib/services/proxy.d.ts +2 -6
- package/lib/services/proxy.js +45 -58
- package/lib/services/proxy.js.map +1 -1
- package/lib/services/proxy.spec.js +34 -53
- package/lib/services/proxy.spec.js.map +1 -1
- package/lib/services/resource.d.ts +2 -2
- package/lib/services/resource.js +12 -18
- package/lib/services/resource.js.map +1 -1
- package/lib/services/resource.spec.js +67 -99
- package/lib/services/resource.spec.js.map +1 -1
- package/lib/services/service.d.ts +26 -3
- package/lib/services/service.js +68 -40
- package/lib/services/service.js.map +1 -1
- package/lib/services/service.spec.js +62 -67
- package/lib/services/service.spec.js.map +1 -1
- package/lib/services/version.d.ts +1 -1
- package/lib/services/version.js +3 -8
- package/lib/services/version.js.map +1 -1
- package/lib/services/version.spec.js +11 -24
- package/lib/services/version.spec.js.map +1 -1
- package/lib/stores/aggregator.d.ts +2 -2
- package/lib/stores/aggregator.js +37 -58
- package/lib/stores/aggregator.js.map +1 -1
- package/lib/stores/file.d.ts +3 -3
- package/lib/stores/file.js +93 -131
- package/lib/stores/file.js.map +1 -1
- package/lib/stores/file.spec.d.ts +2 -2
- package/lib/stores/file.spec.js +261 -289
- package/lib/stores/file.spec.js.map +1 -1
- package/lib/stores/mapper.d.ts +3 -3
- package/lib/stores/mapper.js +110 -137
- package/lib/stores/mapper.js.map +1 -1
- package/lib/stores/mapper.spec.js +131 -150
- package/lib/stores/mapper.spec.js.map +1 -1
- package/lib/stores/memory.d.ts +3 -3
- package/lib/stores/memory.js +98 -144
- package/lib/stores/memory.js.map +1 -1
- package/lib/stores/memory.spec.d.ts +2 -2
- package/lib/stores/memory.spec.js +124 -145
- package/lib/stores/memory.spec.js.map +1 -1
- package/lib/stores/store.d.ts +17 -13
- package/lib/stores/store.js +819 -847
- package/lib/stores/store.js.map +1 -1
- package/lib/stores/store.spec.d.ts +5 -4
- package/lib/stores/store.spec.js +624 -669
- package/lib/stores/store.spec.js.map +1 -1
- package/lib/stores/webdaql/WebdaQLLexer.d.ts +4 -4
- package/lib/stores/webdaql/WebdaQLLexer.js +9 -13
- package/lib/stores/webdaql/WebdaQLLexer.js.map +1 -1
- package/lib/stores/webdaql/WebdaQLParserLexer.d.ts +4 -4
- package/lib/stores/webdaql/WebdaQLParserLexer.js +9 -13
- package/lib/stores/webdaql/WebdaQLParserLexer.js.map +1 -1
- package/lib/stores/webdaql/WebdaQLParserListener.d.ts +2 -2
- package/lib/stores/webdaql/WebdaQLParserListener.js +1 -2
- package/lib/stores/webdaql/WebdaQLParserListener.js.map +1 -1
- package/lib/stores/webdaql/WebdaQLParserParser.d.ts +10 -10
- package/lib/stores/webdaql/WebdaQLParserParser.js +62 -91
- package/lib/stores/webdaql/WebdaQLParserParser.js.map +1 -1
- package/lib/stores/webdaql/WebdaQLParserVisitor.d.ts +2 -2
- package/lib/stores/webdaql/WebdaQLParserVisitor.js +1 -2
- package/lib/stores/webdaql/WebdaQLParserVisitor.js.map +1 -1
- package/lib/stores/webdaql/query.d.ts +4 -5
- package/lib/stores/webdaql/query.js +16 -19
- package/lib/stores/webdaql/query.js.map +1 -1
- package/lib/stores/webdaql/query.spec.js +30 -32
- package/lib/stores/webdaql/query.spec.js.map +1 -1
- package/lib/test.d.ts +3 -3
- package/lib/test.js +73 -100
- package/lib/test.js.map +1 -1
- package/lib/unpackedapplication.d.ts +1 -1
- package/lib/unpackedapplication.js +25 -31
- package/lib/unpackedapplication.js.map +1 -1
- package/lib/utils/abstractdeployer.js +1 -5
- package/lib/utils/abstractdeployer.js.map +1 -1
- package/lib/utils/abstractdeployer.spec.js +6 -8
- package/lib/utils/abstractdeployer.spec.js.map +1 -1
- package/lib/utils/context.d.ts +7 -5
- package/lib/utils/context.js +95 -103
- package/lib/utils/context.js.map +1 -1
- package/lib/utils/context.spec.js +139 -163
- package/lib/utils/context.spec.js.map +1 -1
- package/lib/utils/cookie.d.ts +3 -3
- package/lib/utils/cookie.js +42 -61
- package/lib/utils/cookie.js.map +1 -1
- package/lib/utils/cookie.spec.js +42 -64
- package/lib/utils/cookie.spec.js.map +1 -1
- package/lib/utils/esm.d.ts +4 -0
- package/lib/utils/esm.js +10 -0
- package/lib/utils/esm.js.map +1 -0
- package/lib/utils/httpcontext.d.ts +3 -0
- package/lib/utils/httpcontext.js +48 -65
- package/lib/utils/httpcontext.js.map +1 -1
- package/lib/utils/httpcontext.spec.js +37 -56
- package/lib/utils/httpcontext.spec.js.map +1 -1
- package/lib/utils/logger.d.ts +2 -2
- package/lib/utils/logger.js +15 -28
- package/lib/utils/logger.js.map +1 -1
- package/lib/utils/logger.spec.js +9 -11
- package/lib/utils/logger.spec.js.map +1 -1
- package/lib/utils/serializers.js +17 -20
- package/lib/utils/serializers.js.map +1 -1
- package/lib/utils/serializers.spec.js +43 -44
- package/lib/utils/serializers.spec.js.map +1 -1
- package/lib/utils/session.d.ts +6 -6
- package/lib/utils/session.js +37 -59
- package/lib/utils/session.js.map +1 -1
- package/lib/utils/session.spec.js +38 -51
- package/lib/utils/session.spec.js.map +1 -1
- package/lib/utils/waiter.d.ts +1 -1
- package/lib/utils/waiter.js +32 -52
- package/lib/utils/waiter.js.map +1 -1
- package/lib/utils/waiter.spec.js +75 -92
- package/lib/utils/waiter.spec.js.map +1 -1
- package/package.json +17 -12
- package/test/config-invitation.json +1 -3
- package/test/config.json +1 -2
- package/test/config.old.json +1 -2
- package/test/moddas/annotatedservice.js +5 -5
- package/test/moddas/debugmailer.js +2 -3
- package/test/moddas/fakeservice.js +2 -3
- package/test/moddas/voidstore.js +6 -4
- package/test/models/ident.js +2 -6
- package/test/models/task.js +3 -7
- package/test/package.json +2 -1
- package/webda.module.json +956 -189
package/lib/core.js
CHANGED
|
@@ -1,37 +1,34 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const coremodel_1 = require("./models/coremodel");
|
|
24
|
-
const router_1 = require("./router");
|
|
1
|
+
import Ajv from "ajv";
|
|
2
|
+
import addFormats from "ajv-formats";
|
|
3
|
+
import { deepmerge } from "deepmerge-ts";
|
|
4
|
+
import * as events from "events";
|
|
5
|
+
import jsonpath from "jsonpath";
|
|
6
|
+
import pkg from "node-machine-id";
|
|
7
|
+
import { v4 as uuidv4 } from "uuid";
|
|
8
|
+
import { Context, Logger, Store } from "./index.js";
|
|
9
|
+
import { CoreModel } from "./models/coremodel.js";
|
|
10
|
+
import { Router } from "./router.js";
|
|
11
|
+
const { machineIdSync } = pkg;
|
|
12
|
+
/**
|
|
13
|
+
* Copy from https://github.com/ajv-validator/ajv/blob/master/lib/runtime/validation_error.ts
|
|
14
|
+
* It is not exported by ajv
|
|
15
|
+
*/
|
|
16
|
+
export class ValidationError extends Error {
|
|
17
|
+
constructor(errors) {
|
|
18
|
+
super("validation failed");
|
|
19
|
+
this.errors = errors;
|
|
20
|
+
this.ajv = this.validation = true;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
25
23
|
/**
|
|
26
24
|
*
|
|
27
25
|
*/
|
|
28
|
-
class RegistryEntry extends
|
|
26
|
+
export class RegistryEntry extends CoreModel {
|
|
29
27
|
}
|
|
30
|
-
exports.RegistryEntry = RegistryEntry;
|
|
31
28
|
/**
|
|
32
29
|
* Error with a code
|
|
33
30
|
*/
|
|
34
|
-
class WebdaError extends Error {
|
|
31
|
+
export class WebdaError extends Error {
|
|
35
32
|
/**
|
|
36
33
|
*
|
|
37
34
|
* @param code
|
|
@@ -48,13 +45,12 @@ class WebdaError extends Error {
|
|
|
48
45
|
return this.code;
|
|
49
46
|
}
|
|
50
47
|
}
|
|
51
|
-
exports.WebdaError = WebdaError;
|
|
52
48
|
/**
|
|
53
49
|
* Filter request based on their origin
|
|
54
50
|
*
|
|
55
51
|
* @category CoreFeatures
|
|
56
52
|
*/
|
|
57
|
-
class OriginFilter {
|
|
53
|
+
export class OriginFilter {
|
|
58
54
|
constructor(origins) {
|
|
59
55
|
this.regexs = origins.map(origin => {
|
|
60
56
|
if (!origin.endsWith("$")) {
|
|
@@ -71,26 +67,23 @@ class OriginFilter {
|
|
|
71
67
|
* @param context
|
|
72
68
|
* @returns
|
|
73
69
|
*/
|
|
74
|
-
checkRequest(context) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
return true;
|
|
80
|
-
}
|
|
81
|
-
if (httpContext.origin.match(regexp)) {
|
|
82
|
-
return true;
|
|
83
|
-
}
|
|
70
|
+
async checkRequest(context) {
|
|
71
|
+
let httpContext = context.getHttpContext();
|
|
72
|
+
for (let regexp of this.regexs) {
|
|
73
|
+
if (httpContext.hostname.match(regexp)) {
|
|
74
|
+
return true;
|
|
84
75
|
}
|
|
85
|
-
|
|
86
|
-
|
|
76
|
+
if (httpContext.origin.match(regexp)) {
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return false;
|
|
87
81
|
}
|
|
88
82
|
}
|
|
89
|
-
exports.OriginFilter = OriginFilter;
|
|
90
83
|
/**
|
|
91
84
|
* Authorize requests based on the website
|
|
92
85
|
*/
|
|
93
|
-
class WebsiteOriginFilter {
|
|
86
|
+
export class WebsiteOriginFilter {
|
|
94
87
|
constructor(website) {
|
|
95
88
|
this.websites = [];
|
|
96
89
|
if (!Array.isArray(website)) {
|
|
@@ -105,58 +98,35 @@ class WebsiteOriginFilter {
|
|
|
105
98
|
this.websites = [...website];
|
|
106
99
|
}
|
|
107
100
|
}
|
|
108
|
-
checkRequest(context) {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
return false;
|
|
117
|
-
});
|
|
101
|
+
async checkRequest(context) {
|
|
102
|
+
let httpContext = context.getHttpContext();
|
|
103
|
+
if (this.websites.indexOf(httpContext.origin) >= 0 ||
|
|
104
|
+
this.websites.indexOf(httpContext.host) >= 0 ||
|
|
105
|
+
this.websites.indexOf("*") >= 0) {
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
return false;
|
|
118
109
|
}
|
|
119
110
|
}
|
|
120
|
-
exports.WebsiteOriginFilter = WebsiteOriginFilter;
|
|
121
111
|
const beans = {};
|
|
122
112
|
// @Bean to declare as a Singleton service
|
|
123
|
-
function Bean(constructor) {
|
|
113
|
+
export function Bean(constructor) {
|
|
124
114
|
let name = constructor.name.toLowerCase();
|
|
125
115
|
beans[name] = beans[name] || { constructor };
|
|
126
|
-
beans[name] =
|
|
116
|
+
beans[name] = { ...beans[name], bean: true };
|
|
127
117
|
}
|
|
128
|
-
exports.Bean = Bean;
|
|
129
|
-
// @Route to declare route on Bean
|
|
130
|
-
function Route(route, methods = ["GET"], allowPath = false, openapi = {}) {
|
|
131
|
-
return function (target, executor) {
|
|
132
|
-
let targetName = target.constructor.name.toLowerCase();
|
|
133
|
-
beans[targetName] = beans[targetName] || {
|
|
134
|
-
constructor: target.constructor
|
|
135
|
-
};
|
|
136
|
-
beans[targetName].routes = beans[targetName].routes || {};
|
|
137
|
-
beans[targetName].routes[route] = beans[targetName].routes[route] || [];
|
|
138
|
-
beans[targetName].routes[route].push({
|
|
139
|
-
methods: Array.isArray(methods) ? methods : [methods],
|
|
140
|
-
executor,
|
|
141
|
-
allowPath,
|
|
142
|
-
openapi
|
|
143
|
-
});
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
exports.Route = Route;
|
|
147
118
|
/**
|
|
148
119
|
* This is the main class of the framework, it handles the routing, the services initialization and resolution
|
|
149
120
|
*
|
|
150
121
|
* @class Core
|
|
151
122
|
* @category CoreFeatures
|
|
152
123
|
*/
|
|
153
|
-
class Core extends events.EventEmitter {
|
|
124
|
+
export class Core extends events.EventEmitter {
|
|
154
125
|
/**
|
|
155
126
|
* @params {Object} config - The configuration Object, if undefined will load the configuration file
|
|
156
127
|
*/
|
|
157
128
|
constructor(application) {
|
|
158
129
|
var _a, _b, _c;
|
|
159
|
-
var _d, _e, _f;
|
|
160
130
|
/** @ignore */
|
|
161
131
|
super();
|
|
162
132
|
/**
|
|
@@ -167,7 +137,7 @@ class Core extends events.EventEmitter {
|
|
|
167
137
|
/**
|
|
168
138
|
* Router that will route http request in
|
|
169
139
|
*/
|
|
170
|
-
this.router = new
|
|
140
|
+
this.router = new Router(this);
|
|
171
141
|
/**
|
|
172
142
|
* If Core is already initiated
|
|
173
143
|
*/
|
|
@@ -191,21 +161,21 @@ class Core extends events.EventEmitter {
|
|
|
191
161
|
*/
|
|
192
162
|
this._requestCORSFilters = [];
|
|
193
163
|
this.workerOutput = application.getWorkerOutput();
|
|
194
|
-
this.logger = new
|
|
164
|
+
this.logger = new Logger(this.workerOutput, "@webda/core/lib/core.js");
|
|
195
165
|
this.application = application;
|
|
196
166
|
this._initTime = new Date().getTime();
|
|
197
167
|
// Schema validations
|
|
198
|
-
this._ajv = new
|
|
199
|
-
(
|
|
168
|
+
this._ajv = new Ajv();
|
|
169
|
+
addFormats(this._ajv);
|
|
200
170
|
this._ajvSchemas = {};
|
|
201
171
|
// Load the configuration and migrate
|
|
202
172
|
this.configuration = this.application.getCurrentConfiguration();
|
|
203
173
|
// Set the global context
|
|
204
|
-
|
|
174
|
+
Context.setGlobalContext(new (this.getModel(this.parameter("contextModel") || "Webda/Context"))(this));
|
|
205
175
|
// Init default values for configuration
|
|
206
|
-
(_a =
|
|
207
|
-
(_b =
|
|
208
|
-
(_c =
|
|
176
|
+
(_a = this.configuration).parameters ?? (_a.parameters = {});
|
|
177
|
+
(_b = this.configuration.parameters).apiUrl ?? (_b.apiUrl = "http://localhost:18080");
|
|
178
|
+
(_c = this.configuration).services ?? (_c.services = {});
|
|
209
179
|
// Add CSRF origins filtering
|
|
210
180
|
if (this.configuration.parameters.csrfOrigins) {
|
|
211
181
|
this.registerCORSFilter(new OriginFilter(this.configuration.parameters.csrfOrigins));
|
|
@@ -221,8 +191,7 @@ class Core extends events.EventEmitter {
|
|
|
221
191
|
* It is a random generated string
|
|
222
192
|
*/
|
|
223
193
|
getInstanceId() {
|
|
224
|
-
|
|
225
|
-
(_a = this.instanceId) !== null && _a !== void 0 ? _a : (this.instanceId = this.getUuid());
|
|
194
|
+
this.instanceId ?? (this.instanceId = this.getUuid());
|
|
226
195
|
return this.instanceId;
|
|
227
196
|
}
|
|
228
197
|
/**
|
|
@@ -246,21 +215,6 @@ class Core extends events.EventEmitter {
|
|
|
246
215
|
getAppPath(subpath = "") {
|
|
247
216
|
return this.application.getAppPath(subpath);
|
|
248
217
|
}
|
|
249
|
-
/**
|
|
250
|
-
* Reinit the @Route
|
|
251
|
-
*/
|
|
252
|
-
reinitResolvedRoutes() {
|
|
253
|
-
for (let i in beans) {
|
|
254
|
-
if (beans[i].routes) {
|
|
255
|
-
for (let j in beans[i].routes) {
|
|
256
|
-
beans[i].routes[j].forEach(r => {
|
|
257
|
-
r.resolved = false;
|
|
258
|
-
this.router.removeRoute(j, r.info);
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
218
|
/**
|
|
265
219
|
* Retrieve all detected modules definition
|
|
266
220
|
*/
|
|
@@ -283,109 +237,83 @@ class Core extends events.EventEmitter {
|
|
|
283
237
|
* Init one service
|
|
284
238
|
* @param service
|
|
285
239
|
*/
|
|
286
|
-
initService(service) {
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
this.log("TRACE", err.stack);
|
|
300
|
-
}
|
|
301
|
-
});
|
|
240
|
+
async initService(service) {
|
|
241
|
+
try {
|
|
242
|
+
// TODO Define parralel initialization
|
|
243
|
+
this.log("TRACE", "Initializing service", service);
|
|
244
|
+
this.services[service]._initTime = Date.now();
|
|
245
|
+
await this.services[service].init();
|
|
246
|
+
}
|
|
247
|
+
catch (err) {
|
|
248
|
+
this.services[service]._initException = err;
|
|
249
|
+
this.failedServices[service] = { _initException: err };
|
|
250
|
+
this.log("ERROR", "Init service " + service + " failed: " + err.message);
|
|
251
|
+
this.log("TRACE", err.stack);
|
|
252
|
+
}
|
|
302
253
|
}
|
|
303
254
|
/**
|
|
304
255
|
* Get an object from the application based on its full uuid
|
|
305
256
|
* @param fullUuid
|
|
306
257
|
* @param partials
|
|
307
258
|
*/
|
|
308
|
-
getModelObject(fullUuid, partials) {
|
|
309
|
-
return
|
|
310
|
-
return coremodel_1.CoreModel.fromFullUuid(this, fullUuid, partials);
|
|
311
|
-
});
|
|
259
|
+
async getModelObject(fullUuid, partials) {
|
|
260
|
+
return CoreModel.fromFullUuid(this, fullUuid, partials);
|
|
312
261
|
}
|
|
313
262
|
/**
|
|
314
263
|
* Init Webda
|
|
315
264
|
*
|
|
316
265
|
* It will resolve Services init method and autolink
|
|
317
266
|
*/
|
|
318
|
-
init() {
|
|
319
|
-
var _a, _b
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
this.configuration.
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
}
|
|
267
|
+
async init() {
|
|
268
|
+
var _a, _b;
|
|
269
|
+
if (this._init) {
|
|
270
|
+
return this._init;
|
|
271
|
+
}
|
|
272
|
+
if (this.configuration.parameters.configurationService) {
|
|
273
|
+
try {
|
|
274
|
+
this.log("INFO", "Create and init ConfigurationService", this.configuration.parameters.configurationService);
|
|
275
|
+
// Create the configuration service
|
|
276
|
+
this.createService(this.configuration.services, this.configuration.parameters.configurationService);
|
|
277
|
+
let cfg = await this.getService(this.configuration.parameters.configurationService).initConfiguration();
|
|
278
|
+
if (cfg.webda) {
|
|
279
|
+
(_a = cfg.webda).parameters ?? (_a.parameters = {});
|
|
280
|
+
(_b = cfg.webda).services ?? (_b.services = {});
|
|
281
|
+
this.configuration.parameters = { ...this.configuration.parameters, ...cfg.webda.parameters };
|
|
282
|
+
for (let i in this.configuration.services) {
|
|
283
|
+
this.configuration.services[i] = {
|
|
284
|
+
...deepmerge(this.configuration.services[i], cfg.webda.services[i] || {}),
|
|
285
|
+
type: this.configuration.services[i].type
|
|
286
|
+
};
|
|
338
287
|
}
|
|
339
|
-
yield this.getService(this.configuration.parameters.configurationService).init();
|
|
340
|
-
}
|
|
341
|
-
catch (err) {
|
|
342
|
-
this.log("ERROR", "Cannot use ConfigurationService", this.configuration.parameters.configurationService, err);
|
|
343
|
-
this.services = {};
|
|
344
288
|
}
|
|
289
|
+
await this.getService(this.configuration.parameters.configurationService).init();
|
|
345
290
|
}
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
this.
|
|
356
|
-
|
|
357
|
-
// Init
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
(_e = (_k = this.configuration.services)["SessionManager"]) !== null && _e !== void 0 ? _e : (_k["SessionManager"] = {
|
|
366
|
-
type: "webda/cookiesessionmanager"
|
|
367
|
-
});
|
|
368
|
-
// Init the other services
|
|
369
|
-
this.initStatics();
|
|
370
|
-
this.reinitResolvedRoutes();
|
|
371
|
-
this.log("TRACE", "Create Webda init promise");
|
|
372
|
-
this._init = new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
|
|
373
|
-
// Init services
|
|
374
|
-
let service;
|
|
375
|
-
let inits = [];
|
|
376
|
-
for (service in this.services) {
|
|
377
|
-
if (this.services[service].init !== undefined &&
|
|
378
|
-
!this.services[service]._createException &&
|
|
379
|
-
!this.services[service]._initTime) {
|
|
380
|
-
inits.push(this.initService(service));
|
|
381
|
-
}
|
|
291
|
+
catch (err) {
|
|
292
|
+
this.log("ERROR", "Cannot use ConfigurationService", this.configuration.parameters.configurationService, err);
|
|
293
|
+
this.services = {};
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// Init the other services
|
|
297
|
+
this.initStatics();
|
|
298
|
+
this.log("TRACE", "Create Webda init promise");
|
|
299
|
+
this._init = new Promise(async (resolve) => {
|
|
300
|
+
await this.initService("registry");
|
|
301
|
+
await this.initService("cryptoservice");
|
|
302
|
+
// Init services
|
|
303
|
+
let service;
|
|
304
|
+
let inits = [];
|
|
305
|
+
for (service in this.services) {
|
|
306
|
+
if (this.services[service].init !== undefined &&
|
|
307
|
+
!this.services[service]._createException &&
|
|
308
|
+
!this.services[service]._initTime) {
|
|
309
|
+
inits.push(this.initService(service));
|
|
382
310
|
}
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
return this._init;
|
|
311
|
+
}
|
|
312
|
+
await Promise.all(inits);
|
|
313
|
+
await this.emitSync("Webda.Init.Services", this.services);
|
|
314
|
+
resolve();
|
|
388
315
|
});
|
|
316
|
+
return this._init;
|
|
389
317
|
}
|
|
390
318
|
/**
|
|
391
319
|
* Register a request filtering
|
|
@@ -405,23 +333,6 @@ class Core extends events.EventEmitter {
|
|
|
405
333
|
registerCORSFilter(filter) {
|
|
406
334
|
this._requestCORSFilters.push(filter);
|
|
407
335
|
}
|
|
408
|
-
/**
|
|
409
|
-
*
|
|
410
|
-
* @param {Object} executor The executor to expose as executor
|
|
411
|
-
* @param {String} code to execute
|
|
412
|
-
*/
|
|
413
|
-
sandbox(code, context) {
|
|
414
|
-
context !== null && context !== void 0 ? context : (context = {
|
|
415
|
-
require: () => {
|
|
416
|
-
throw Error("not allowed");
|
|
417
|
-
}
|
|
418
|
-
});
|
|
419
|
-
context.module = {
|
|
420
|
-
exports: {}
|
|
421
|
-
};
|
|
422
|
-
vm.runInNewContext(code, context);
|
|
423
|
-
return context.module.exports();
|
|
424
|
-
}
|
|
425
336
|
/**
|
|
426
337
|
* Validate the object with schema
|
|
427
338
|
*
|
|
@@ -444,7 +355,7 @@ class Core extends events.EventEmitter {
|
|
|
444
355
|
if (this._ajv.validate(name, object)) {
|
|
445
356
|
return true;
|
|
446
357
|
}
|
|
447
|
-
throw new
|
|
358
|
+
throw new ValidationError(this._ajv.errors);
|
|
448
359
|
}
|
|
449
360
|
/**
|
|
450
361
|
* Return webda current version
|
|
@@ -481,7 +392,7 @@ class Core extends events.EventEmitter {
|
|
|
481
392
|
}
|
|
482
393
|
}
|
|
483
394
|
}
|
|
484
|
-
return new
|
|
395
|
+
return new Logger(this.workerOutput, className);
|
|
485
396
|
}
|
|
486
397
|
/**
|
|
487
398
|
* Add a route dynamicaly
|
|
@@ -545,7 +456,7 @@ class Core extends events.EventEmitter {
|
|
|
545
456
|
* @returns {{}}
|
|
546
457
|
*/
|
|
547
458
|
getStores() {
|
|
548
|
-
return this.getServicesOfType(
|
|
459
|
+
return this.getServicesOfType(Store);
|
|
549
460
|
}
|
|
550
461
|
/**
|
|
551
462
|
* Return a map of defined models
|
|
@@ -568,11 +479,11 @@ class Core extends events.EventEmitter {
|
|
|
568
479
|
updateContextWithRoute(ctx) {
|
|
569
480
|
let http = ctx.getHttpContext();
|
|
570
481
|
// Check mapping
|
|
571
|
-
|
|
482
|
+
let route = this.router.getRouteFromUrl(ctx, http.getMethod(), http.getRelativeUri());
|
|
572
483
|
if (route === undefined) {
|
|
573
484
|
return false;
|
|
574
485
|
}
|
|
575
|
-
ctx.setRoute(
|
|
486
|
+
ctx.setRoute({ ...this.configuration, ...route });
|
|
576
487
|
ctx.setExecutor(this.getService(route.executor));
|
|
577
488
|
return true;
|
|
578
489
|
}
|
|
@@ -608,41 +519,37 @@ class Core extends events.EventEmitter {
|
|
|
608
519
|
* Reinit one service
|
|
609
520
|
* @param service
|
|
610
521
|
*/
|
|
611
|
-
reinitService(service) {
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
}
|
|
622
|
-
});
|
|
522
|
+
async reinitService(service) {
|
|
523
|
+
try {
|
|
524
|
+
this.log("TRACE", "Re-Initializing service", service);
|
|
525
|
+
let serviceBean = this.services[service];
|
|
526
|
+
await serviceBean.reinit(this.getServiceParams(serviceBean.getName()));
|
|
527
|
+
}
|
|
528
|
+
catch (err) {
|
|
529
|
+
this.log("ERROR", "Re-Init service " + service + " failed", err);
|
|
530
|
+
this.log("TRACE", err.stack);
|
|
531
|
+
}
|
|
623
532
|
}
|
|
624
533
|
/**
|
|
625
534
|
* Reinit all services with updated parameters
|
|
626
535
|
* @param updates
|
|
627
536
|
* @returns
|
|
628
537
|
*/
|
|
629
|
-
reinit(updates) {
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
yield Promise.all(inits);
|
|
645
|
-
});
|
|
538
|
+
async reinit(updates) {
|
|
539
|
+
let configuration = JSON.parse(JSON.stringify(this.configuration.services));
|
|
540
|
+
for (let service in updates) {
|
|
541
|
+
jsonpath.value(configuration, service, updates[service]);
|
|
542
|
+
}
|
|
543
|
+
if (JSON.stringify(Object.keys(configuration)) !== JSON.stringify(Object.keys(this.configuration.services))) {
|
|
544
|
+
this.log("ERROR", "Configuration update cannot modify services");
|
|
545
|
+
throw new WebdaError("REINIT_SERVICE_INJECTION", "Configuration is not designed to add dynamically services");
|
|
546
|
+
}
|
|
547
|
+
this.configuration.services = configuration;
|
|
548
|
+
let inits = [];
|
|
549
|
+
for (let service in this.services) {
|
|
550
|
+
inits.push(this.reinitService(service));
|
|
551
|
+
}
|
|
552
|
+
await Promise.all(inits);
|
|
646
553
|
}
|
|
647
554
|
/**
|
|
648
555
|
* Get a full resolved service parameter
|
|
@@ -652,21 +559,20 @@ class Core extends events.EventEmitter {
|
|
|
652
559
|
* @returns
|
|
653
560
|
*/
|
|
654
561
|
getServiceParams(service, configuration = { parameters: {}, services: {} }) {
|
|
655
|
-
var _a
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
(
|
|
659
|
-
|
|
660
|
-
const params = (0, deepmerge_ts_1.deepmerge)(this.configuration.parameters || {}, configuration.parameters || {}, this.configuration.services[service] || {}, configuration.services[service] || {});
|
|
562
|
+
var _a;
|
|
563
|
+
configuration.parameters ?? (configuration.parameters = {});
|
|
564
|
+
configuration.services ?? (configuration.services = {});
|
|
565
|
+
(_a = configuration.services)[service] ?? (_a[service] = {});
|
|
566
|
+
const params = deepmerge(this.configuration.parameters || {}, configuration.parameters || {}, this.configuration.services[service] || {}, configuration.services[service] || {});
|
|
661
567
|
delete params.require;
|
|
662
568
|
return params;
|
|
663
569
|
}
|
|
664
570
|
createService(services, service) {
|
|
665
|
-
|
|
571
|
+
let type = services[service].type;
|
|
666
572
|
if (type === undefined) {
|
|
667
573
|
type = service;
|
|
668
574
|
}
|
|
669
|
-
|
|
575
|
+
let serviceConstructor = undefined;
|
|
670
576
|
try {
|
|
671
577
|
serviceConstructor = this.application.getModda(type);
|
|
672
578
|
}
|
|
@@ -693,9 +599,6 @@ class Core extends events.EventEmitter {
|
|
|
693
599
|
const services = this.configuration.services;
|
|
694
600
|
this.log("DEBUG", beans);
|
|
695
601
|
for (let i in beans) {
|
|
696
|
-
if (!beans[i].bean) {
|
|
697
|
-
this.log("DEBUG", "Implicit @Bean due to a @Route", beans[i].constructor.name);
|
|
698
|
-
}
|
|
699
602
|
let name = beans[i].constructor.name;
|
|
700
603
|
if (!services[name]) {
|
|
701
604
|
services[name] = {};
|
|
@@ -732,7 +635,7 @@ class Core extends events.EventEmitter {
|
|
|
732
635
|
* @returns
|
|
733
636
|
*/
|
|
734
637
|
getRegistry() {
|
|
735
|
-
return this.
|
|
638
|
+
return this.registry;
|
|
736
639
|
}
|
|
737
640
|
/**
|
|
738
641
|
* Return the crypto service
|
|
@@ -777,39 +680,42 @@ class Core extends events.EventEmitter {
|
|
|
777
680
|
* Init services and Beans along with Routes
|
|
778
681
|
*/
|
|
779
682
|
initStatics() {
|
|
683
|
+
var _a, _b, _c;
|
|
684
|
+
// Init the registry
|
|
685
|
+
const autoRegistry = this.configuration.services["Registry"] === undefined;
|
|
686
|
+
(_a = this.configuration.services)["Registry"] ?? (_a["Registry"] = {
|
|
687
|
+
type: "webda/memorystore",
|
|
688
|
+
persistence: {
|
|
689
|
+
path: ".registry",
|
|
690
|
+
key: machineIdSync()
|
|
691
|
+
}
|
|
692
|
+
});
|
|
693
|
+
this.createService(this.configuration.services, "Registry");
|
|
694
|
+
this.registry = this.getService("Registry").resolve();
|
|
695
|
+
// Init the key service
|
|
696
|
+
(_b = this.configuration.services)["CryptoService"] ?? (_b["CryptoService"] = {
|
|
697
|
+
type: "webda/cryptoservice",
|
|
698
|
+
autoRotate: autoRegistry ? 30 : undefined,
|
|
699
|
+
autoCreate: true
|
|
700
|
+
});
|
|
701
|
+
this.createService(this.configuration.services, "CryptoService");
|
|
702
|
+
this.cryptoService = this.getService("CryptoService").resolve();
|
|
703
|
+
// Session Manager
|
|
704
|
+
(_c = this.configuration.services)["SessionManager"] ?? (_c["SessionManager"] = {
|
|
705
|
+
type: "webda/cookiesessionmanager"
|
|
706
|
+
});
|
|
780
707
|
if (this.configuration.services !== undefined) {
|
|
708
|
+
let excludes = ["registry", "cryptoservice"];
|
|
709
|
+
if (this.configuration.parameters.configurationService) {
|
|
710
|
+
excludes.push(this.configuration.parameters.configurationService.toLowerCase());
|
|
711
|
+
}
|
|
781
712
|
// Do not recreate the configuration services
|
|
782
|
-
this.createServices(
|
|
713
|
+
this.createServices(excludes);
|
|
783
714
|
}
|
|
784
715
|
this.router.remapRoutes();
|
|
785
716
|
this._initiated = true;
|
|
786
717
|
this.emit("Webda.Init", this.configuration);
|
|
787
718
|
}
|
|
788
|
-
/**
|
|
789
|
-
* Init Routes declare by @Route annotation
|
|
790
|
-
*/
|
|
791
|
-
initBeanRoutes(serviceBean) {
|
|
792
|
-
let service = serviceBean.getName().toLowerCase();
|
|
793
|
-
if (beans[service] !== undefined && beans[service].routes) {
|
|
794
|
-
for (let j in beans[service].routes) {
|
|
795
|
-
this.log("TRACE", "Adding route", j, "for bean", service);
|
|
796
|
-
beans[service].routes[j].forEach(route => {
|
|
797
|
-
if (route.resolved) {
|
|
798
|
-
return;
|
|
799
|
-
}
|
|
800
|
-
route.info = {
|
|
801
|
-
methods: route.methods,
|
|
802
|
-
_method: this.services[service][route.executor],
|
|
803
|
-
allowPath: route.allowPath || false,
|
|
804
|
-
openapi: route.openapi,
|
|
805
|
-
executor: beans[service].constructor.name // Name of the service
|
|
806
|
-
};
|
|
807
|
-
this.addRoute(j, route.info);
|
|
808
|
-
route.resolved = true;
|
|
809
|
-
});
|
|
810
|
-
}
|
|
811
|
-
}
|
|
812
|
-
}
|
|
813
719
|
/**
|
|
814
720
|
* Create a new context for a request
|
|
815
721
|
*
|
|
@@ -818,15 +724,13 @@ class Core extends events.EventEmitter {
|
|
|
818
724
|
* @param stream - The request output stream if any
|
|
819
725
|
* @return A new context object to pass along
|
|
820
726
|
*/
|
|
821
|
-
newContext(httpContext, stream = undefined, noInit = false) {
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
return res;
|
|
829
|
-
});
|
|
727
|
+
async newContext(httpContext, stream = undefined, noInit = false) {
|
|
728
|
+
let res = (new (this.getModel(this.parameter("contextModel") || "Webda/Context"))(this, httpContext, stream));
|
|
729
|
+
if (!noInit) {
|
|
730
|
+
await res.init();
|
|
731
|
+
}
|
|
732
|
+
await this.emitSync("Webda.NewContext", res);
|
|
733
|
+
return res;
|
|
830
734
|
}
|
|
831
735
|
/**
|
|
832
736
|
* Convert an object to JSON using the Webda json filter
|
|
@@ -846,10 +750,10 @@ class Core extends events.EventEmitter {
|
|
|
846
750
|
*/
|
|
847
751
|
getUuid(format = "uuid") {
|
|
848
752
|
if (format === "uuid") {
|
|
849
|
-
return (
|
|
753
|
+
return uuidv4().toString();
|
|
850
754
|
}
|
|
851
755
|
let buffer = Buffer.alloc(16);
|
|
852
|
-
(
|
|
756
|
+
uuidv4(undefined, buffer);
|
|
853
757
|
if (format === "base64") {
|
|
854
758
|
// Remove useless = we won't transfer back to original value or could just add ==
|
|
855
759
|
// https://datatracker.ietf.org/doc/html/rfc4648#page-7
|
|
@@ -867,9 +771,9 @@ class Core extends events.EventEmitter {
|
|
|
867
771
|
* Emit the event with data and wait for Promise to finish if listener returned a Promise
|
|
868
772
|
*/
|
|
869
773
|
emitSync(eventType, event, ...data) {
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
774
|
+
let result;
|
|
775
|
+
let promises = [];
|
|
776
|
+
let listeners = this.listeners(eventType);
|
|
873
777
|
for (let listener of listeners) {
|
|
874
778
|
result = listener(event, ...data);
|
|
875
779
|
if (result instanceof Promise) {
|
|
@@ -908,28 +812,23 @@ class Core extends events.EventEmitter {
|
|
|
908
812
|
*
|
|
909
813
|
* @param context Context of the request
|
|
910
814
|
*/
|
|
911
|
-
checkRequest(ctx) {
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
return (yield Promise.all(this._requestFilters.map(filter => filter.checkRequest(ctx)))).some(v => v);
|
|
918
|
-
});
|
|
815
|
+
async checkRequest(ctx) {
|
|
816
|
+
// Do not need to filter on OPTIONS as CORS is for that
|
|
817
|
+
if (ctx.getHttpContext().getMethod() === "OPTIONS") {
|
|
818
|
+
return true;
|
|
819
|
+
}
|
|
820
|
+
return (await Promise.all(this._requestFilters.map(filter => filter.checkRequest(ctx)))).some(v => v);
|
|
919
821
|
}
|
|
920
822
|
/**
|
|
921
823
|
* Verify if an origin is allowed to do request on the API
|
|
922
824
|
*
|
|
923
825
|
* @param context Context of the request
|
|
924
826
|
*/
|
|
925
|
-
checkCORSRequest(ctx) {
|
|
926
|
-
return
|
|
927
|
-
return (yield Promise.all(this._requestCORSFilters.map(filter => filter.checkRequest(ctx)))).some(v => v);
|
|
928
|
-
});
|
|
827
|
+
async checkCORSRequest(ctx) {
|
|
828
|
+
return (await Promise.all(this._requestCORSFilters.map(filter => filter.checkRequest(ctx)))).some(v => v);
|
|
929
829
|
}
|
|
930
830
|
exportOpenAPI(skipHidden = true) {
|
|
931
831
|
var _a;
|
|
932
|
-
var _b;
|
|
933
832
|
let packageInfo = this.application.getPackageDescription();
|
|
934
833
|
let contact;
|
|
935
834
|
if (typeof packageInfo.author === "string") {
|
|
@@ -949,7 +848,7 @@ class Core extends events.EventEmitter {
|
|
|
949
848
|
else if (packageInfo.license) {
|
|
950
849
|
license = packageInfo.license;
|
|
951
850
|
}
|
|
952
|
-
let openapi =
|
|
851
|
+
let openapi = deepmerge({
|
|
953
852
|
openapi: "3.0.3",
|
|
954
853
|
info: {
|
|
955
854
|
description: packageInfo.description,
|
|
@@ -959,11 +858,11 @@ class Core extends events.EventEmitter {
|
|
|
959
858
|
contact,
|
|
960
859
|
license
|
|
961
860
|
},
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
861
|
+
components: {
|
|
862
|
+
schemas: {
|
|
863
|
+
Object: {
|
|
864
|
+
type: "object"
|
|
865
|
+
}
|
|
967
866
|
}
|
|
968
867
|
},
|
|
969
868
|
paths: {},
|
|
@@ -976,21 +875,30 @@ class Core extends events.EventEmitter {
|
|
|
976
875
|
type: "object"
|
|
977
876
|
};
|
|
978
877
|
let modelDescription = this.getModel(i);
|
|
878
|
+
let modelName = model.name || i.split("/").pop();
|
|
979
879
|
// Only export CoreModel info
|
|
980
|
-
if (!this.application.extends(modelDescription,
|
|
880
|
+
if (!this.application.extends(modelDescription, CoreModel)) {
|
|
981
881
|
continue;
|
|
982
882
|
}
|
|
983
883
|
let schema = this.application.getSchema(i);
|
|
984
884
|
if (schema) {
|
|
985
885
|
for (let j in schema.definitions) {
|
|
986
886
|
// @ts-ignore
|
|
987
|
-
(_a =
|
|
887
|
+
(_a = openapi.components.schemas)[j] ?? (_a[j] = schema.definitions[j]);
|
|
988
888
|
}
|
|
989
889
|
delete schema.definitions;
|
|
990
890
|
desc = schema;
|
|
991
891
|
}
|
|
992
|
-
//
|
|
993
|
-
|
|
892
|
+
// Remove empty required as openapi does not like that
|
|
893
|
+
// Our compiler is not generating this anymore but it is additional protection
|
|
894
|
+
/* c8 ignore next 3 */
|
|
895
|
+
if (desc.required && desc.required.length === 0) {
|
|
896
|
+
delete desc.required;
|
|
897
|
+
}
|
|
898
|
+
// Remove $schema
|
|
899
|
+
delete desc.$schema;
|
|
900
|
+
// Rename all #/definitions/ by #/components/schemas/
|
|
901
|
+
openapi.components.schemas[modelName] = JSON.parse(JSON.stringify(desc).replace(/#\/definitions\//g, "#/components/schemas/"));
|
|
994
902
|
}
|
|
995
903
|
this.router.completeOpenAPI(openapi, skipHidden);
|
|
996
904
|
openapi.tags.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase()));
|
|
@@ -1002,5 +910,4 @@ class Core extends events.EventEmitter {
|
|
|
1002
910
|
return openapi;
|
|
1003
911
|
}
|
|
1004
912
|
}
|
|
1005
|
-
exports.Core = Core;
|
|
1006
913
|
//# sourceMappingURL=core.js.map
|