@webda/core 2.0.0-beta.2 → 2.0.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.
- package/lib/application.d.ts +5 -21
- 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 +44 -45
- package/lib/core.js +239 -320
- package/lib/core.js.map +1 -1
- package/lib/core.spec.js +326 -391
- package/lib/core.spec.js.map +1 -1
- package/lib/index.d.ts +49 -45
- package/lib/index.js +54 -67
- 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 +128 -151
- package/lib/models/aclmodel.spec.js.map +1 -1
- package/lib/models/coremodel.d.ts +39 -17
- package/lib/models/coremodel.js +160 -117
- package/lib/models/coremodel.js.map +1 -1
- package/lib/models/coremodel.spec.js +143 -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 -166
- package/lib/models/ownermodel.spec.js.map +1 -1
- package/lib/models/rolemodel.d.ts +2 -2
- package/lib/models/rolemodel.js +24 -40
- package/lib/models/rolemodel.js.map +1 -1
- package/lib/models/rolemodel.spec.js +44 -61
- package/lib/models/rolemodel.spec.js.map +1 -1
- package/lib/models/user.d.ts +9 -9
- 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 +4 -4
- package/lib/queues/queueservice.js +52 -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 +28 -19
- package/lib/services/authentication.js +542 -574
- 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 +9 -7
- package/lib/services/binary.js +213 -245
- 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 +6 -3
- package/lib/services/configuration.js +78 -103
- 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 +258 -0
- package/lib/services/cryptoservice.js +312 -0
- package/lib/services/cryptoservice.js.map +1 -0
- package/lib/services/cryptoservice.spec.d.ts +1 -0
- package/lib/services/cryptoservice.spec.js +137 -0
- package/lib/services/cryptoservice.spec.js.map +1 -0
- 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 +10 -5
- package/lib/services/filebinary.js +171 -205
- package/lib/services/filebinary.js.map +1 -1
- package/lib/services/filebinary.spec.d.ts +2 -1
- package/lib/services/filebinary.spec.js +106 -117
- package/lib/services/filebinary.spec.js.map +1 -1
- package/lib/services/fileconfiguration.d.ts +2 -2
- package/lib/services/fileconfiguration.js +25 -43
- 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 +10 -10
- package/lib/services/invitationservice.js +275 -313
- package/lib/services/invitationservice.js.map +1 -1
- package/lib/services/invitationservice.spec.js +443 -449
- package/lib/services/invitationservice.spec.js.map +1 -1
- package/lib/services/kubernetesconfiguration.d.ts +2 -2
- package/lib/services/kubernetesconfiguration.js +41 -59
- 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 +4 -4
- package/lib/services/notificationservice.js +23 -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 +32 -6
- package/lib/services/oauth.js +73 -78
- package/lib/services/oauth.js.map +1 -1
- package/lib/services/oauth.spec.js +128 -148
- package/lib/services/oauth.spec.js.map +1 -1
- package/lib/services/proxy.d.ts +74 -0
- package/lib/services/proxy.js +126 -0
- package/lib/services/proxy.js.map +1 -0
- package/lib/services/proxy.spec.d.ts +1 -0
- package/lib/services/proxy.spec.js +59 -0
- package/lib/services/proxy.spec.js.map +1 -0
- 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 +29 -6
- package/lib/services/service.js +69 -39
- 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 +3 -3
- package/lib/stores/aggregator.js +37 -57
- 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 +262 -289
- package/lib/stores/file.spec.js.map +1 -1
- package/lib/stores/mapper.d.ts +4 -4
- package/lib/stores/mapper.js +111 -137
- package/lib/stores/mapper.js.map +1 -1
- package/lib/stores/mapper.spec.js +133 -150
- package/lib/stores/mapper.spec.js.map +1 -1
- package/lib/stores/memory.d.ts +67 -6
- package/lib/stores/memory.js +155 -117
- package/lib/stores/memory.js.map +1 -1
- package/lib/stores/memory.spec.d.ts +3 -2
- package/lib/stores/memory.spec.js +127 -105
- package/lib/stores/memory.spec.js.map +1 -1
- package/lib/stores/store.d.ts +40 -16
- package/lib/stores/store.js +847 -830
- package/lib/stores/store.js.map +1 -1
- package/lib/stores/store.spec.d.ts +6 -4
- package/lib/stores/store.spec.js +628 -647
- 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 +74 -94
- package/lib/test.js.map +1 -1
- package/lib/unpackedapplication.d.ts +1 -1
- package/lib/unpackedapplication.js +44 -38
- 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 +61 -29
- package/lib/utils/context.js +133 -127
- package/lib/utils/context.js.map +1 -1
- package/lib/utils/context.spec.js +144 -153
- package/lib/utils/context.spec.js.map +1 -1
- package/lib/utils/cookie.d.ts +66 -45
- package/lib/utils/cookie.js +69 -158
- package/lib/utils/cookie.js.map +1 -1
- package/lib/utils/cookie.spec.js +220 -238
- 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 +120 -0
- package/lib/utils/session.js +155 -0
- package/lib/utils/session.js.map +1 -0
- package/lib/utils/session.spec.d.ts +1 -0
- package/lib/utils/session.spec.js +66 -0
- package/lib/utils/session.spec.js.map +1 -0
- 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 +22 -14
- package/test/config-invitation.json +1 -3
- package/test/config.json +3 -3
- 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 +895 -189
package/lib/core.js
CHANGED
|
@@ -1,31 +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
|
-
|
|
24
|
-
|
|
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
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
*
|
|
25
|
+
*/
|
|
26
|
+
export class RegistryEntry extends CoreModel {
|
|
27
|
+
}
|
|
25
28
|
/**
|
|
26
29
|
* Error with a code
|
|
27
30
|
*/
|
|
28
|
-
class WebdaError extends Error {
|
|
31
|
+
export class WebdaError extends Error {
|
|
29
32
|
/**
|
|
30
33
|
*
|
|
31
34
|
* @param code
|
|
@@ -42,13 +45,12 @@ class WebdaError extends Error {
|
|
|
42
45
|
return this.code;
|
|
43
46
|
}
|
|
44
47
|
}
|
|
45
|
-
exports.WebdaError = WebdaError;
|
|
46
48
|
/**
|
|
47
49
|
* Filter request based on their origin
|
|
48
50
|
*
|
|
49
51
|
* @category CoreFeatures
|
|
50
52
|
*/
|
|
51
|
-
class OriginFilter {
|
|
53
|
+
export class OriginFilter {
|
|
52
54
|
constructor(origins) {
|
|
53
55
|
this.regexs = origins.map(origin => {
|
|
54
56
|
if (!origin.endsWith("$")) {
|
|
@@ -65,26 +67,23 @@ class OriginFilter {
|
|
|
65
67
|
* @param context
|
|
66
68
|
* @returns
|
|
67
69
|
*/
|
|
68
|
-
checkRequest(context) {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
return true;
|
|
74
|
-
}
|
|
75
|
-
if (httpContext.origin.match(regexp)) {
|
|
76
|
-
return true;
|
|
77
|
-
}
|
|
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;
|
|
78
75
|
}
|
|
79
|
-
|
|
80
|
-
|
|
76
|
+
if (httpContext.origin.match(regexp)) {
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return false;
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
|
-
exports.OriginFilter = OriginFilter;
|
|
84
83
|
/**
|
|
85
84
|
* Authorize requests based on the website
|
|
86
85
|
*/
|
|
87
|
-
class WebsiteOriginFilter {
|
|
86
|
+
export class WebsiteOriginFilter {
|
|
88
87
|
constructor(website) {
|
|
89
88
|
this.websites = [];
|
|
90
89
|
if (!Array.isArray(website)) {
|
|
@@ -99,58 +98,35 @@ class WebsiteOriginFilter {
|
|
|
99
98
|
this.websites = [...website];
|
|
100
99
|
}
|
|
101
100
|
}
|
|
102
|
-
checkRequest(context) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
return false;
|
|
111
|
-
});
|
|
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;
|
|
112
109
|
}
|
|
113
110
|
}
|
|
114
|
-
exports.WebsiteOriginFilter = WebsiteOriginFilter;
|
|
115
111
|
const beans = {};
|
|
116
112
|
// @Bean to declare as a Singleton service
|
|
117
|
-
function Bean(constructor) {
|
|
113
|
+
export function Bean(constructor) {
|
|
118
114
|
let name = constructor.name.toLowerCase();
|
|
119
115
|
beans[name] = beans[name] || { constructor };
|
|
120
|
-
beans[name] =
|
|
121
|
-
}
|
|
122
|
-
exports.Bean = Bean;
|
|
123
|
-
// @Route to declare route on Bean
|
|
124
|
-
function Route(route, methods = ["GET"], allowPath = false, openapi = {}) {
|
|
125
|
-
return function (target, executor) {
|
|
126
|
-
let targetName = target.constructor.name.toLowerCase();
|
|
127
|
-
beans[targetName] = beans[targetName] || {
|
|
128
|
-
constructor: target.constructor
|
|
129
|
-
};
|
|
130
|
-
beans[targetName].routes = beans[targetName].routes || {};
|
|
131
|
-
beans[targetName].routes[route] = beans[targetName].routes[route] || [];
|
|
132
|
-
beans[targetName].routes[route].push({
|
|
133
|
-
methods: Array.isArray(methods) ? methods : [methods],
|
|
134
|
-
executor,
|
|
135
|
-
allowPath,
|
|
136
|
-
openapi
|
|
137
|
-
});
|
|
138
|
-
};
|
|
116
|
+
beans[name] = { ...beans[name], bean: true };
|
|
139
117
|
}
|
|
140
|
-
exports.Route = Route;
|
|
141
118
|
/**
|
|
142
119
|
* This is the main class of the framework, it handles the routing, the services initialization and resolution
|
|
143
120
|
*
|
|
144
121
|
* @class Core
|
|
145
122
|
* @category CoreFeatures
|
|
146
123
|
*/
|
|
147
|
-
class Core extends events.EventEmitter {
|
|
124
|
+
export class Core extends events.EventEmitter {
|
|
148
125
|
/**
|
|
149
126
|
* @params {Object} config - The configuration Object, if undefined will load the configuration file
|
|
150
127
|
*/
|
|
151
128
|
constructor(application) {
|
|
152
129
|
var _a, _b, _c;
|
|
153
|
-
var _d, _e, _f;
|
|
154
130
|
/** @ignore */
|
|
155
131
|
super();
|
|
156
132
|
/**
|
|
@@ -161,7 +137,7 @@ class Core extends events.EventEmitter {
|
|
|
161
137
|
/**
|
|
162
138
|
* Router that will route http request in
|
|
163
139
|
*/
|
|
164
|
-
this.router = new
|
|
140
|
+
this.router = new Router(this);
|
|
165
141
|
/**
|
|
166
142
|
* If Core is already initiated
|
|
167
143
|
*/
|
|
@@ -185,21 +161,21 @@ class Core extends events.EventEmitter {
|
|
|
185
161
|
*/
|
|
186
162
|
this._requestCORSFilters = [];
|
|
187
163
|
this.workerOutput = application.getWorkerOutput();
|
|
188
|
-
this.logger = new
|
|
164
|
+
this.logger = new Logger(this.workerOutput, "@webda/core/lib/core.js");
|
|
189
165
|
this.application = application;
|
|
190
166
|
this._initTime = new Date().getTime();
|
|
191
167
|
// Schema validations
|
|
192
|
-
this._ajv = new
|
|
193
|
-
(
|
|
168
|
+
this._ajv = new Ajv();
|
|
169
|
+
addFormats(this._ajv);
|
|
194
170
|
this._ajvSchemas = {};
|
|
195
171
|
// Load the configuration and migrate
|
|
196
172
|
this.configuration = this.application.getCurrentConfiguration();
|
|
197
173
|
// Set the global context
|
|
198
|
-
|
|
174
|
+
Context.setGlobalContext(new (this.getModel(this.parameter("contextModel") || "Webda/Context"))(this));
|
|
199
175
|
// Init default values for configuration
|
|
200
|
-
(_a =
|
|
201
|
-
(_b =
|
|
202
|
-
(_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 = {});
|
|
203
179
|
// Add CSRF origins filtering
|
|
204
180
|
if (this.configuration.parameters.csrfOrigins) {
|
|
205
181
|
this.registerCORSFilter(new OriginFilter(this.configuration.parameters.csrfOrigins));
|
|
@@ -215,8 +191,7 @@ class Core extends events.EventEmitter {
|
|
|
215
191
|
* It is a random generated string
|
|
216
192
|
*/
|
|
217
193
|
getInstanceId() {
|
|
218
|
-
|
|
219
|
-
(_a = this.instanceId) !== null && _a !== void 0 ? _a : (this.instanceId = this.getUuid());
|
|
194
|
+
this.instanceId ?? (this.instanceId = this.getUuid());
|
|
220
195
|
return this.instanceId;
|
|
221
196
|
}
|
|
222
197
|
/**
|
|
@@ -240,21 +215,6 @@ class Core extends events.EventEmitter {
|
|
|
240
215
|
getAppPath(subpath = "") {
|
|
241
216
|
return this.application.getAppPath(subpath);
|
|
242
217
|
}
|
|
243
|
-
/**
|
|
244
|
-
* Reinit the @Route
|
|
245
|
-
*/
|
|
246
|
-
reinitResolvedRoutes() {
|
|
247
|
-
for (let i in beans) {
|
|
248
|
-
if (beans[i].routes) {
|
|
249
|
-
for (let j in beans[i].routes) {
|
|
250
|
-
beans[i].routes[j].forEach(r => {
|
|
251
|
-
r.resolved = false;
|
|
252
|
-
this.router.removeRoute(j, r.info);
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
218
|
/**
|
|
259
219
|
* Retrieve all detected modules definition
|
|
260
220
|
*/
|
|
@@ -277,86 +237,83 @@ class Core extends events.EventEmitter {
|
|
|
277
237
|
* Init one service
|
|
278
238
|
* @param service
|
|
279
239
|
*/
|
|
280
|
-
initService(service) {
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
this.log("TRACE", err.stack);
|
|
294
|
-
}
|
|
295
|
-
});
|
|
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
|
+
}
|
|
296
253
|
}
|
|
297
254
|
/**
|
|
298
255
|
* Get an object from the application based on its full uuid
|
|
299
256
|
* @param fullUuid
|
|
300
257
|
* @param partials
|
|
301
258
|
*/
|
|
302
|
-
getModelObject(fullUuid, partials) {
|
|
303
|
-
return
|
|
304
|
-
return coremodel_1.CoreModel.fromFullUuid(this, fullUuid, partials);
|
|
305
|
-
});
|
|
259
|
+
async getModelObject(fullUuid, partials) {
|
|
260
|
+
return CoreModel.fromFullUuid(this, fullUuid, partials);
|
|
306
261
|
}
|
|
307
262
|
/**
|
|
308
263
|
* Init Webda
|
|
309
264
|
*
|
|
310
265
|
* It will resolve Services init method and autolink
|
|
311
266
|
*/
|
|
312
|
-
init() {
|
|
267
|
+
async init() {
|
|
313
268
|
var _a, _b;
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
this.configuration.
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
}
|
|
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
|
+
};
|
|
332
287
|
}
|
|
333
|
-
yield this.getService(this.configuration.parameters.configurationService).init();
|
|
334
|
-
}
|
|
335
|
-
catch (err) {
|
|
336
|
-
this.log("ERROR", "Cannot use ConfigurationService", this.configuration.parameters.configurationService, err);
|
|
337
|
-
this.services = {};
|
|
338
288
|
}
|
|
289
|
+
await this.getService(this.configuration.parameters.configurationService).init();
|
|
339
290
|
}
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
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));
|
|
353
310
|
}
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
return this._init;
|
|
311
|
+
}
|
|
312
|
+
await Promise.all(inits);
|
|
313
|
+
await this.emitSync("Webda.Init.Services", this.services);
|
|
314
|
+
resolve();
|
|
359
315
|
});
|
|
316
|
+
return this._init;
|
|
360
317
|
}
|
|
361
318
|
/**
|
|
362
319
|
* Register a request filtering
|
|
@@ -376,23 +333,6 @@ class Core extends events.EventEmitter {
|
|
|
376
333
|
registerCORSFilter(filter) {
|
|
377
334
|
this._requestCORSFilters.push(filter);
|
|
378
335
|
}
|
|
379
|
-
/**
|
|
380
|
-
*
|
|
381
|
-
* @param {Object} executor The executor to expose as executor
|
|
382
|
-
* @param {String} code to execute
|
|
383
|
-
*/
|
|
384
|
-
sandbox(code, context) {
|
|
385
|
-
context !== null && context !== void 0 ? context : (context = {
|
|
386
|
-
require: () => {
|
|
387
|
-
throw Error("not allowed");
|
|
388
|
-
}
|
|
389
|
-
});
|
|
390
|
-
context.module = {
|
|
391
|
-
exports: {}
|
|
392
|
-
};
|
|
393
|
-
vm.runInNewContext(code, context);
|
|
394
|
-
return context.module.exports();
|
|
395
|
-
}
|
|
396
336
|
/**
|
|
397
337
|
* Validate the object with schema
|
|
398
338
|
*
|
|
@@ -415,7 +355,7 @@ class Core extends events.EventEmitter {
|
|
|
415
355
|
if (this._ajv.validate(name, object)) {
|
|
416
356
|
return true;
|
|
417
357
|
}
|
|
418
|
-
throw new
|
|
358
|
+
throw new ValidationError(this._ajv.errors);
|
|
419
359
|
}
|
|
420
360
|
/**
|
|
421
361
|
* Return webda current version
|
|
@@ -452,7 +392,7 @@ class Core extends events.EventEmitter {
|
|
|
452
392
|
}
|
|
453
393
|
}
|
|
454
394
|
}
|
|
455
|
-
return new
|
|
395
|
+
return new Logger(this.workerOutput, className);
|
|
456
396
|
}
|
|
457
397
|
/**
|
|
458
398
|
* Add a route dynamicaly
|
|
@@ -516,7 +456,7 @@ class Core extends events.EventEmitter {
|
|
|
516
456
|
* @returns {{}}
|
|
517
457
|
*/
|
|
518
458
|
getStores() {
|
|
519
|
-
return this.getServicesOfType(
|
|
459
|
+
return this.getServicesOfType(Store);
|
|
520
460
|
}
|
|
521
461
|
/**
|
|
522
462
|
* Return a map of defined models
|
|
@@ -533,49 +473,17 @@ class Core extends events.EventEmitter {
|
|
|
533
473
|
getModel(name) {
|
|
534
474
|
return this.application.getModel(name);
|
|
535
475
|
}
|
|
536
|
-
/**
|
|
537
|
-
* This should return a "turning" secret with cache and a service to modify it every x mins
|
|
538
|
-
* WARNING The security is lower without this "turning" secret, you can still set the global.secret parameter
|
|
539
|
-
*
|
|
540
|
-
* Dont rely on this method, it will probably disapear to avoid secret leak
|
|
541
|
-
*
|
|
542
|
-
* @deprecated
|
|
543
|
-
* @returns {String} Current secret
|
|
544
|
-
*/
|
|
545
|
-
getSecret() {
|
|
546
|
-
// For now a static config file but should have a rolling service secret
|
|
547
|
-
return this.configuration.parameters.sessionSecret;
|
|
548
|
-
}
|
|
549
|
-
/**
|
|
550
|
-
* Retrieve a HMAC for a string
|
|
551
|
-
* @param data
|
|
552
|
-
* @returns
|
|
553
|
-
*/
|
|
554
|
-
getHmac(data) {
|
|
555
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
556
|
-
return crypto.createHmac("sha256", this.getSecret()).update(data).digest("hex");
|
|
557
|
-
});
|
|
558
|
-
}
|
|
559
|
-
/**
|
|
560
|
-
* Return a salt to use when doing digest
|
|
561
|
-
*
|
|
562
|
-
* @returns {String} Current salt
|
|
563
|
-
*/
|
|
564
|
-
getSalt() {
|
|
565
|
-
// For now a static config file but should have a rolling service secret
|
|
566
|
-
return this.configuration.parameters.salt;
|
|
567
|
-
}
|
|
568
476
|
/**
|
|
569
477
|
* Add to context information and executor based on the http context
|
|
570
478
|
*/
|
|
571
479
|
updateContextWithRoute(ctx) {
|
|
572
480
|
let http = ctx.getHttpContext();
|
|
573
481
|
// Check mapping
|
|
574
|
-
|
|
482
|
+
let route = this.router.getRouteFromUrl(ctx, http.getMethod(), http.getRelativeUri());
|
|
575
483
|
if (route === undefined) {
|
|
576
484
|
return false;
|
|
577
485
|
}
|
|
578
|
-
ctx.setRoute(
|
|
486
|
+
ctx.setRoute({ ...this.configuration, ...route });
|
|
579
487
|
ctx.setExecutor(this.getService(route.executor));
|
|
580
488
|
return true;
|
|
581
489
|
}
|
|
@@ -611,41 +519,37 @@ class Core extends events.EventEmitter {
|
|
|
611
519
|
* Reinit one service
|
|
612
520
|
* @param service
|
|
613
521
|
*/
|
|
614
|
-
reinitService(service) {
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
}
|
|
625
|
-
});
|
|
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
|
+
}
|
|
626
532
|
}
|
|
627
533
|
/**
|
|
628
534
|
* Reinit all services with updated parameters
|
|
629
535
|
* @param updates
|
|
630
536
|
* @returns
|
|
631
537
|
*/
|
|
632
|
-
reinit(updates) {
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
yield Promise.all(inits);
|
|
648
|
-
});
|
|
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);
|
|
649
553
|
}
|
|
650
554
|
/**
|
|
651
555
|
* Get a full resolved service parameter
|
|
@@ -655,21 +559,20 @@ class Core extends events.EventEmitter {
|
|
|
655
559
|
* @returns
|
|
656
560
|
*/
|
|
657
561
|
getServiceParams(service, configuration = { parameters: {}, services: {} }) {
|
|
658
|
-
var _a
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
(
|
|
662
|
-
|
|
663
|
-
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] || {});
|
|
664
567
|
delete params.require;
|
|
665
568
|
return params;
|
|
666
569
|
}
|
|
667
570
|
createService(services, service) {
|
|
668
|
-
|
|
571
|
+
let type = services[service].type;
|
|
669
572
|
if (type === undefined) {
|
|
670
573
|
type = service;
|
|
671
574
|
}
|
|
672
|
-
|
|
575
|
+
let serviceConstructor = undefined;
|
|
673
576
|
try {
|
|
674
577
|
serviceConstructor = this.application.getModda(type);
|
|
675
578
|
}
|
|
@@ -696,9 +599,6 @@ class Core extends events.EventEmitter {
|
|
|
696
599
|
const services = this.configuration.services;
|
|
697
600
|
this.log("DEBUG", beans);
|
|
698
601
|
for (let i in beans) {
|
|
699
|
-
if (!beans[i].bean) {
|
|
700
|
-
this.log("DEBUG", "Implicit @Bean due to a @Route", beans[i].constructor.name);
|
|
701
|
-
}
|
|
702
602
|
let name = beans[i].constructor.name;
|
|
703
603
|
if (!services[name]) {
|
|
704
604
|
services[name] = {};
|
|
@@ -730,6 +630,20 @@ class Core extends events.EventEmitter {
|
|
|
730
630
|
}
|
|
731
631
|
return methods;
|
|
732
632
|
}
|
|
633
|
+
/**
|
|
634
|
+
* A registry is a predefined store
|
|
635
|
+
* @returns
|
|
636
|
+
*/
|
|
637
|
+
getRegistry() {
|
|
638
|
+
return this.registry;
|
|
639
|
+
}
|
|
640
|
+
/**
|
|
641
|
+
* Return the crypto service
|
|
642
|
+
* @returns
|
|
643
|
+
*/
|
|
644
|
+
getCrypto() {
|
|
645
|
+
return this.cryptoService;
|
|
646
|
+
}
|
|
733
647
|
/**
|
|
734
648
|
* Auto connect services with setters
|
|
735
649
|
*/
|
|
@@ -766,38 +680,42 @@ class Core extends events.EventEmitter {
|
|
|
766
680
|
* Init services and Beans along with Routes
|
|
767
681
|
*/
|
|
768
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
|
+
});
|
|
769
707
|
if (this.configuration.services !== undefined) {
|
|
770
|
-
|
|
708
|
+
let excludes = ["registry", "cryptoservice"];
|
|
709
|
+
if (this.configuration.parameters.configurationService) {
|
|
710
|
+
excludes.push(this.configuration.parameters.configurationService.toLowerCase());
|
|
711
|
+
}
|
|
712
|
+
// Do not recreate the configuration services
|
|
713
|
+
this.createServices(excludes);
|
|
771
714
|
}
|
|
772
715
|
this.router.remapRoutes();
|
|
773
716
|
this._initiated = true;
|
|
774
717
|
this.emit("Webda.Init", this.configuration);
|
|
775
718
|
}
|
|
776
|
-
/**
|
|
777
|
-
* Init Routes declare by @Route annotation
|
|
778
|
-
*/
|
|
779
|
-
initBeanRoutes(serviceBean) {
|
|
780
|
-
let service = serviceBean.getName().toLowerCase();
|
|
781
|
-
if (beans[service] !== undefined && beans[service].routes) {
|
|
782
|
-
for (let j in beans[service].routes) {
|
|
783
|
-
this.log("TRACE", "Adding route", j, "for bean", service);
|
|
784
|
-
beans[service].routes[j].forEach(route => {
|
|
785
|
-
if (route.resolved) {
|
|
786
|
-
return;
|
|
787
|
-
}
|
|
788
|
-
route.info = {
|
|
789
|
-
methods: route.methods,
|
|
790
|
-
_method: this.services[service][route.executor],
|
|
791
|
-
allowPath: route.allowPath || false,
|
|
792
|
-
openapi: route.openapi,
|
|
793
|
-
executor: beans[service].constructor.name // Name of the service
|
|
794
|
-
};
|
|
795
|
-
this.addRoute(j, route.info);
|
|
796
|
-
route.resolved = true;
|
|
797
|
-
});
|
|
798
|
-
}
|
|
799
|
-
}
|
|
800
|
-
}
|
|
801
719
|
/**
|
|
802
720
|
* Create a new context for a request
|
|
803
721
|
*
|
|
@@ -806,15 +724,13 @@ class Core extends events.EventEmitter {
|
|
|
806
724
|
* @param stream - The request output stream if any
|
|
807
725
|
* @return A new context object to pass along
|
|
808
726
|
*/
|
|
809
|
-
newContext(httpContext, stream = undefined, noInit = false) {
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
return res;
|
|
817
|
-
});
|
|
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;
|
|
818
734
|
}
|
|
819
735
|
/**
|
|
820
736
|
* Convert an object to JSON using the Webda json filter
|
|
@@ -834,10 +750,10 @@ class Core extends events.EventEmitter {
|
|
|
834
750
|
*/
|
|
835
751
|
getUuid(format = "uuid") {
|
|
836
752
|
if (format === "uuid") {
|
|
837
|
-
return (
|
|
753
|
+
return uuidv4().toString();
|
|
838
754
|
}
|
|
839
755
|
let buffer = Buffer.alloc(16);
|
|
840
|
-
(
|
|
756
|
+
uuidv4(undefined, buffer);
|
|
841
757
|
if (format === "base64") {
|
|
842
758
|
// Remove useless = we won't transfer back to original value or could just add ==
|
|
843
759
|
// https://datatracker.ietf.org/doc/html/rfc4648#page-7
|
|
@@ -855,9 +771,9 @@ class Core extends events.EventEmitter {
|
|
|
855
771
|
* Emit the event with data and wait for Promise to finish if listener returned a Promise
|
|
856
772
|
*/
|
|
857
773
|
emitSync(eventType, event, ...data) {
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
774
|
+
let result;
|
|
775
|
+
let promises = [];
|
|
776
|
+
let listeners = this.listeners(eventType);
|
|
861
777
|
for (let listener of listeners) {
|
|
862
778
|
result = listener(event, ...data);
|
|
863
779
|
if (result instanceof Promise) {
|
|
@@ -896,28 +812,23 @@ class Core extends events.EventEmitter {
|
|
|
896
812
|
*
|
|
897
813
|
* @param context Context of the request
|
|
898
814
|
*/
|
|
899
|
-
checkRequest(ctx) {
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
return (yield Promise.all(this._requestFilters.map(filter => filter.checkRequest(ctx)))).some(v => v);
|
|
906
|
-
});
|
|
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);
|
|
907
821
|
}
|
|
908
822
|
/**
|
|
909
823
|
* Verify if an origin is allowed to do request on the API
|
|
910
824
|
*
|
|
911
825
|
* @param context Context of the request
|
|
912
826
|
*/
|
|
913
|
-
checkCORSRequest(ctx) {
|
|
914
|
-
return
|
|
915
|
-
return (yield Promise.all(this._requestCORSFilters.map(filter => filter.checkRequest(ctx)))).some(v => v);
|
|
916
|
-
});
|
|
827
|
+
async checkCORSRequest(ctx) {
|
|
828
|
+
return (await Promise.all(this._requestCORSFilters.map(filter => filter.checkRequest(ctx)))).some(v => v);
|
|
917
829
|
}
|
|
918
830
|
exportOpenAPI(skipHidden = true) {
|
|
919
831
|
var _a;
|
|
920
|
-
var _b;
|
|
921
832
|
let packageInfo = this.application.getPackageDescription();
|
|
922
833
|
let contact;
|
|
923
834
|
if (typeof packageInfo.author === "string") {
|
|
@@ -937,7 +848,7 @@ class Core extends events.EventEmitter {
|
|
|
937
848
|
else if (packageInfo.license) {
|
|
938
849
|
license = packageInfo.license;
|
|
939
850
|
}
|
|
940
|
-
let openapi =
|
|
851
|
+
let openapi = deepmerge({
|
|
941
852
|
openapi: "3.0.3",
|
|
942
853
|
info: {
|
|
943
854
|
description: packageInfo.description,
|
|
@@ -947,11 +858,11 @@ class Core extends events.EventEmitter {
|
|
|
947
858
|
contact,
|
|
948
859
|
license
|
|
949
860
|
},
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
861
|
+
components: {
|
|
862
|
+
schemas: {
|
|
863
|
+
Object: {
|
|
864
|
+
type: "object"
|
|
865
|
+
}
|
|
955
866
|
}
|
|
956
867
|
},
|
|
957
868
|
paths: {},
|
|
@@ -964,21 +875,30 @@ class Core extends events.EventEmitter {
|
|
|
964
875
|
type: "object"
|
|
965
876
|
};
|
|
966
877
|
let modelDescription = this.getModel(i);
|
|
878
|
+
let modelName = model.name || i.split("/").pop();
|
|
967
879
|
// Only export CoreModel info
|
|
968
|
-
if (!this.application.extends(modelDescription,
|
|
880
|
+
if (!this.application.extends(modelDescription, CoreModel)) {
|
|
969
881
|
continue;
|
|
970
882
|
}
|
|
971
883
|
let schema = this.application.getSchema(i);
|
|
972
884
|
if (schema) {
|
|
973
885
|
for (let j in schema.definitions) {
|
|
974
886
|
// @ts-ignore
|
|
975
|
-
(_a =
|
|
887
|
+
(_a = openapi.components.schemas)[j] ?? (_a[j] = schema.definitions[j]);
|
|
976
888
|
}
|
|
977
889
|
delete schema.definitions;
|
|
978
890
|
desc = schema;
|
|
979
891
|
}
|
|
980
|
-
//
|
|
981
|
-
|
|
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/"));
|
|
982
902
|
}
|
|
983
903
|
this.router.completeOpenAPI(openapi, skipHidden);
|
|
984
904
|
openapi.tags.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase()));
|
|
@@ -990,5 +910,4 @@ class Core extends events.EventEmitter {
|
|
|
990
910
|
return openapi;
|
|
991
911
|
}
|
|
992
912
|
}
|
|
993
|
-
exports.Core = Core;
|
|
994
913
|
//# sourceMappingURL=core.js.map
|