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
|
@@ -21,140 +21,149 @@
|
|
|
21
21
|
|
|
22
22
|
/* eslint sort-keys: 0 */
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
"use strict";
|
|
25
25
|
|
|
26
|
-
const Bluebird = require(
|
|
27
|
-
const _ = require(
|
|
28
|
-
const es = require(
|
|
26
|
+
const Bluebird = require("bluebird");
|
|
27
|
+
const _ = require("lodash");
|
|
28
|
+
const es = require("@elastic/elasticsearch");
|
|
29
29
|
|
|
30
|
-
const { KuzzleError } = require(
|
|
31
|
-
const debug = require(
|
|
32
|
-
const kerror = require(
|
|
30
|
+
const { KuzzleError } = require("../../kerror/errors");
|
|
31
|
+
const debug = require("../../util/debug")("kuzzle:services:storage:ESCommon");
|
|
32
|
+
const kerror = require("../../kerror").wrap("services", "storage");
|
|
33
33
|
|
|
34
34
|
const errorMessagesMapping = [
|
|
35
35
|
{
|
|
36
|
-
regex:
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
regex:
|
|
37
|
+
/^\[es_rejected_execution_exception] rejected execution .*? on EsThreadPoolExecutor\[(.*?), .*$/,
|
|
38
|
+
subCode: "too_many_operations",
|
|
39
|
+
getPlaceholders: (esError, matches) => [matches[1]],
|
|
39
40
|
},
|
|
40
41
|
{
|
|
41
42
|
// [illegal_argument_exception] object mapping [titi] can't be changed from nested to non-nested
|
|
42
|
-
regex:
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
regex:
|
|
44
|
+
/^\[illegal_argument_exception] object mapping \[(.*?)] can't be changed from nested to non-nested$/,
|
|
45
|
+
subcode: "cannot_change_mapping",
|
|
46
|
+
getPlaceholders: (esError, matches) => [matches[1]],
|
|
45
47
|
},
|
|
46
48
|
{
|
|
47
49
|
// [illegal_argument_exception] object mapping [baz] can't be changed from non-nested to nested
|
|
48
|
-
regex:
|
|
49
|
-
|
|
50
|
-
|
|
50
|
+
regex:
|
|
51
|
+
/^\[illegal_argument_exception] object mapping \[(.*?)] can't be changed from non-nested to nested$/,
|
|
52
|
+
subcode: "cannot_change_mapping",
|
|
53
|
+
getPlaceholders: (esError, matches) => [matches[1]],
|
|
51
54
|
},
|
|
52
55
|
{
|
|
53
56
|
// [illegal_argument_exception] Can't merge a non object mapping [aeaze] with an object mapping [aeaze]
|
|
54
|
-
regex:
|
|
55
|
-
|
|
56
|
-
|
|
57
|
+
regex:
|
|
58
|
+
/^\[illegal_argument_exception] Can't merge a non object mapping \[(.*?)] with an object mapping \[(.*?)]$/,
|
|
59
|
+
subcode: "cannot_change_mapping",
|
|
60
|
+
getPlaceholders: (esError, matches) => [matches[1]],
|
|
57
61
|
},
|
|
58
62
|
{
|
|
59
63
|
// [illegal_argument_exception] [tutu.tutu] is defined as an object in mapping [aze] but this name is already used for a field in other types
|
|
60
|
-
regex:
|
|
61
|
-
|
|
62
|
-
|
|
64
|
+
regex:
|
|
65
|
+
/^\[illegal_argument_exception] \[(.*?)] is defined as an object in mapping \[(.*?)] but this name is already used for a field in other types$/,
|
|
66
|
+
subcode: "duplicate_field_mapping",
|
|
67
|
+
getPlaceholders: (esError, matches) => [matches[1], matches[2]],
|
|
63
68
|
},
|
|
64
69
|
{
|
|
65
70
|
// [illegal_argument_exception] mapper [source.flags] of different type, current_type [string], merged_type [long]
|
|
66
|
-
regex:
|
|
67
|
-
|
|
68
|
-
|
|
71
|
+
regex:
|
|
72
|
+
/^mapper \[(.*?)] of different type, current_type \[(.*?)], merged_type \[(.*?)]$/,
|
|
73
|
+
subcode: "cannot_change_mapping",
|
|
74
|
+
getPlaceholders: (esError, matches) => [matches[1]],
|
|
69
75
|
},
|
|
70
76
|
{
|
|
71
77
|
// [mapper_parsing_exception] Mapping definition for [flags] has unsupported parameters: [index : not_analyzed]
|
|
72
78
|
// eslint-disable-next-line no-regex-spaces
|
|
73
|
-
regex:
|
|
74
|
-
|
|
75
|
-
|
|
79
|
+
regex:
|
|
80
|
+
/^\[mapper_parsing_exception] Mapping definition for \[(.*?)] has unsupported parameters: \[(.*?)]$/,
|
|
81
|
+
subcode: "unexpected_properties",
|
|
82
|
+
getPlaceholders: (esError, matches) => [matches[2], matches[1]],
|
|
76
83
|
},
|
|
77
84
|
{
|
|
78
85
|
// [mapper_parsing_exception] No handler for type [boolean] declared on field [not]
|
|
79
|
-
regex:
|
|
80
|
-
|
|
81
|
-
|
|
86
|
+
regex:
|
|
87
|
+
/^\[mapper_parsing_exception] No handler for type \[(.*?)] declared on field \[(.*?)]$/,
|
|
88
|
+
subcode: "invalid_mapping_type",
|
|
89
|
+
getPlaceholders: (esError, matches) => [matches[2], matches[1]],
|
|
82
90
|
},
|
|
83
91
|
{
|
|
84
92
|
// [mapper_parsing_exception] failed to parse [conditions.host.flags]
|
|
85
93
|
regex: /^\[mapper_parsing_exception] failed to parse \[(.*?)]$/,
|
|
86
|
-
subcode:
|
|
87
|
-
getPlaceholders: (esError, matches) => [matches[1]]
|
|
94
|
+
subcode: "wrong_mapping_property",
|
|
95
|
+
getPlaceholders: (esError, matches) => [matches[1]],
|
|
88
96
|
},
|
|
89
97
|
{
|
|
90
98
|
// Failed to parse mapping [_doc]: Expected map for property [fields] on field [enabled] but got a class java.lang.String
|
|
91
|
-
regex:
|
|
92
|
-
|
|
93
|
-
|
|
99
|
+
regex:
|
|
100
|
+
/^Failed to parse mapping \[.*\]: Expected \w+ for property \[(.*)\] on field \[(.*)\]/,
|
|
101
|
+
subcode: "wrong_mapping_property",
|
|
102
|
+
getPlaceholders: (esError, matches) => [`${matches[2]}.${matches[1]}`],
|
|
94
103
|
},
|
|
95
104
|
{
|
|
96
105
|
// [index_not_found_exception] no such index, with { resource.type=index_or_alias & resource.id=foso & index=foso }
|
|
97
106
|
regex: /^no such index \[([%&])(.*)\.(.*)\]$/,
|
|
98
|
-
subcode:
|
|
99
|
-
getPlaceholders: (esError, matches) => [
|
|
100
|
-
matches[2],
|
|
101
|
-
matches[3]
|
|
102
|
-
]
|
|
107
|
+
subcode: "unknown_collection",
|
|
108
|
+
getPlaceholders: (esError, matches) => [matches[2], matches[3]],
|
|
103
109
|
},
|
|
104
110
|
{
|
|
105
111
|
// [mapper_parsing_exception] Expected map for property [fields] on field [foo] but got a class java.lang.String
|
|
106
|
-
regex:
|
|
107
|
-
|
|
108
|
-
|
|
112
|
+
regex:
|
|
113
|
+
/^\[mapper_parsing_exception] Expected map for property \[(.*?)] on field \[(.*?)] but got a class java\.lang\.String$/,
|
|
114
|
+
subcode: "wrong_mapping_property",
|
|
115
|
+
getPlaceholders: (esError, matches) => [`${matches[2]}.${matches[1]}`],
|
|
109
116
|
},
|
|
110
117
|
{
|
|
111
|
-
regex:
|
|
112
|
-
|
|
113
|
-
|
|
118
|
+
regex:
|
|
119
|
+
/^\[version_conflict_engine_exception] \[data]\[(.*?)]: version conflict.*$/,
|
|
120
|
+
subcode: "too_many_changes",
|
|
121
|
+
getPlaceholders: (esError, matches) => [matches[1]],
|
|
114
122
|
},
|
|
115
123
|
{
|
|
116
124
|
//[liia]: version conflict, document already exists (current version [2])
|
|
117
125
|
regex: /^\[(.*)\]: version conflict, document already exists.*/,
|
|
118
|
-
subcode:
|
|
119
|
-
getPlaceholders: () => []
|
|
126
|
+
subcode: "document_already_exists",
|
|
127
|
+
getPlaceholders: () => [],
|
|
120
128
|
},
|
|
121
129
|
{
|
|
122
130
|
// Unknown key for a START_OBJECT in [term].
|
|
123
131
|
regex: /^Unknown key for a START_OBJECT in \[(.*)\].*/,
|
|
124
|
-
subcode:
|
|
125
|
-
getPlaceholders: (esError, matches) => [matches[1]]
|
|
132
|
+
subcode: "invalid_search_query",
|
|
133
|
+
getPlaceholders: (esError, matches) => [matches[1]],
|
|
126
134
|
},
|
|
127
135
|
{
|
|
128
136
|
// mapping set to strict, dynamic introduction of [lehuong] within [_doc] is not allowed
|
|
129
|
-
regex:
|
|
130
|
-
|
|
137
|
+
regex:
|
|
138
|
+
/^mapping set to strict, dynamic introduction of \[(.+)\] within \[.+\] is not allowed/,
|
|
139
|
+
subcode: "strict_mapping_rejection",
|
|
131
140
|
getPlaceholders: (esError, matches) => {
|
|
132
141
|
// "/%26index.collection/_doc"
|
|
133
142
|
const esPath = esError.meta.meta.request.params.path;
|
|
134
143
|
// keep only "index"
|
|
135
|
-
const index = esPath.split(
|
|
144
|
+
const index = esPath.split(".")[0].split("%26")[1];
|
|
136
145
|
// keep only "collection"
|
|
137
|
-
const collection = esPath.substr(esPath.indexOf(
|
|
146
|
+
const collection = esPath.substr(esPath.indexOf(".") + 1).split("/")[0];
|
|
138
147
|
|
|
139
148
|
return [matches[1], index, collection];
|
|
140
|
-
}
|
|
149
|
+
},
|
|
141
150
|
},
|
|
142
151
|
{
|
|
143
152
|
// [and] query malformed, no start_object after query name
|
|
144
153
|
regex: /^\[(.*)\] query malformed, no start_object after query name/,
|
|
145
|
-
subcode:
|
|
146
|
-
getPlaceholders: (esError, matches) => [matches[1]]
|
|
154
|
+
subcode: "unknown_query_keyword",
|
|
155
|
+
getPlaceholders: (esError, matches) => [matches[1]],
|
|
147
156
|
},
|
|
148
157
|
{
|
|
149
158
|
// no [query] registered for [equals]
|
|
150
159
|
regex: /^no \[query\] registered for \[(.*)\]/,
|
|
151
|
-
subcode:
|
|
152
|
-
getPlaceholders: (esError, matches) => [matches[1]]
|
|
160
|
+
subcode: "unknown_query_keyword",
|
|
161
|
+
getPlaceholders: (esError, matches) => [matches[1]],
|
|
153
162
|
},
|
|
154
163
|
];
|
|
155
164
|
|
|
156
165
|
class ESWrapper {
|
|
157
|
-
constructor
|
|
166
|
+
constructor(client) {
|
|
158
167
|
this.client = client;
|
|
159
168
|
}
|
|
160
169
|
|
|
@@ -164,12 +173,12 @@ class ESWrapper {
|
|
|
164
173
|
* @param {Error} error
|
|
165
174
|
* @returns {KuzzleError}
|
|
166
175
|
*/
|
|
167
|
-
formatESError
|
|
176
|
+
formatESError(error) {
|
|
168
177
|
if (error instanceof KuzzleError) {
|
|
169
178
|
return error;
|
|
170
179
|
}
|
|
171
180
|
|
|
172
|
-
global.kuzzle.emit(
|
|
181
|
+
global.kuzzle.emit("services:storage:error", {
|
|
173
182
|
message: `Elasticsearch Client error: ${error.message}`,
|
|
174
183
|
// /!\ not all ES error classes have a "meta" property
|
|
175
184
|
meta: error.meta || null,
|
|
@@ -177,9 +186,9 @@ class ESWrapper {
|
|
|
177
186
|
});
|
|
178
187
|
|
|
179
188
|
if (error instanceof es.errors.NoLivingConnectionsError) {
|
|
180
|
-
throw kerror.get(
|
|
189
|
+
throw kerror.get("not_connected");
|
|
181
190
|
}
|
|
182
|
-
const message = _.get(error,
|
|
191
|
+
const message = _.get(error, "meta.body.error.reason", error.message);
|
|
183
192
|
|
|
184
193
|
// Try to match a known elasticsearch error
|
|
185
194
|
for (const betterError of errorMessagesMapping) {
|
|
@@ -188,7 +197,8 @@ class ESWrapper {
|
|
|
188
197
|
if (matches) {
|
|
189
198
|
return kerror.get(
|
|
190
199
|
betterError.subcode,
|
|
191
|
-
...betterError.getPlaceholders(error, matches)
|
|
200
|
+
...betterError.getPlaceholders(error, matches)
|
|
201
|
+
);
|
|
192
202
|
}
|
|
193
203
|
}
|
|
194
204
|
|
|
@@ -209,45 +219,45 @@ class ESWrapper {
|
|
|
209
219
|
return this._handleUnknownError(error, message);
|
|
210
220
|
}
|
|
211
221
|
|
|
212
|
-
reject
|
|
222
|
+
reject(error) {
|
|
213
223
|
return Bluebird.reject(this.formatESError(error));
|
|
214
224
|
}
|
|
215
225
|
|
|
216
|
-
_handleConflictError
|
|
226
|
+
_handleConflictError(error, message) {
|
|
217
227
|
debug('unhandled "Conflict" elasticsearch error: %a', error);
|
|
218
228
|
|
|
219
|
-
return kerror.get(
|
|
229
|
+
return kerror.get("unexpected_error", message);
|
|
220
230
|
}
|
|
221
231
|
|
|
222
|
-
_handleNotFoundError
|
|
232
|
+
_handleNotFoundError(error, message) {
|
|
223
233
|
let errorMessage = message;
|
|
224
234
|
|
|
225
235
|
// _index= "&nyc-open-data.yellow-taxi"
|
|
226
|
-
const index = error.body._index.split(
|
|
227
|
-
const collection = error.body._index.split(
|
|
236
|
+
const index = error.body._index.split(".")[0].slice(1);
|
|
237
|
+
const collection = error.body._index.split(".")[1];
|
|
228
238
|
|
|
229
239
|
// 404 on a GET document
|
|
230
240
|
if (error.body.found === false) {
|
|
231
|
-
return kerror.get(
|
|
241
|
+
return kerror.get("not_found", error.body._id, index, collection);
|
|
232
242
|
}
|
|
233
243
|
|
|
234
244
|
// 404 on DELETE document (ES error payloads are so cool!)
|
|
235
245
|
if (error.meta.body._id) {
|
|
236
|
-
return kerror.get(
|
|
246
|
+
return kerror.get("not_found", error.meta.body._id, index, collection);
|
|
237
247
|
}
|
|
238
248
|
|
|
239
249
|
if (error.meta.body && error.meta.body.error) {
|
|
240
250
|
errorMessage = error.meta.body.error
|
|
241
|
-
? `${error.meta.body.error.reason}: ${error.meta.body.error[
|
|
251
|
+
? `${error.meta.body.error.reason}: ${error.meta.body.error["resource.id"]}`
|
|
242
252
|
: `${error.message}: ${error.body._id}`;
|
|
243
253
|
}
|
|
244
254
|
|
|
245
255
|
debug('unhandled "NotFound" elasticsearch error: %a', error);
|
|
246
256
|
|
|
247
|
-
return kerror.get(
|
|
257
|
+
return kerror.get("unexpected_not_found", errorMessage);
|
|
248
258
|
}
|
|
249
259
|
|
|
250
|
-
_handleBadRequestError
|
|
260
|
+
_handleBadRequestError(error, message) {
|
|
251
261
|
let errorMessage = message;
|
|
252
262
|
|
|
253
263
|
if (error.meta.body && error.meta.body.error) {
|
|
@@ -256,24 +266,31 @@ class ESWrapper {
|
|
|
256
266
|
: error.meta.body.error.reason;
|
|
257
267
|
|
|
258
268
|
// empty query throws exception with ES 7
|
|
259
|
-
if (
|
|
260
|
-
|
|
269
|
+
if (
|
|
270
|
+
error.meta.body.error.type === "parsing_exception" &&
|
|
271
|
+
_.get(error, "meta.body.error.caused_by.type") ===
|
|
272
|
+
"illegal_argument_exception"
|
|
273
|
+
) {
|
|
261
274
|
errorMessage = error.meta.body.error.caused_by.reason;
|
|
262
275
|
}
|
|
263
276
|
}
|
|
264
277
|
|
|
265
|
-
debug(
|
|
278
|
+
debug(
|
|
279
|
+
'unhandled "BadRequest" elasticsearch error: %a',
|
|
280
|
+
_.get(error, "meta.body.error.reason", error.message)
|
|
281
|
+
);
|
|
266
282
|
|
|
267
|
-
return kerror.get(
|
|
283
|
+
return kerror.get("unexpected_bad_request", errorMessage);
|
|
268
284
|
}
|
|
269
285
|
|
|
270
|
-
_handleUnknownError
|
|
286
|
+
_handleUnknownError(error, message) {
|
|
271
287
|
debug(
|
|
272
|
-
|
|
273
|
-
_.get(error,
|
|
274
|
-
error
|
|
288
|
+
"unhandled elasticsearch error (unhandled type: %s): %o",
|
|
289
|
+
_.get(error, "error.meta.statusCode", "<no status code>"),
|
|
290
|
+
error
|
|
291
|
+
);
|
|
275
292
|
|
|
276
|
-
return kerror.get(
|
|
293
|
+
return kerror.get("unexpected_error", message);
|
|
277
294
|
}
|
|
278
295
|
}
|
|
279
296
|
|
|
@@ -19,105 +19,99 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
24
|
class KeywordError extends Error {
|
|
25
|
-
constructor
|
|
26
|
-
super(
|
|
25
|
+
constructor(type, name) {
|
|
26
|
+
super(
|
|
27
|
+
`The ${type} "${name}" of Koncorde DSL is not supported for search queries.`
|
|
28
|
+
);
|
|
27
29
|
|
|
28
30
|
this.keyword = { name, type };
|
|
29
31
|
}
|
|
30
32
|
}
|
|
31
33
|
|
|
32
|
-
const KONCORDE_OPERATORS = [
|
|
34
|
+
const KONCORDE_OPERATORS = ["and", "or", "not", "bool"];
|
|
33
35
|
|
|
34
36
|
const KONCORDE_CLAUSES_TO_ES = {
|
|
35
|
-
equals: content => ({
|
|
37
|
+
equals: (content) => ({
|
|
36
38
|
term: {
|
|
37
|
-
...content
|
|
38
|
-
}
|
|
39
|
+
...content,
|
|
40
|
+
},
|
|
39
41
|
}),
|
|
40
|
-
exists: field => ({
|
|
42
|
+
exists: (field) => ({
|
|
41
43
|
exists: {
|
|
42
|
-
field
|
|
43
|
-
}
|
|
44
|
+
field,
|
|
45
|
+
},
|
|
44
46
|
}),
|
|
45
|
-
geoBoundingBox: content => ({
|
|
47
|
+
geoBoundingBox: (content) => ({
|
|
46
48
|
geo_bounding_box: {
|
|
47
|
-
...content
|
|
48
|
-
}
|
|
49
|
+
...content,
|
|
50
|
+
},
|
|
49
51
|
}),
|
|
50
|
-
geoDistance: content => ({
|
|
52
|
+
geoDistance: (content) => ({
|
|
51
53
|
geo_distance: {
|
|
52
|
-
...content
|
|
53
|
-
}
|
|
54
|
+
...content,
|
|
55
|
+
},
|
|
54
56
|
}),
|
|
55
|
-
geoDistanceRange: content => ({
|
|
57
|
+
geoDistanceRange: (content) => ({
|
|
56
58
|
geo_distance_range: {
|
|
57
|
-
...content
|
|
58
|
-
}
|
|
59
|
+
...content,
|
|
60
|
+
},
|
|
59
61
|
}),
|
|
60
|
-
geoPolygon: content => ({
|
|
62
|
+
geoPolygon: (content) => ({
|
|
61
63
|
geo_polygon: {
|
|
62
|
-
...content
|
|
63
|
-
}
|
|
64
|
+
...content,
|
|
65
|
+
},
|
|
64
66
|
}),
|
|
65
|
-
ids: content => ({
|
|
67
|
+
ids: (content) => ({
|
|
66
68
|
ids: {
|
|
67
|
-
...content
|
|
68
|
-
}
|
|
69
|
+
...content,
|
|
70
|
+
},
|
|
69
71
|
}),
|
|
70
|
-
in: content => ({
|
|
72
|
+
in: (content) => ({
|
|
71
73
|
terms: {
|
|
72
|
-
...content
|
|
73
|
-
}
|
|
74
|
+
...content,
|
|
75
|
+
},
|
|
74
76
|
}),
|
|
75
|
-
missing: field => ({
|
|
77
|
+
missing: (field) => ({
|
|
76
78
|
bool: {
|
|
77
|
-
must_not: [
|
|
78
|
-
|
|
79
|
-
]
|
|
80
|
-
}
|
|
79
|
+
must_not: [{ exists: { field } }],
|
|
80
|
+
},
|
|
81
81
|
}),
|
|
82
|
-
range: content => ({
|
|
82
|
+
range: (content) => ({
|
|
83
83
|
range: {
|
|
84
|
-
...content
|
|
85
|
-
}
|
|
84
|
+
...content,
|
|
85
|
+
},
|
|
86
86
|
}),
|
|
87
87
|
regexp: undefined,
|
|
88
88
|
};
|
|
89
89
|
|
|
90
90
|
const KONCORDE_OPERATORS_TO_ES = {
|
|
91
|
-
and: content => ({
|
|
91
|
+
and: (content) => ({
|
|
92
92
|
bool: {
|
|
93
|
-
filter: [
|
|
94
|
-
|
|
95
|
-
]
|
|
96
|
-
}
|
|
93
|
+
filter: [...content],
|
|
94
|
+
},
|
|
97
95
|
}),
|
|
98
96
|
bool: undefined,
|
|
99
|
-
not: content => {
|
|
97
|
+
not: (content) => {
|
|
100
98
|
const [name, value] = Object.entries(content[0])[0];
|
|
101
99
|
|
|
102
100
|
return {
|
|
103
101
|
bool: {
|
|
104
|
-
must_not: [
|
|
105
|
-
|
|
106
|
-
]
|
|
107
|
-
}
|
|
102
|
+
must_not: [{ [name]: value }],
|
|
103
|
+
},
|
|
108
104
|
};
|
|
109
105
|
},
|
|
110
|
-
or: content => ({
|
|
106
|
+
or: (content) => ({
|
|
111
107
|
bool: {
|
|
112
|
-
should: [
|
|
113
|
-
|
|
114
|
-
]
|
|
115
|
-
}
|
|
108
|
+
should: [...content],
|
|
109
|
+
},
|
|
116
110
|
}),
|
|
117
111
|
};
|
|
118
112
|
|
|
119
113
|
class QueryTranslator {
|
|
120
|
-
translate
|
|
114
|
+
translate(filters) {
|
|
121
115
|
const [name, value] = Object.entries(filters)[0];
|
|
122
116
|
|
|
123
117
|
if (KONCORDE_OPERATORS.includes(name)) {
|
|
@@ -127,19 +121,18 @@ class QueryTranslator {
|
|
|
127
121
|
return this._translateClause(name, value);
|
|
128
122
|
}
|
|
129
123
|
|
|
130
|
-
_translateOperator
|
|
124
|
+
_translateOperator(operator, operands) {
|
|
131
125
|
const converter = KONCORDE_OPERATORS_TO_ES[operator];
|
|
132
126
|
|
|
133
127
|
if (converter === undefined) {
|
|
134
|
-
throw new KeywordError(
|
|
128
|
+
throw new KeywordError("operator", operator);
|
|
135
129
|
}
|
|
136
130
|
|
|
137
131
|
const esOperands = [];
|
|
138
132
|
|
|
139
|
-
if (operator ===
|
|
133
|
+
if (operator === "not") {
|
|
140
134
|
esOperands.push(this.translate(operands));
|
|
141
|
-
}
|
|
142
|
-
else {
|
|
135
|
+
} else {
|
|
143
136
|
for (const operand of operands) {
|
|
144
137
|
esOperands.push(this.translate(operand));
|
|
145
138
|
}
|
|
@@ -148,11 +141,11 @@ class QueryTranslator {
|
|
|
148
141
|
return converter(esOperands);
|
|
149
142
|
}
|
|
150
143
|
|
|
151
|
-
_translateClause
|
|
144
|
+
_translateClause(clause, content) {
|
|
152
145
|
const converter = KONCORDE_CLAUSES_TO_ES[clause];
|
|
153
146
|
|
|
154
147
|
if (converter === undefined) {
|
|
155
|
-
throw new KeywordError(
|
|
148
|
+
throw new KeywordError("clause", clause);
|
|
156
149
|
}
|
|
157
150
|
|
|
158
151
|
return converter(content);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Backend } from
|
|
2
|
-
import { ControllerDefinition } from
|
|
3
|
-
import { EmbeddedSDK } from
|
|
1
|
+
import { Backend } from "../core/backend";
|
|
2
|
+
import { ControllerDefinition } from "./ControllerDefinition";
|
|
3
|
+
import { EmbeddedSDK } from "../core/shared/sdk/embeddedSdk";
|
|
4
4
|
/**
|
|
5
5
|
* Base class to declare a controller class
|
|
6
6
|
*/
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { JSONObject } from
|
|
2
|
-
import { KuzzleRequest } from
|
|
1
|
+
import { JSONObject } from "kuzzle-sdk";
|
|
2
|
+
import { KuzzleRequest } from "../api/request";
|
|
3
3
|
/**
|
|
4
4
|
* API controller definition.
|
|
5
5
|
*
|
|
@@ -68,7 +68,7 @@ export declare type HttpRoute = {
|
|
|
68
68
|
/**
|
|
69
69
|
* HTTP verb.
|
|
70
70
|
*/
|
|
71
|
-
verb:
|
|
71
|
+
verb: "get" | "head" | "post" | "put" | "delete" | "patch" | "options";
|
|
72
72
|
/**
|
|
73
73
|
* Route path.
|
|
74
74
|
* A route starting with `/` will be prefixed by `/_` otherwise the route
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import EventEmitter from
|
|
3
|
-
import Inspector from
|
|
2
|
+
import EventEmitter from "events";
|
|
3
|
+
import Inspector from "inspector";
|
|
4
4
|
export declare type DebugModuleOptions = {
|
|
5
5
|
methods?: string[];
|
|
6
6
|
events?: string[];
|
package/lib/types/DebugModule.js
CHANGED
|
@@ -12,7 +12,7 @@ class DebugModule extends events_1.default {
|
|
|
12
12
|
this.methods = options.methods || [];
|
|
13
13
|
this.events = options.events || [];
|
|
14
14
|
if (!this.name || this.name.length === 0) {
|
|
15
|
-
throw new Error(
|
|
15
|
+
throw new Error("DebugModule should have a name");
|
|
16
16
|
}
|
|
17
17
|
if (this.name.charAt(0) !== this.name.charAt(0).toUpperCase()) {
|
|
18
18
|
throw new Error(`Debug Module name "${name}" should start with an uppercase letter`);
|
package/lib/types/Global.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import { Readable } from
|
|
2
|
+
import { Readable } from "stream";
|
|
3
3
|
export declare type HttpStreamProperties = {
|
|
4
4
|
totalBytes?: number;
|
|
5
5
|
};
|
|
@@ -11,6 +11,7 @@ export declare class HttpStream {
|
|
|
11
11
|
readonly stream: Readable;
|
|
12
12
|
readonly totalBytes: number;
|
|
13
13
|
private _destroyed;
|
|
14
|
+
private get readableState();
|
|
14
15
|
constructor(readableStream: Readable, { totalBytes }?: HttpStreamProperties);
|
|
15
16
|
/**
|
|
16
17
|
* Returns if the stream is errored
|
package/lib/types/HttpStream.js
CHANGED
|
@@ -32,20 +32,22 @@ class HttpStream {
|
|
|
32
32
|
this.totalBytes = totalBytes;
|
|
33
33
|
this._destroyed = readableStream.destroyed;
|
|
34
34
|
}
|
|
35
|
+
get readableState() {
|
|
36
|
+
// @ts-ignore
|
|
37
|
+
return this.stream._readableState;
|
|
38
|
+
}
|
|
35
39
|
/**
|
|
36
40
|
* Returns if the stream is errored
|
|
37
41
|
*/
|
|
38
42
|
get errored() {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
&& this.stream._readableState.errored !== undefined;
|
|
43
|
+
return (this.readableState.errored !== null &&
|
|
44
|
+
this.readableState.errored !== undefined);
|
|
42
45
|
}
|
|
43
46
|
/**
|
|
44
47
|
* Get the error
|
|
45
48
|
*/
|
|
46
49
|
get error() {
|
|
47
|
-
|
|
48
|
-
return this.stream._readableState.errored;
|
|
50
|
+
return this.readableState.errored;
|
|
49
51
|
}
|
|
50
52
|
/**
|
|
51
53
|
* Returns if the stream has been destroyed
|
package/lib/types/Kuzzle.d.ts
CHANGED