kuzzle 2.19.2 → 2.19.3
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/api/controllers/adminController.js +94 -80
- package/lib/api/controllers/authController.js +239 -212
- package/lib/api/controllers/baseController.js +89 -51
- package/lib/api/controllers/bulkController.js +62 -49
- package/lib/api/controllers/clusterController.js +6 -8
- package/lib/api/controllers/collectionController.js +140 -129
- package/lib/api/controllers/debugController.d.ts +2 -2
- package/lib/api/controllers/debugController.js +33 -31
- package/lib/api/controllers/documentController.js +365 -274
- package/lib/api/controllers/index.js +13 -13
- package/lib/api/controllers/indexController.js +46 -50
- package/lib/api/controllers/memoryStorageController.js +410 -360
- package/lib/api/controllers/realtimeController.js +37 -36
- package/lib/api/controllers/securityController.js +553 -412
- package/lib/api/controllers/serverController.js +111 -104
- package/lib/api/documentExtractor.js +75 -68
- package/lib/api/funnel.js +411 -312
- package/lib/api/httpRoutes.js +1493 -324
- package/lib/api/openapi/OpenApiManager.d.ts +1 -1
- package/lib/api/openapi/OpenApiManager.js +22 -22
- package/lib/api/openapi/components/document/count.yaml +1 -1
- package/lib/api/openapi/components/document/create.yaml +2 -2
- package/lib/api/openapi/components/document/delete.yaml +1 -1
- package/lib/api/openapi/components/document/deleteByQuery.yaml +1 -1
- package/lib/api/openapi/components/document/exists.yaml +1 -1
- package/lib/api/openapi/components/document/get.yaml +2 -2
- package/lib/api/openapi/components/document/index.js +12 -12
- package/lib/api/openapi/components/document/replace.yaml +1 -1
- package/lib/api/openapi/components/document/scroll.yaml +1 -1
- package/lib/api/openapi/components/document/validate.yaml +1 -1
- package/lib/api/openapi/components/index.d.ts +2 -2
- package/lib/api/openapi/components/index.js +1 -1
- package/lib/api/openapi/components/security/index.js +1 -1
- package/lib/api/openapi/components/security/upsertUser.yaml +2 -3
- package/lib/api/openapi/index.d.ts +1 -1
- package/lib/api/openapi/openApiGenerator.d.ts +1 -1
- package/lib/api/openapi/openApiGenerator.js +7 -7
- package/lib/api/rateLimiter.js +12 -13
- package/lib/api/request/index.d.ts +4 -4
- package/lib/api/request/kuzzleRequest.d.ts +9 -9
- package/lib/api/request/kuzzleRequest.js +89 -87
- package/lib/api/request/requestContext.d.ts +2 -2
- package/lib/api/request/requestContext.js +17 -17
- package/lib/api/request/requestInput.d.ts +1 -1
- package/lib/api/request/requestInput.js +19 -19
- package/lib/api/request/requestResponse.d.ts +4 -4
- package/lib/api/request/requestResponse.js +31 -33
- package/lib/cluster/command.js +48 -44
- package/lib/cluster/idCardHandler.d.ts +1 -1
- package/lib/cluster/idCardHandler.js +15 -15
- package/lib/cluster/index.js +2 -2
- package/lib/cluster/node.js +301 -269
- package/lib/cluster/publisher.js +45 -46
- package/lib/cluster/state.d.ts +5 -5
- package/lib/cluster/state.js +8 -8
- package/lib/cluster/subscriber.js +163 -113
- package/lib/cluster/workers/IDCardRenewer.js +33 -32
- package/lib/config/default.config.d.ts +1 -1
- package/lib/config/default.config.js +212 -171
- package/lib/config/documentEventAliases.js +6 -6
- package/lib/config/index.js +161 -98
- package/lib/config/sdkCompatibility.json +8 -8
- package/lib/core/auth/formatProcessing.js +7 -7
- package/lib/core/auth/passportResponse.js +7 -7
- package/lib/core/auth/passportWrapper.js +34 -30
- package/lib/core/auth/tokenManager.d.ts +2 -2
- package/lib/core/auth/tokenManager.js +11 -10
- package/lib/core/backend/applicationManager.d.ts +1 -1
- package/lib/core/backend/applicationManager.js +2 -2
- package/lib/core/backend/backend.d.ts +3 -3
- package/lib/core/backend/backend.js +34 -31
- package/lib/core/backend/backendCluster.d.ts +2 -2
- package/lib/core/backend/backendCluster.js +5 -5
- package/lib/core/backend/backendConfig.d.ts +2 -2
- package/lib/core/backend/backendConfig.js +3 -3
- package/lib/core/backend/backendController.d.ts +2 -2
- package/lib/core/backend/backendController.js +9 -10
- package/lib/core/backend/backendErrors.d.ts +3 -3
- package/lib/core/backend/backendErrors.js +2 -1
- package/lib/core/backend/backendHook.d.ts +2 -2
- package/lib/core/backend/backendHook.js +5 -5
- package/lib/core/backend/backendImport.d.ts +3 -3
- package/lib/core/backend/backendImport.js +23 -23
- package/lib/core/backend/backendOpenApi.d.ts +2 -2
- package/lib/core/backend/backendOpenApi.js +16 -16
- package/lib/core/backend/backendPipe.d.ts +2 -2
- package/lib/core/backend/backendPipe.js +6 -6
- package/lib/core/backend/backendPlugin.d.ts +4 -4
- package/lib/core/backend/backendPlugin.js +14 -14
- package/lib/core/backend/backendStorage.d.ts +2 -2
- package/lib/core/backend/backendStorage.js +1 -2
- package/lib/core/backend/backendVault.d.ts +2 -2
- package/lib/core/backend/backendVault.js +3 -3
- package/lib/core/backend/index.d.ts +14 -14
- package/lib/core/backend/internalLogger.d.ts +1 -1
- package/lib/core/backend/internalLogger.js +5 -5
- package/lib/core/cache/cacheDbEnum.js +4 -4
- package/lib/core/cache/cacheEngine.js +79 -85
- package/lib/core/network/accessLogger.js +126 -120
- package/lib/core/network/clientConnection.js +5 -5
- package/lib/core/network/context.js +8 -8
- package/lib/core/network/entryPoint.js +100 -85
- package/lib/core/network/httpRouter/index.js +63 -60
- package/lib/core/network/httpRouter/routeHandler.js +18 -19
- package/lib/core/network/httpRouter/routePart.js +23 -19
- package/lib/core/network/protocolManifest.js +3 -3
- package/lib/core/network/protocols/httpMessage.js +8 -10
- package/lib/core/network/protocols/httpwsProtocol.js +305 -250
- package/lib/core/network/protocols/internalProtocol.js +27 -24
- package/lib/core/network/protocols/mqttProtocol.js +106 -96
- package/lib/core/network/protocols/protocol.js +20 -17
- package/lib/core/network/router.js +56 -46
- package/lib/core/plugin/plugin.js +151 -120
- package/lib/core/plugin/pluginContext.d.ts +7 -7
- package/lib/core/plugin/pluginContext.js +48 -44
- package/lib/core/plugin/pluginManifest.js +13 -12
- package/lib/core/plugin/pluginRepository.js +26 -27
- package/lib/core/plugin/pluginsManager.js +425 -304
- package/lib/core/plugin/privilegedContext.js +3 -3
- package/lib/core/realtime/actionEnum.js +1 -1
- package/lib/core/realtime/channel.d.ts +1 -1
- package/lib/core/realtime/channel.js +22 -22
- package/lib/core/realtime/connectionRooms.d.ts +1 -1
- package/lib/core/realtime/hotelClerk.d.ts +2 -2
- package/lib/core/realtime/hotelClerk.js +53 -50
- package/lib/core/realtime/index.js +5 -5
- package/lib/core/realtime/notification/document.js +25 -25
- package/lib/core/realtime/notification/index.js +4 -4
- package/lib/core/realtime/notification/server.js +3 -3
- package/lib/core/realtime/notification/user.js +4 -4
- package/lib/core/realtime/notifier.js +113 -75
- package/lib/core/realtime/room.d.ts +1 -1
- package/lib/core/realtime/subscription.d.ts +1 -1
- package/lib/core/realtime/subscription.js +1 -1
- package/lib/core/security/index.js +8 -8
- package/lib/core/security/profileRepository.d.ts +6 -6
- package/lib/core/security/profileRepository.js +48 -45
- package/lib/core/security/roleRepository.js +127 -115
- package/lib/core/security/securityLoader.js +70 -63
- package/lib/core/security/tokenRepository.js +132 -118
- package/lib/core/security/userRepository.js +104 -88
- package/lib/core/shared/KoncordeWrapper.d.ts +1 -1
- package/lib/core/shared/KoncordeWrapper.js +3 -1
- package/lib/core/shared/abstractManifest.js +22 -23
- package/lib/core/shared/repository.js +69 -67
- package/lib/core/shared/sdk/embeddedSdk.d.ts +2 -2
- package/lib/core/shared/sdk/embeddedSdk.js +36 -32
- package/lib/core/shared/sdk/funnelProtocol.d.ts +1 -1
- package/lib/core/shared/sdk/funnelProtocol.js +11 -11
- package/lib/core/shared/sdk/impersonatedSdk.js +19 -18
- package/lib/core/shared/store.js +127 -32
- package/lib/core/statistics/index.js +2 -2
- package/lib/core/statistics/statistics.js +99 -85
- package/lib/core/storage/clientAdapter.js +219 -136
- package/lib/core/storage/indexCache.js +3 -3
- package/lib/core/storage/storageEngine.js +10 -13
- package/lib/core/storage/storeScopeEnum.js +3 -3
- package/lib/core/validation/baseType.js +12 -10
- package/lib/core/validation/index.js +2 -2
- package/lib/core/validation/types/anything.js +4 -4
- package/lib/core/validation/types/boolean.js +7 -7
- package/lib/core/validation/types/date.js +165 -131
- package/lib/core/validation/types/email.js +18 -21
- package/lib/core/validation/types/enum.js +34 -21
- package/lib/core/validation/types/geoPoint.js +7 -7
- package/lib/core/validation/types/geoShape.js +148 -125
- package/lib/core/validation/types/integer.js +9 -9
- package/lib/core/validation/types/ipAddress.js +17 -19
- package/lib/core/validation/types/numeric.js +36 -29
- package/lib/core/validation/types/object.js +19 -19
- package/lib/core/validation/types/string.js +36 -29
- package/lib/core/validation/types/url.js +17 -19
- package/lib/core/validation/validation.js +422 -378
- package/lib/kerror/codes/1-services.json +7 -1
- package/lib/kerror/codes/4-plugin.json +2 -2
- package/lib/kerror/codes/index.js +85 -63
- package/lib/kerror/errors/badRequestError.d.ts +1 -1
- package/lib/kerror/errors/externalServiceError.d.ts +1 -1
- package/lib/kerror/errors/forbiddenError.d.ts +1 -1
- package/lib/kerror/errors/gatewayTimeoutError.d.ts +1 -1
- package/lib/kerror/errors/index.d.ts +15 -15
- package/lib/kerror/errors/internalError.d.ts +1 -1
- package/lib/kerror/errors/kuzzleError.d.ts +1 -1
- package/lib/kerror/errors/multipleErrorsError.d.ts +1 -1
- package/lib/kerror/errors/multipleErrorsError.js +1 -1
- package/lib/kerror/errors/notFoundError.d.ts +1 -1
- package/lib/kerror/errors/partialError.d.ts +1 -1
- package/lib/kerror/errors/partialError.js +1 -1
- package/lib/kerror/errors/pluginImplementationError.d.ts +1 -1
- package/lib/kerror/errors/pluginImplementationError.js +2 -1
- package/lib/kerror/errors/preconditionError.d.ts +1 -1
- package/lib/kerror/errors/serviceUnavailableError.d.ts +1 -1
- package/lib/kerror/errors/sizeLimitError.d.ts +1 -1
- package/lib/kerror/errors/tooManyRequestsError.d.ts +1 -1
- package/lib/kerror/errors/unauthorizedError.d.ts +1 -1
- package/lib/kerror/index.d.ts +3 -3
- package/lib/kerror/index.js +17 -16
- package/lib/kuzzle/dumpGenerator.js +130 -114
- package/lib/kuzzle/event/kuzzleEventEmitter.js +96 -70
- package/lib/kuzzle/event/pipeRunner.js +25 -24
- package/lib/kuzzle/event/waterfall.js +13 -15
- package/lib/kuzzle/index.js +2 -2
- package/lib/kuzzle/internalIndexHandler.js +80 -59
- package/lib/kuzzle/kuzzle.js +99 -99
- package/lib/kuzzle/kuzzleStateEnum.js +1 -1
- package/lib/kuzzle/log.js +23 -18
- package/lib/kuzzle/vault.js +34 -19
- package/lib/model/security/profile.d.ts +3 -3
- package/lib/model/security/profile.js +38 -37
- package/lib/model/security/rights.js +5 -5
- package/lib/model/security/role.d.ts +3 -3
- package/lib/model/security/role.js +25 -26
- package/lib/model/security/token.d.ts +1 -1
- package/lib/model/security/token.js +4 -4
- package/lib/model/security/user.d.ts +2 -2
- package/lib/model/security/user.js +9 -9
- package/lib/model/storage/apiKey.js +43 -33
- package/lib/model/storage/baseModel.js +49 -45
- package/lib/service/cache/redis.js +60 -55
- package/lib/service/service.js +17 -17
- package/lib/service/storage/elasticsearch.js +839 -755
- package/lib/service/storage/esWrapper.js +103 -86
- package/lib/service/storage/queryTranslator.js +52 -59
- package/lib/types/Controller.d.ts +3 -3
- package/lib/types/ControllerDefinition.d.ts +3 -3
- package/lib/types/DebugModule.d.ts +2 -2
- package/lib/types/DebugModule.js +1 -1
- package/lib/types/Global.d.ts +1 -1
- package/lib/types/HttpStream.d.ts +2 -1
- package/lib/types/HttpStream.js +7 -5
- package/lib/types/Kuzzle.d.ts +1 -1
- package/lib/types/KuzzleDocument.d.ts +1 -1
- package/lib/types/OpenApiDefinition.d.ts +1 -1
- package/lib/types/PasswordPolicy.d.ts +1 -1
- package/lib/types/Plugin.d.ts +6 -6
- package/lib/types/Plugin.js +2 -2
- package/lib/types/Policy.d.ts +1 -1
- package/lib/types/RequestPayload.d.ts +1 -1
- package/lib/types/ResponsePayload.d.ts +1 -1
- package/lib/types/Token.d.ts +1 -1
- package/lib/types/User.d.ts +1 -1
- package/lib/types/config/DumpConfiguration.d.ts +8 -8
- package/lib/types/config/HttpConfiguration.d.ts +1 -1
- package/lib/types/config/KuzzleConfiguration.d.ts +1 -1
- package/lib/types/config/LimitsConfiguration.d.ts +8 -8
- package/lib/types/config/PluginsConfiguration.d.ts +4 -4
- package/lib/types/config/SecurityConfiguration.d.ts +62 -62
- package/lib/types/config/ServerConfiguration.d.ts +55 -55
- package/lib/types/config/ServicesConfiguration.d.ts +2 -2
- package/lib/types/config/internalCache/InternalCacheRedisConfiguration.d.ts +10 -10
- package/lib/types/config/publicCache/PublicCacheRedisConfiguration.d.ts +3 -3
- package/lib/types/config/storageEngine/StorageEngineElasticsearchConfiguration.d.ts +194 -110
- package/lib/types/errors/ErrorDefinition.d.ts +1 -1
- package/lib/types/errors/ErrorDomains.d.ts +1 -1
- package/lib/types/index.d.ts +38 -38
- package/lib/types/realtime/RealtimeScope.d.ts +1 -1
- package/lib/types/realtime/RealtimeUsers.d.ts +1 -1
- package/lib/util/assertType.js +13 -11
- package/lib/util/async.d.ts +1 -0
- package/lib/util/async.js +61 -0
- package/lib/util/asyncStore.js +19 -21
- package/lib/util/bufferedPassThrough.d.ts +2 -2
- package/lib/util/bufferedPassThrough.js +4 -4
- package/lib/util/bytes.js +9 -13
- package/lib/util/crypto.js +1 -1
- package/lib/util/debug.js +5 -5
- package/lib/util/deprecate.js +24 -21
- package/lib/util/didYouMean.js +7 -7
- package/lib/util/dump-collection.d.ts +2 -2
- package/lib/util/dump-collection.js +26 -26
- package/lib/util/esRequest.d.ts +1 -0
- package/lib/util/esRequest.js +62 -0
- package/lib/util/extractFields.js +24 -25
- package/lib/util/inflector.js +5 -5
- package/lib/util/koncordeCompat.d.ts +2 -2
- package/lib/util/koncordeCompat.js +5 -5
- package/lib/util/memoize.js +3 -5
- package/lib/util/mutex.d.ts +19 -1
- package/lib/util/mutex.js +39 -12
- package/lib/util/name-generator.js +1331 -1331
- package/lib/util/promback.js +8 -10
- package/lib/util/readYamlFile.d.ts +1 -1
- package/lib/util/readYamlFile.js +1 -1
- package/lib/util/requestAssertions.js +34 -34
- package/lib/util/safeObject.js +5 -5
- package/lib/util/stackTrace.js +20 -22
- package/lib/util/wildcard.js +15 -15
- package/package.json +6 -6
- package/npm-shrinkwrap.json +0 -19422
|
@@ -19,27 +19,27 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const path = require(
|
|
25
|
-
const fs = require(
|
|
26
|
-
const semver = require(
|
|
24
|
+
const path = require("path");
|
|
25
|
+
const fs = require("fs");
|
|
26
|
+
const semver = require("semver");
|
|
27
27
|
|
|
28
|
-
const { PluginContext } = require(
|
|
29
|
-
const PrivilegedPluginContext = require(
|
|
30
|
-
const kerror = require(
|
|
31
|
-
const errorCodes = require(
|
|
32
|
-
const Manifest = require(
|
|
33
|
-
const { has, isPlainObject } = require(
|
|
28
|
+
const { PluginContext } = require("./pluginContext");
|
|
29
|
+
const PrivilegedPluginContext = require("./privilegedContext");
|
|
30
|
+
const kerror = require("../../kerror");
|
|
31
|
+
const errorCodes = require("../../kerror/codes");
|
|
32
|
+
const Manifest = require("./pluginManifest");
|
|
33
|
+
const { has, isPlainObject } = require("../../util/safeObject");
|
|
34
34
|
|
|
35
|
-
const assertionError = kerror.wrap(
|
|
36
|
-
const runtimeError = kerror.wrap(
|
|
35
|
+
const assertionError = kerror.wrap("plugin", "assert");
|
|
36
|
+
const runtimeError = kerror.wrap("plugin", "runtime");
|
|
37
37
|
|
|
38
38
|
const PLUGIN_NAME_REGEX = /^[a-z-\d]+$/;
|
|
39
|
-
const HTTP_VERBS = [
|
|
39
|
+
const HTTP_VERBS = ["get", "head", "post", "put", "delete", "patch", "options"];
|
|
40
40
|
|
|
41
41
|
class Plugin {
|
|
42
|
-
constructor
|
|
42
|
+
constructor(
|
|
43
43
|
instance,
|
|
44
44
|
{ name, application = false, deprecationWarning = true } = {}
|
|
45
45
|
) {
|
|
@@ -50,8 +50,8 @@ class Plugin {
|
|
|
50
50
|
this._initCalled = false;
|
|
51
51
|
this._config = {};
|
|
52
52
|
this._context = null;
|
|
53
|
-
this._version = instance.version ||
|
|
54
|
-
this._name =
|
|
53
|
+
this._version = instance.version || "";
|
|
54
|
+
this._name = "";
|
|
55
55
|
this._manifest = instance._manifest || null;
|
|
56
56
|
this._deprecationWarning = deprecationWarning;
|
|
57
57
|
|
|
@@ -60,33 +60,40 @@ class Plugin {
|
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
init
|
|
63
|
+
init(name) {
|
|
64
64
|
this.name = name;
|
|
65
65
|
|
|
66
66
|
if (global.kuzzle.config.plugins[this.name]) {
|
|
67
|
-
this.config = JSON.parse(
|
|
67
|
+
this.config = JSON.parse(
|
|
68
|
+
JSON.stringify(global.kuzzle.config.plugins[this.name])
|
|
69
|
+
);
|
|
68
70
|
}
|
|
69
71
|
|
|
70
72
|
// check plugin privileged prerequisites
|
|
71
73
|
// user need to acknowledge privileged mode in plugin configuration
|
|
72
74
|
if (this.config.privileged) {
|
|
73
|
-
if (!
|
|
74
|
-
throw assertionError.get(
|
|
75
|
+
if (!this.manifest || !this.manifest.privileged) {
|
|
76
|
+
throw assertionError.get("privileged_not_supported", this.name);
|
|
75
77
|
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
throw assertionError.get('privileged_not_set', this.name);
|
|
78
|
+
} else if (this.manifest && this.manifest.privileged) {
|
|
79
|
+
throw assertionError.get("privileged_not_set", this.name);
|
|
79
80
|
}
|
|
80
81
|
|
|
81
82
|
if (this.manifest && this.manifest.kuzzleVersion) {
|
|
82
|
-
if (
|
|
83
|
+
if (
|
|
84
|
+
!semver.satisfies(
|
|
85
|
+
global.kuzzle.config.version,
|
|
86
|
+
this.manifest.kuzzleVersion
|
|
87
|
+
)
|
|
88
|
+
) {
|
|
83
89
|
throw kerror.get(
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
90
|
+
"plugin",
|
|
91
|
+
"manifest",
|
|
92
|
+
"version_mismatch",
|
|
87
93
|
this.name,
|
|
88
94
|
global.kuzzle.config.version,
|
|
89
|
-
this.manifest.kuzzleVersion
|
|
95
|
+
this.manifest.kuzzleVersion
|
|
96
|
+
);
|
|
90
97
|
}
|
|
91
98
|
}
|
|
92
99
|
|
|
@@ -95,7 +102,7 @@ class Plugin {
|
|
|
95
102
|
: new PluginContext(this.name);
|
|
96
103
|
}
|
|
97
104
|
|
|
98
|
-
info
|
|
105
|
+
info() {
|
|
99
106
|
/* eslint-disable sort-keys */
|
|
100
107
|
if (this.application) {
|
|
101
108
|
return {
|
|
@@ -115,36 +122,36 @@ class Plugin {
|
|
|
115
122
|
pipes: [],
|
|
116
123
|
routes: [],
|
|
117
124
|
strategies: [],
|
|
118
|
-
version: this.version
|
|
125
|
+
version: this.version,
|
|
119
126
|
};
|
|
120
127
|
/* eslint-enable sort-keys */
|
|
121
128
|
|
|
122
|
-
if (has(this.instance,
|
|
129
|
+
if (has(this.instance, "hooks")) {
|
|
123
130
|
description.hooks = Object.keys(this.instance.hooks);
|
|
124
131
|
}
|
|
125
132
|
|
|
126
|
-
if (has(this.instance,
|
|
133
|
+
if (has(this.instance, "pipes")) {
|
|
127
134
|
description.pipes = Object.keys(this.instance.pipes);
|
|
128
135
|
}
|
|
129
136
|
|
|
130
|
-
if (has(this.instance,
|
|
131
|
-
description.controllers = Object
|
|
132
|
-
|
|
133
|
-
|
|
137
|
+
if (has(this.instance, "controllers")) {
|
|
138
|
+
description.controllers = Object.keys(this.instance.controllers).map(
|
|
139
|
+
(controller) => `${this.name}/${controller}`
|
|
140
|
+
);
|
|
134
141
|
}
|
|
135
142
|
|
|
136
|
-
if (has(this.instance,
|
|
143
|
+
if (has(this.instance, "routes")) {
|
|
137
144
|
description.routes = this.instance.routes;
|
|
138
145
|
}
|
|
139
146
|
|
|
140
|
-
if (has(this.instance,
|
|
147
|
+
if (has(this.instance, "strategies")) {
|
|
141
148
|
description.strategies = Object.keys(this.instance.strategies);
|
|
142
149
|
}
|
|
143
150
|
|
|
144
151
|
return description;
|
|
145
152
|
}
|
|
146
153
|
|
|
147
|
-
printDeprecation
|
|
154
|
+
printDeprecation(message) {
|
|
148
155
|
if (this.deprecationWarning) {
|
|
149
156
|
global.kuzzle.log.warn(`${this.logPrefix} ${message}`);
|
|
150
157
|
}
|
|
@@ -152,66 +159,68 @@ class Plugin {
|
|
|
152
159
|
|
|
153
160
|
// getters/setters ===========================================================
|
|
154
161
|
|
|
155
|
-
get instance
|
|
162
|
+
get instance() {
|
|
156
163
|
return this._instance;
|
|
157
164
|
}
|
|
158
165
|
|
|
159
|
-
get context
|
|
166
|
+
get context() {
|
|
160
167
|
return this._context;
|
|
161
168
|
}
|
|
162
169
|
|
|
163
|
-
get application
|
|
170
|
+
get application() {
|
|
164
171
|
return this._application;
|
|
165
172
|
}
|
|
166
173
|
|
|
167
|
-
get logPrefix
|
|
174
|
+
get logPrefix() {
|
|
168
175
|
return `[${this.name}]`;
|
|
169
176
|
}
|
|
170
177
|
|
|
171
|
-
get config
|
|
178
|
+
get config() {
|
|
172
179
|
return this._config;
|
|
173
180
|
}
|
|
174
|
-
set config
|
|
181
|
+
set config(config) {
|
|
175
182
|
this._config = config;
|
|
176
183
|
}
|
|
177
184
|
|
|
178
|
-
get version
|
|
185
|
+
get version() {
|
|
179
186
|
return this._version;
|
|
180
187
|
}
|
|
181
|
-
set version
|
|
188
|
+
set version(version) {
|
|
182
189
|
this._version = version;
|
|
183
190
|
}
|
|
184
191
|
|
|
185
|
-
get deprecationWarning
|
|
192
|
+
get deprecationWarning() {
|
|
186
193
|
return this._deprecationWarning;
|
|
187
194
|
}
|
|
188
|
-
set deprecationWarning
|
|
195
|
+
set deprecationWarning(value) {
|
|
189
196
|
this._deprecationWarning = value;
|
|
190
197
|
}
|
|
191
198
|
|
|
192
|
-
get name
|
|
199
|
+
get name() {
|
|
193
200
|
return this._name;
|
|
194
201
|
}
|
|
195
|
-
set name
|
|
196
|
-
if (!
|
|
197
|
-
this.printDeprecation(
|
|
202
|
+
set name(name) {
|
|
203
|
+
if (!this.constructor.checkName(name)) {
|
|
204
|
+
this.printDeprecation(
|
|
205
|
+
"Plugin names should be in kebab-case. This behavior will be enforced in futur versions of Kuzzle."
|
|
206
|
+
);
|
|
198
207
|
}
|
|
199
208
|
|
|
200
209
|
this._name = name;
|
|
201
210
|
}
|
|
202
211
|
|
|
203
|
-
get manifest
|
|
212
|
+
get manifest() {
|
|
204
213
|
return this._manifest;
|
|
205
214
|
}
|
|
206
|
-
set manifest
|
|
215
|
+
set manifest(manifest) {
|
|
207
216
|
this._manifest = manifest;
|
|
208
217
|
}
|
|
209
218
|
|
|
210
219
|
// static methods ============================================================
|
|
211
220
|
|
|
212
|
-
static loadFromDirectory
|
|
213
|
-
if (!
|
|
214
|
-
throw assertionError.get(
|
|
221
|
+
static loadFromDirectory(pluginPath) {
|
|
222
|
+
if (!fs.statSync(pluginPath).isDirectory()) {
|
|
223
|
+
throw assertionError.get("cannot_load", pluginPath, "Not a directory.");
|
|
215
224
|
}
|
|
216
225
|
|
|
217
226
|
let plugin;
|
|
@@ -222,13 +231,12 @@ class Plugin {
|
|
|
222
231
|
const pluginInstance = new PluginClass();
|
|
223
232
|
|
|
224
233
|
plugin = new Plugin(pluginInstance);
|
|
225
|
-
}
|
|
226
|
-
catch (error) {
|
|
234
|
+
} catch (error) {
|
|
227
235
|
if (error.message.match(/not a constructor/i)) {
|
|
228
|
-
throw assertionError.get(
|
|
236
|
+
throw assertionError.get("not_a_constructor", PluginClass.name);
|
|
229
237
|
}
|
|
230
238
|
|
|
231
|
-
throw runtimeError.getFrom(error,
|
|
239
|
+
throw runtimeError.getFrom(error, "unexpected_error", error.message);
|
|
232
240
|
}
|
|
233
241
|
|
|
234
242
|
// load manifest
|
|
@@ -238,8 +246,8 @@ class Plugin {
|
|
|
238
246
|
plugin.name = plugin.manifest.name;
|
|
239
247
|
|
|
240
248
|
// load plugin version if exists
|
|
241
|
-
const packageJsonPath = path.join(pluginPath,
|
|
242
|
-
if (fs.existsSync(packageJsonPath) && !
|
|
249
|
+
const packageJsonPath = path.join(pluginPath, "package.json");
|
|
250
|
+
if (fs.existsSync(packageJsonPath) && !plugin.version) {
|
|
243
251
|
plugin.version = require(packageJsonPath).version;
|
|
244
252
|
}
|
|
245
253
|
|
|
@@ -249,25 +257,27 @@ class Plugin {
|
|
|
249
257
|
// we use the manifest name instead of the lowerCased plugin name
|
|
250
258
|
// to ensure to match the plugin original name in the configuration
|
|
251
259
|
const config = global.kuzzle.config[plugin.manifest.name];
|
|
252
|
-
const pluginCode =
|
|
253
|
-
? config._pluginCode
|
|
254
|
-
: 0x00;
|
|
260
|
+
const pluginCode =
|
|
261
|
+
config && config._pluginCode ? config._pluginCode : 0x00;
|
|
255
262
|
|
|
256
263
|
errorCodes.loadPluginsErrors(plugin.manifest.raw, pluginCode);
|
|
257
264
|
|
|
258
|
-
global.kuzzle.log.info(
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
265
|
+
global.kuzzle.log.info(
|
|
266
|
+
`${plugin.logPrefix} Custom errors successfully loaded.`
|
|
267
|
+
);
|
|
268
|
+
} catch (err) {
|
|
269
|
+
if (
|
|
270
|
+
err.message.match(/Error configuration file/i) ||
|
|
271
|
+
err instanceof SyntaxError
|
|
263
272
|
) {
|
|
264
273
|
throw kerror.getFrom(
|
|
265
274
|
err,
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
275
|
+
"plugin",
|
|
276
|
+
"manifest",
|
|
277
|
+
"invalid_errors",
|
|
269
278
|
plugin.manifest.name,
|
|
270
|
-
err.message
|
|
279
|
+
err.message
|
|
280
|
+
);
|
|
271
281
|
}
|
|
272
282
|
|
|
273
283
|
throw err;
|
|
@@ -275,101 +285,121 @@ class Plugin {
|
|
|
275
285
|
}
|
|
276
286
|
|
|
277
287
|
// check if the plugin exposes a "init" method
|
|
278
|
-
if (typeof plugin.instance.init !==
|
|
279
|
-
throw assertionError.get(
|
|
288
|
+
if (typeof plugin.instance.init !== "function") {
|
|
289
|
+
throw assertionError.get("init_not_found", plugin.name);
|
|
280
290
|
}
|
|
281
291
|
|
|
282
292
|
return plugin;
|
|
283
293
|
}
|
|
284
294
|
|
|
285
|
-
static checkName
|
|
295
|
+
static checkName(name) {
|
|
286
296
|
return PLUGIN_NAME_REGEX.test(name);
|
|
287
297
|
}
|
|
288
298
|
|
|
289
|
-
static checkControllerDefinition
|
|
290
|
-
|
|
299
|
+
static checkControllerDefinition(
|
|
300
|
+
name,
|
|
301
|
+
definition,
|
|
302
|
+
{ application = false } = {}
|
|
303
|
+
) {
|
|
304
|
+
if (typeof name !== "string") {
|
|
291
305
|
throw assertionError.get(
|
|
292
|
-
|
|
293
|
-
|
|
306
|
+
"invalid_controller_definition",
|
|
307
|
+
"Controller name must be a string"
|
|
308
|
+
);
|
|
294
309
|
}
|
|
295
310
|
|
|
296
|
-
if (!
|
|
311
|
+
if (!isPlainObject(definition)) {
|
|
297
312
|
throw assertionError.get(
|
|
298
|
-
|
|
313
|
+
"invalid_controller_definition",
|
|
299
314
|
name,
|
|
300
|
-
|
|
315
|
+
"Controller definition must be an object"
|
|
316
|
+
);
|
|
301
317
|
}
|
|
302
318
|
|
|
303
|
-
if (!
|
|
319
|
+
if (!isPlainObject(definition.actions)) {
|
|
304
320
|
throw assertionError.get(
|
|
305
|
-
|
|
321
|
+
"invalid_controller_definition",
|
|
306
322
|
name,
|
|
307
|
-
'Controller definition "actions" property must be an object'
|
|
323
|
+
'Controller definition "actions" property must be an object'
|
|
324
|
+
);
|
|
308
325
|
}
|
|
309
326
|
|
|
310
|
-
for (const [action, actionDefinition] of Object.entries(
|
|
327
|
+
for (const [action, actionDefinition] of Object.entries(
|
|
328
|
+
definition.actions
|
|
329
|
+
)) {
|
|
311
330
|
const actionProperties = Object.keys(actionDefinition);
|
|
312
331
|
|
|
313
332
|
if (actionProperties.length > 2) {
|
|
314
|
-
actionProperties.splice(actionProperties.indexOf(
|
|
315
|
-
actionProperties.splice(actionProperties.indexOf(
|
|
333
|
+
actionProperties.splice(actionProperties.indexOf("handler"), 1);
|
|
334
|
+
actionProperties.splice(actionProperties.indexOf("http"), 1);
|
|
316
335
|
|
|
317
336
|
throw assertionError.get(
|
|
318
|
-
|
|
337
|
+
"invalid_controller_definition",
|
|
319
338
|
name,
|
|
320
|
-
`action "${action}" has invalid properties: ${actionProperties.join(
|
|
339
|
+
`action "${action}" has invalid properties: ${actionProperties.join(
|
|
340
|
+
", "
|
|
341
|
+
)}`
|
|
342
|
+
);
|
|
321
343
|
}
|
|
322
344
|
|
|
323
|
-
if (typeof action !==
|
|
345
|
+
if (typeof action !== "string") {
|
|
324
346
|
throw assertionError.get(
|
|
325
|
-
|
|
347
|
+
"invalid_controller_definition",
|
|
326
348
|
name,
|
|
327
|
-
|
|
349
|
+
"action names must be strings"
|
|
350
|
+
);
|
|
328
351
|
}
|
|
329
352
|
|
|
330
|
-
if (typeof actionDefinition.handler !==
|
|
353
|
+
if (typeof actionDefinition.handler !== "function") {
|
|
331
354
|
throw assertionError.get(
|
|
332
|
-
|
|
355
|
+
"invalid_controller_definition",
|
|
333
356
|
name,
|
|
334
|
-
`action "${action}" handler must be a function`
|
|
357
|
+
`action "${action}" handler must be a function`
|
|
358
|
+
);
|
|
335
359
|
}
|
|
336
360
|
|
|
337
361
|
if (actionDefinition.http) {
|
|
338
|
-
if (!
|
|
362
|
+
if (!Array.isArray(actionDefinition.http)) {
|
|
339
363
|
throw assertionError.get(
|
|
340
|
-
|
|
364
|
+
"invalid_controller_definition",
|
|
341
365
|
name,
|
|
342
|
-
`action "${action}" http definition must be an array`
|
|
366
|
+
`action "${action}" http definition must be an array`
|
|
367
|
+
);
|
|
343
368
|
}
|
|
344
369
|
|
|
345
370
|
for (const route of actionDefinition.http) {
|
|
346
|
-
if (typeof route.verb !==
|
|
371
|
+
if (typeof route.verb !== "string" || route.verb.length === 0) {
|
|
347
372
|
throw assertionError.get(
|
|
348
|
-
|
|
373
|
+
"invalid_controller_definition",
|
|
349
374
|
name,
|
|
350
|
-
`action "${action}" http "verb" property must be a non-empty string`
|
|
375
|
+
`action "${action}" http "verb" property must be a non-empty string`
|
|
376
|
+
);
|
|
351
377
|
}
|
|
352
378
|
|
|
353
|
-
if (!
|
|
379
|
+
if (!HTTP_VERBS.includes(route.verb.toLowerCase())) {
|
|
354
380
|
throw assertionError.get(
|
|
355
|
-
|
|
381
|
+
"invalid_controller_definition",
|
|
356
382
|
name,
|
|
357
|
-
`action "${action}" http verb "${route.verb}" is not a valid http verb`
|
|
383
|
+
`action "${action}" http verb "${route.verb}" is not a valid http verb`
|
|
384
|
+
);
|
|
358
385
|
}
|
|
359
386
|
|
|
360
387
|
checkHttpRouteProperties(route, action, name, application);
|
|
361
388
|
|
|
362
389
|
const routeProperties = Object.keys(route);
|
|
363
390
|
if (routeProperties.length > 3) {
|
|
364
|
-
routeProperties.splice(routeProperties.indexOf(
|
|
365
|
-
routeProperties.splice(routeProperties.indexOf(
|
|
366
|
-
routeProperties.splice(routeProperties.indexOf(
|
|
367
|
-
routeProperties.splice(routeProperties.indexOf(
|
|
391
|
+
routeProperties.splice(routeProperties.indexOf("url"), 1);
|
|
392
|
+
routeProperties.splice(routeProperties.indexOf("path"), 1);
|
|
393
|
+
routeProperties.splice(routeProperties.indexOf("verb"), 1);
|
|
394
|
+
routeProperties.splice(routeProperties.indexOf("openapi"), 1);
|
|
368
395
|
|
|
369
396
|
throw assertionError.get(
|
|
370
|
-
|
|
397
|
+
"invalid_controller_definition",
|
|
371
398
|
name,
|
|
372
|
-
`action "${action}" has invalid http properties: ${routeProperties.join(
|
|
399
|
+
`action "${action}" has invalid http properties: ${routeProperties.join(
|
|
400
|
+
", "
|
|
401
|
+
)}`
|
|
402
|
+
);
|
|
373
403
|
}
|
|
374
404
|
}
|
|
375
405
|
}
|
|
@@ -377,16 +407,17 @@ class Plugin {
|
|
|
377
407
|
}
|
|
378
408
|
}
|
|
379
409
|
|
|
380
|
-
function checkHttpRouteProperties
|
|
381
|
-
if (typeof route.path !==
|
|
382
|
-
if (!
|
|
410
|
+
function checkHttpRouteProperties(route, action, name, application) {
|
|
411
|
+
if (typeof route.path !== "string" || route.path.length === 0) {
|
|
412
|
+
if (!application && typeof route.url === "string" && route.url.length > 0) {
|
|
383
413
|
return;
|
|
384
414
|
}
|
|
385
415
|
|
|
386
416
|
throw assertionError.get(
|
|
387
|
-
|
|
417
|
+
"invalid_controller_definition",
|
|
388
418
|
name,
|
|
389
|
-
`action "${action}" http "path" property must be a non-empty string`
|
|
419
|
+
`action "${action}" http "path" property must be a non-empty string`
|
|
420
|
+
);
|
|
390
421
|
}
|
|
391
422
|
}
|
|
392
423
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { Koncorde } from
|
|
2
|
-
import { Client } from
|
|
3
|
-
import { JSONObject } from
|
|
4
|
-
import { EmbeddedSDK } from
|
|
5
|
-
import { Mutex } from
|
|
6
|
-
import { RequestContext, RequestInput, KuzzleRequest } from
|
|
7
|
-
import { BackendCluster } from
|
|
1
|
+
import { Koncorde } from "../shared/KoncordeWrapper";
|
|
2
|
+
import { Client } from "@elastic/elasticsearch";
|
|
3
|
+
import { JSONObject } from "kuzzle-sdk";
|
|
4
|
+
import { EmbeddedSDK } from "../shared/sdk/embeddedSdk";
|
|
5
|
+
import { Mutex } from "../../util/mutex";
|
|
6
|
+
import { RequestContext, RequestInput, KuzzleRequest } from "../../../index";
|
|
7
|
+
import { BackendCluster } from "../backend";
|
|
8
8
|
export interface Repository {
|
|
9
9
|
create(document: JSONObject, options: any): Promise<any>;
|
|
10
10
|
createOrReplace(document: JSONObject, options: any): Promise<any>;
|