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
|
@@ -131,7 +131,7 @@
|
|
|
131
131
|
"message": "The \"_routing\" keyword is forbidden.",
|
|
132
132
|
"class": "BadRequestError"
|
|
133
133
|
},
|
|
134
|
-
"not_connected":{
|
|
134
|
+
"not_connected": {
|
|
135
135
|
"description": "Unable to connect to the storage instance",
|
|
136
136
|
"code": 24,
|
|
137
137
|
"message": "Elasticsearch service is not connected.",
|
|
@@ -287,6 +287,12 @@
|
|
|
287
287
|
"message": "The %s (\"%s\") contains invalid characters \",+*\" or is equal to \"_all\" which is forbidden",
|
|
288
288
|
"code": 50,
|
|
289
289
|
"class": "BadRequestError"
|
|
290
|
+
},
|
|
291
|
+
"wrong_es_static_settings_for_collection_recreation": {
|
|
292
|
+
"description": "The ES static settings specified at the creation of an existing collection does not match existing settings",
|
|
293
|
+
"message": "Attempt to recreate an existing collection %s of index %s of scope %s with non matching static setting : %s at %s while existing one is at %s",
|
|
294
|
+
"code": 51,
|
|
295
|
+
"class": "BadRequestError"
|
|
290
296
|
}
|
|
291
297
|
}
|
|
292
298
|
},
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"subDomains": {
|
|
4
4
|
"assert": {
|
|
5
5
|
"code": 1,
|
|
6
|
-
"errors"
|
|
6
|
+
"errors": {
|
|
7
7
|
"invalid_plugins_dir": {
|
|
8
8
|
"description": "The enabled plugins directory cannot be opened",
|
|
9
9
|
"code": 1,
|
|
@@ -164,7 +164,7 @@
|
|
|
164
164
|
},
|
|
165
165
|
"strategy": {
|
|
166
166
|
"code": 3,
|
|
167
|
-
"errors"
|
|
167
|
+
"errors": {
|
|
168
168
|
"invalid_description": {
|
|
169
169
|
"description": "The strategy.description field must be an object",
|
|
170
170
|
"code": 1,
|
|
@@ -19,160 +19,182 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const assert = require(
|
|
24
|
+
const assert = require("assert");
|
|
25
25
|
|
|
26
|
-
const errors = require(
|
|
27
|
-
const { has, isPlainObject } = require(
|
|
26
|
+
const errors = require("../errors");
|
|
27
|
+
const { has, isPlainObject } = require("../../util/safeObject");
|
|
28
28
|
|
|
29
29
|
// codes
|
|
30
30
|
const domains = {
|
|
31
|
-
api: require(
|
|
32
|
-
cluster: require(
|
|
33
|
-
core: require(
|
|
34
|
-
network: require(
|
|
35
|
-
plugin: require(
|
|
36
|
-
protocol: require(
|
|
37
|
-
security: require(
|
|
38
|
-
services: require(
|
|
39
|
-
validation: require(
|
|
31
|
+
api: require("./2-api"),
|
|
32
|
+
cluster: require("./8-cluster.json"),
|
|
33
|
+
core: require("./0-core"),
|
|
34
|
+
network: require("./3-network"),
|
|
35
|
+
plugin: require("./4-plugin"),
|
|
36
|
+
protocol: require("./6-protocol"),
|
|
37
|
+
security: require("./7-security"),
|
|
38
|
+
services: require("./1-services"),
|
|
39
|
+
validation: require("./5-validation"),
|
|
40
40
|
};
|
|
41
41
|
|
|
42
42
|
/** Check the format of the error codes files
|
|
43
43
|
* @param {object} - error config file domain
|
|
44
44
|
*/
|
|
45
45
|
|
|
46
|
-
function checkErrors
|
|
46
|
+
function checkErrors(subdomain, domain, options) {
|
|
47
47
|
const codes = new Set();
|
|
48
48
|
|
|
49
49
|
for (const [name, error] of Object.entries(subdomain.errors)) {
|
|
50
50
|
assert(
|
|
51
|
-
has(error,
|
|
52
|
-
`Error configuration file : Missing required 'code' field (domain: ${domain.code}, subdomain: ${subdomain.code}, error: ${name}).`
|
|
51
|
+
has(error, "code"),
|
|
52
|
+
`Error configuration file : Missing required 'code' field (domain: ${domain.code}, subdomain: ${subdomain.code}, error: ${name}).`
|
|
53
|
+
);
|
|
53
54
|
assert(
|
|
54
55
|
Number.isInteger(error.code),
|
|
55
|
-
`Error configuration file : Field 'code' must be an integer (domain: ${domain.code}, subdomain: ${subdomain.code}, error: ${name}).`
|
|
56
|
+
`Error configuration file : Field 'code' must be an integer (domain: ${domain.code}, subdomain: ${subdomain.code}, error: ${name}).`
|
|
57
|
+
);
|
|
56
58
|
assert(
|
|
57
|
-
error.code > 0x0000 && error.code <=
|
|
58
|
-
`Error configuration file : Field 'code' must be between 1 and 65535 (domain: ${domain.code}, subdomain: ${subdomain.code}, error: ${name}).`
|
|
59
|
+
error.code > 0x0000 && error.code <= 0xffff,
|
|
60
|
+
`Error configuration file : Field 'code' must be between 1 and 65535 (domain: ${domain.code}, subdomain: ${subdomain.code}, error: ${name}).`
|
|
61
|
+
);
|
|
59
62
|
assert(
|
|
60
|
-
!
|
|
61
|
-
`Error configuration file : code ${error.code} for error '${name}' is not unique (domain: ${domain.code}, subdomain: ${subdomain.code}).`
|
|
63
|
+
!codes.has(error.code),
|
|
64
|
+
`Error configuration file : code ${error.code} for error '${name}' is not unique (domain: ${domain.code}, subdomain: ${subdomain.code}).`
|
|
65
|
+
);
|
|
62
66
|
|
|
63
67
|
codes.add(error.code);
|
|
64
68
|
|
|
65
69
|
assert(
|
|
66
|
-
has(error,
|
|
67
|
-
`Error configuration file : Missing required 'message' field (domain: ${domain.code}, subdomain: ${subdomain.code}, error: ${name}).`
|
|
70
|
+
has(error, "message"),
|
|
71
|
+
`Error configuration file : Missing required 'message' field (domain: ${domain.code}, subdomain: ${subdomain.code}, error: ${name}).`
|
|
72
|
+
);
|
|
68
73
|
assert(
|
|
69
|
-
typeof error.message ===
|
|
70
|
-
`Error configuration file : Field 'message' must be a non-empty string (domain: ${domain.code}, subdomain: ${subdomain.code}, error: ${name}).`
|
|
74
|
+
typeof error.message === "string" && error.message.length > 0,
|
|
75
|
+
`Error configuration file : Field 'message' must be a non-empty string (domain: ${domain.code}, subdomain: ${subdomain.code}, error: ${name}).`
|
|
76
|
+
);
|
|
71
77
|
|
|
72
78
|
assert(
|
|
73
|
-
has(error,
|
|
74
|
-
`Error configuration file : Missing required 'class' field (domain: ${domain.code}, subdomain: ${subdomain.code}, error: ${name}).`
|
|
79
|
+
has(error, "class"),
|
|
80
|
+
`Error configuration file : Missing required 'class' field (domain: ${domain.code}, subdomain: ${subdomain.code}, error: ${name}).`
|
|
81
|
+
);
|
|
75
82
|
assert(
|
|
76
|
-
typeof error.class ===
|
|
77
|
-
`Error configuration file : Field 'class' must be a string (domain: ${domain.code}, subdomain: ${subdomain.code}, error: ${name}).`
|
|
83
|
+
typeof error.class === "string",
|
|
84
|
+
`Error configuration file : Field 'class' must be a string (domain: ${domain.code}, subdomain: ${subdomain.code}, error: ${name}).`
|
|
85
|
+
);
|
|
78
86
|
assert(
|
|
79
87
|
has(errors, error.class),
|
|
80
|
-
`Error configuration file : Field 'class' must target a known KuzzleError object (domain: ${domain.code}, subdomain: ${subdomain.code}, error: ${name}), '${name.class}' does not exist.`
|
|
88
|
+
`Error configuration file : Field 'class' must target a known KuzzleError object (domain: ${domain.code}, subdomain: ${subdomain.code}, error: ${name}), '${name.class}' does not exist.`
|
|
89
|
+
);
|
|
81
90
|
|
|
82
91
|
// plugin errors aren't required to have descriptions
|
|
83
|
-
if (!
|
|
92
|
+
if (!options.plugin) {
|
|
84
93
|
assert(
|
|
85
|
-
typeof error.description ===
|
|
86
|
-
`Error configuration file : Field 'description' must be a non-empty string (domain: ${domain.code}, subdomain: ${subdomain.code}, error: ${name}).`
|
|
94
|
+
typeof error.description === "string" && error.description.length > 0,
|
|
95
|
+
`Error configuration file : Field 'description' must be a non-empty string (domain: ${domain.code}, subdomain: ${subdomain.code}, error: ${name}).`
|
|
96
|
+
);
|
|
87
97
|
}
|
|
88
98
|
|
|
89
99
|
if (error.deprecated !== undefined && error.deprecated !== null) {
|
|
90
100
|
assert(
|
|
91
|
-
typeof error.deprecated ===
|
|
92
|
-
`Error configuration file : Field 'deprecated' must be a non-empty string (domain: ${domain.code}, subdomain: ${subdomain.code}, error: ${name}).`
|
|
101
|
+
typeof error.deprecated === "string" && error.deprecated.length > 0,
|
|
102
|
+
`Error configuration file : Field 'deprecated' must be a non-empty string (domain: ${domain.code}, subdomain: ${subdomain.code}, error: ${name}).`
|
|
103
|
+
);
|
|
93
104
|
}
|
|
94
105
|
}
|
|
95
106
|
}
|
|
96
107
|
|
|
97
|
-
function checkSubdomains
|
|
108
|
+
function checkSubdomains(domain, options) {
|
|
98
109
|
const subdomainCodes = new Set();
|
|
99
110
|
|
|
100
111
|
for (const subdomainName of Object.keys(domain.subDomains)) {
|
|
101
112
|
const subdomain = domain.subDomains[subdomainName];
|
|
102
113
|
|
|
103
114
|
// Subdomain code for plugins is not required and is automatically set to 0
|
|
104
|
-
if (!
|
|
115
|
+
if (!options.plugin) {
|
|
105
116
|
assert(
|
|
106
|
-
has(subdomain,
|
|
107
|
-
`Error configuration file : Missing required 'code' field (domain: ${domain.code}, subdomain: ${subdomainName}).`
|
|
108
|
-
|
|
109
|
-
else if (!
|
|
117
|
+
has(subdomain, "code"),
|
|
118
|
+
`Error configuration file : Missing required 'code' field (domain: ${domain.code}, subdomain: ${subdomainName}).`
|
|
119
|
+
);
|
|
120
|
+
} else if (!has(subdomain, "code")) {
|
|
110
121
|
subdomain.code = 0;
|
|
111
122
|
}
|
|
112
123
|
|
|
113
124
|
assert(
|
|
114
125
|
Number.isInteger(subdomain.code),
|
|
115
|
-
`Error configuration file : Field 'code' must be an integer (domain: ${domain.code}, subdomain: ${subdomainName}).`
|
|
126
|
+
`Error configuration file : Field 'code' must be an integer (domain: ${domain.code}, subdomain: ${subdomainName}).`
|
|
127
|
+
);
|
|
116
128
|
assert(
|
|
117
|
-
subdomain.code >= 0x00 && subdomain.code <=
|
|
118
|
-
`Error configuration file : Field 'code' must be between 0 and 255 (domain: ${domain.code}, subdomain: ${subdomainName}).`
|
|
129
|
+
subdomain.code >= 0x00 && subdomain.code <= 0xff,
|
|
130
|
+
`Error configuration file : Field 'code' must be between 0 and 255 (domain: ${domain.code}, subdomain: ${subdomainName}).`
|
|
131
|
+
);
|
|
119
132
|
assert(
|
|
120
|
-
!
|
|
121
|
-
`Error configuration file : code ${subdomain.code} for subdomain '${subdomainName}' is not unique (domain: ${domain.code}).`
|
|
133
|
+
!subdomainCodes.has(subdomain.code),
|
|
134
|
+
`Error configuration file : code ${subdomain.code} for subdomain '${subdomainName}' is not unique (domain: ${domain.code}).`
|
|
135
|
+
);
|
|
122
136
|
|
|
123
137
|
// We don't allow duplicates, except for defaulted plugin subdomain codes
|
|
124
|
-
if (!
|
|
138
|
+
if (!options.plugin || subdomain.code > 0) {
|
|
125
139
|
subdomainCodes.add(subdomain.code);
|
|
126
140
|
}
|
|
127
141
|
|
|
128
142
|
assert(
|
|
129
|
-
has(subdomain,
|
|
130
|
-
`Error configuration file : Missing required 'errors' field (domain: ${domain.code}, subdomain: ${subdomainName}).`
|
|
143
|
+
has(subdomain, "errors"),
|
|
144
|
+
`Error configuration file : Missing required 'errors' field (domain: ${domain.code}, subdomain: ${subdomainName}).`
|
|
145
|
+
);
|
|
131
146
|
assert(
|
|
132
147
|
isPlainObject(subdomain.errors),
|
|
133
|
-
`Error configuration file : Field 'errors' must be an object (domain: ${domain.code}, subdomain: ${subdomainName}).`
|
|
148
|
+
`Error configuration file : Field 'errors' must be an object (domain: ${domain.code}, subdomain: ${subdomainName}).`
|
|
149
|
+
);
|
|
134
150
|
|
|
135
151
|
checkErrors(subdomain, domain, options);
|
|
136
152
|
}
|
|
137
153
|
}
|
|
138
154
|
|
|
139
|
-
function checkDomains
|
|
155
|
+
function checkDomains(errorCodesFiles, options = { plugin: false }) {
|
|
140
156
|
const domainCodes = new Set();
|
|
141
157
|
|
|
142
158
|
for (const domainName of Object.keys(errorCodesFiles)) {
|
|
143
159
|
const domain = errorCodesFiles[domainName];
|
|
144
160
|
|
|
145
161
|
assert(
|
|
146
|
-
has(domain,
|
|
147
|
-
`Error configuration file : Missing required 'code' field. (domain: '${domainName}').`
|
|
162
|
+
has(domain, "code"),
|
|
163
|
+
`Error configuration file : Missing required 'code' field. (domain: '${domainName}').`
|
|
164
|
+
);
|
|
148
165
|
assert(
|
|
149
166
|
Number.isInteger(domain.code),
|
|
150
|
-
`Error configuration file : Field 'code' must be an integer. (domain: '${domainName}').`
|
|
167
|
+
`Error configuration file : Field 'code' must be an integer. (domain: '${domainName}').`
|
|
168
|
+
);
|
|
151
169
|
assert(
|
|
152
|
-
domain.code >= 0x00 && domain.code <=
|
|
153
|
-
`Error configuration file : Field 'code' must be between 0 and 255. (domain: '${domainName}').`
|
|
170
|
+
domain.code >= 0x00 && domain.code <= 0xff,
|
|
171
|
+
`Error configuration file : Field 'code' must be between 0 and 255. (domain: '${domainName}').`
|
|
172
|
+
);
|
|
154
173
|
assert(
|
|
155
|
-
!
|
|
156
|
-
`Error configuration file : code ${domain.code} for domain ${domainName} is not unique.`
|
|
174
|
+
!domainCodes.has(domain.code),
|
|
175
|
+
`Error configuration file : code ${domain.code} for domain ${domainName} is not unique.`
|
|
176
|
+
);
|
|
157
177
|
|
|
158
178
|
domainCodes.add(domain.code);
|
|
159
179
|
|
|
160
180
|
assert(
|
|
161
|
-
has(domain,
|
|
162
|
-
`Error configuration file : Missing required 'subDomains' field. (domain: '${domainName}').`
|
|
181
|
+
has(domain, "subDomains"),
|
|
182
|
+
`Error configuration file : Missing required 'subDomains' field. (domain: '${domainName}').`
|
|
183
|
+
);
|
|
163
184
|
assert(
|
|
164
185
|
isPlainObject(domain.subDomains),
|
|
165
|
-
`Error configuration file : Field 'subDomains' must be an object. (domain: '${domainName}').`
|
|
186
|
+
`Error configuration file : Field 'subDomains' must be an object. (domain: '${domainName}').`
|
|
187
|
+
);
|
|
166
188
|
|
|
167
189
|
checkSubdomains(domain, options);
|
|
168
190
|
}
|
|
169
191
|
}
|
|
170
192
|
|
|
171
|
-
function loadPluginsErrors
|
|
193
|
+
function loadPluginsErrors(pluginManifest, pluginCode) {
|
|
172
194
|
// @todo this should be in its own, independant domain
|
|
173
195
|
domains.plugin.subDomains[pluginManifest.name] = {
|
|
174
196
|
code: pluginCode,
|
|
175
|
-
errors: pluginManifest.errors
|
|
197
|
+
errors: pluginManifest.errors,
|
|
176
198
|
};
|
|
177
199
|
checkDomains({ plugin: domains.plugin }, { plugin: true });
|
|
178
200
|
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export * from
|
|
3
|
-
export * from
|
|
4
|
-
export * from
|
|
5
|
-
export * from
|
|
6
|
-
export * from
|
|
7
|
-
export * from
|
|
8
|
-
export * from
|
|
9
|
-
export * from
|
|
10
|
-
export * from
|
|
11
|
-
export * from
|
|
12
|
-
export * from
|
|
13
|
-
export * from
|
|
14
|
-
export * from
|
|
15
|
-
export * from
|
|
1
|
+
export * from "./badRequestError";
|
|
2
|
+
export * from "./externalServiceError";
|
|
3
|
+
export * from "./forbiddenError";
|
|
4
|
+
export * from "./gatewayTimeoutError";
|
|
5
|
+
export * from "./internalError";
|
|
6
|
+
export * from "./kuzzleError";
|
|
7
|
+
export * from "./multipleErrorsError";
|
|
8
|
+
export * from "./notFoundError";
|
|
9
|
+
export * from "./partialError";
|
|
10
|
+
export * from "./pluginImplementationError";
|
|
11
|
+
export * from "./serviceUnavailableError";
|
|
12
|
+
export * from "./sizeLimitError";
|
|
13
|
+
export * from "./unauthorizedError";
|
|
14
|
+
export * from "./preconditionError";
|
|
15
|
+
export * from "./tooManyRequestsError";
|
|
@@ -32,7 +32,7 @@ class MultipleErrorsError extends kuzzleError_1.KuzzleError {
|
|
|
32
32
|
const serialized = super.toJSON();
|
|
33
33
|
serialized.count = this.count;
|
|
34
34
|
try {
|
|
35
|
-
serialized.errors = this.errors.map(error => error.toJSON());
|
|
35
|
+
serialized.errors = this.errors.map((error) => error.toJSON());
|
|
36
36
|
}
|
|
37
37
|
catch (error) {
|
|
38
38
|
serialized.errors = this.errors;
|
|
@@ -24,7 +24,7 @@ exports.PartialError = void 0;
|
|
|
24
24
|
const kuzzleError_1 = require("./kuzzleError");
|
|
25
25
|
class PartialError extends kuzzleError_1.KuzzleError {
|
|
26
26
|
constructor(message, body, id, code) {
|
|
27
|
-
if (code === undefined && typeof id ===
|
|
27
|
+
if (code === undefined && typeof id === "number") {
|
|
28
28
|
code = id;
|
|
29
29
|
id = body;
|
|
30
30
|
body = [];
|
|
@@ -25,7 +25,8 @@ const kuzzleError_1 = require("./kuzzleError");
|
|
|
25
25
|
class PluginImplementationError extends kuzzleError_1.KuzzleError {
|
|
26
26
|
constructor(message, id, code) {
|
|
27
27
|
super(message, 500, id, code);
|
|
28
|
-
this.message +=
|
|
28
|
+
this.message +=
|
|
29
|
+
"\nThis is probably not a Kuzzle error, but a problem with a plugin implementation.";
|
|
29
30
|
}
|
|
30
31
|
}
|
|
31
32
|
exports.PluginImplementationError = PluginImplementationError;
|
package/lib/kerror/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import * as errors from
|
|
2
|
-
import { KuzzleError } from
|
|
3
|
-
import { ErrorDomains } from
|
|
1
|
+
import * as errors from "./errors";
|
|
2
|
+
import { KuzzleError } from "./errors";
|
|
3
|
+
import { ErrorDomains } from "../types";
|
|
4
4
|
/**
|
|
5
5
|
* Construct and return the corresponding error
|
|
6
6
|
*
|
package/lib/kerror/index.js
CHANGED
|
@@ -81,22 +81,24 @@ function rawGet(domains, domain, subdomain, error, ...placeholders) {
|
|
|
81
81
|
}
|
|
82
82
|
const kuzzleError = lodash_1.default.get(domains, `${domain}.subDomains.${subdomain}.errors.${error}`);
|
|
83
83
|
if (!kuzzleError) {
|
|
84
|
-
return get(
|
|
84
|
+
return get("core", "fatal", "unexpected_error", `${domain}.${subdomain}.${error}`);
|
|
85
85
|
}
|
|
86
86
|
let body = null;
|
|
87
|
-
if (kuzzleError.class ===
|
|
87
|
+
if (kuzzleError.class === "PartialError" ||
|
|
88
|
+
kuzzleError.class === "MultipleErrorsError") {
|
|
88
89
|
body = placeholders.splice(-1)[0];
|
|
89
90
|
}
|
|
90
91
|
const message = options.message || (0, util_1.format)(kuzzleError.message, ...placeholders);
|
|
91
92
|
const id = `${domain}.${subdomain}.${error}`;
|
|
92
|
-
const code = domains[domain].code << 24
|
|
93
|
-
|
|
94
|
-
|
|
93
|
+
const code = (domains[domain].code << 24) |
|
|
94
|
+
(domains[domain].subDomains[subdomain].code << 16) |
|
|
95
|
+
domains[domain].subDomains[subdomain].errors[error].code;
|
|
95
96
|
let kerror;
|
|
96
|
-
if (kuzzleError.class ===
|
|
97
|
+
if (kuzzleError.class === "PartialError" ||
|
|
98
|
+
kuzzleError.class === "MultipleErrorsError") {
|
|
97
99
|
kerror = new errors[kuzzleError.class](message, body, id, code);
|
|
98
100
|
}
|
|
99
|
-
else if (kuzzleError.class ===
|
|
101
|
+
else if (kuzzleError.class === "KuzzleError") {
|
|
100
102
|
const status = kuzzleError.status || 500;
|
|
101
103
|
kerror = new errors.KuzzleError(message, status, id, code);
|
|
102
104
|
}
|
|
@@ -104,7 +106,7 @@ function rawGet(domains, domain, subdomain, error, ...placeholders) {
|
|
|
104
106
|
kerror = new errors[kuzzleError.class](message, id, code);
|
|
105
107
|
}
|
|
106
108
|
kerror.props = placeholders;
|
|
107
|
-
if (kuzzleError.class !==
|
|
109
|
+
if (kuzzleError.class !== "InternalError") {
|
|
108
110
|
cleanStackTrace(kerror);
|
|
109
111
|
}
|
|
110
112
|
return kerror;
|
|
@@ -123,13 +125,12 @@ exports.rawGet = rawGet;
|
|
|
123
125
|
*/
|
|
124
126
|
function cleanStackTrace(error) {
|
|
125
127
|
// Keep the original error message
|
|
126
|
-
const messageLength = error.message.split(
|
|
128
|
+
const messageLength = error.message.split("\n").length;
|
|
127
129
|
const currentFileName = _getCurrentFileName();
|
|
128
130
|
// we keep the new error instantiation line ("new ...Error (") on purpose:
|
|
129
131
|
// this will allow us to replace it without inserting a new line in the array,
|
|
130
132
|
// saving us from building a new array
|
|
131
|
-
const newStack = error.stack.split(
|
|
132
|
-
.filter((line, index) => {
|
|
133
|
+
const newStack = error.stack.split("\n").filter((line, index) => {
|
|
133
134
|
if (index < messageLength) {
|
|
134
135
|
return true;
|
|
135
136
|
}
|
|
@@ -137,8 +138,8 @@ function cleanStackTrace(error) {
|
|
|
137
138
|
return !line.includes(currentFileName);
|
|
138
139
|
});
|
|
139
140
|
// insert a deletion message in place of the new error instantiation line
|
|
140
|
-
newStack[messageLength] =
|
|
141
|
-
error.stack = newStack.join(
|
|
141
|
+
newStack[messageLength] = " [...Kuzzle internal calls deleted...]";
|
|
142
|
+
error.stack = newStack.join("\n");
|
|
142
143
|
}
|
|
143
144
|
/**
|
|
144
145
|
* Returns a promise rejected with the corresponding error
|
|
@@ -169,12 +170,12 @@ function rawGetFrom(domains, source, domain, subdomain, error, ...placeholders)
|
|
|
169
170
|
// If a stacktrace is present, we need to modify the first line because it
|
|
170
171
|
// still contains the original error message
|
|
171
172
|
if (derivedError.stack && derivedError.stack.length) {
|
|
172
|
-
const stackArray = source.stack.split(
|
|
173
|
+
const stackArray = source.stack.split("\n");
|
|
173
174
|
stackArray.shift();
|
|
174
175
|
derivedError.stack = [
|
|
175
176
|
`${derivedError.constructor.name}: ${derivedError.message}`,
|
|
176
|
-
...stackArray
|
|
177
|
-
].join(
|
|
177
|
+
...stackArray,
|
|
178
|
+
].join("\n");
|
|
178
179
|
}
|
|
179
180
|
return derivedError;
|
|
180
181
|
}
|