kuzzle 2.19.2 → 2.19.5
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 +91 -90
- 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 +4 -4
- package/lib/core/backend/backend.js +34 -31
- package/lib/core/backend/backendCluster.d.ts +8 -9
- package/lib/core/backend/backendCluster.js +8 -8
- 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 +3 -3
- 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 +3 -3
- 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 +26 -25
- 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 +3 -2
- package/lib/types/DebugModule.js +1 -1
- package/lib/types/EventHandler.d.ts +31 -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 +8 -8
- 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/events/EventGenericDocument.d.ts +26 -0
- package/lib/types/events/EventGenericDocument.js +3 -0
- package/lib/types/index.d.ts +39 -38
- package/lib/types/index.js +1 -0
- 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 +3 -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 +28 -29
- package/npm-shrinkwrap.json +0 -19422
|
@@ -19,25 +19,25 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
24
|
// Most of the functions exposed in this file should be viewed as
|
|
25
25
|
// critical section of code.
|
|
26
26
|
|
|
27
|
-
const assert = require(
|
|
27
|
+
const assert = require("assert");
|
|
28
28
|
|
|
29
|
-
const EventEmitter = require(
|
|
30
|
-
const Bluebird = require(
|
|
31
|
-
const debug = require(
|
|
32
|
-
const { v4: uuidv4 } = require(
|
|
29
|
+
const EventEmitter = require("eventemitter3");
|
|
30
|
+
const Bluebird = require("bluebird");
|
|
31
|
+
const debug = require("debug")("kuzzle:events");
|
|
32
|
+
const { v4: uuidv4 } = require("uuid");
|
|
33
33
|
|
|
34
|
-
const Promback = require(
|
|
35
|
-
const memoize = require(
|
|
36
|
-
const PipeRunner = require(
|
|
37
|
-
const kerror = require(
|
|
34
|
+
const Promback = require("../../util/promback");
|
|
35
|
+
const memoize = require("../../util/memoize");
|
|
36
|
+
const PipeRunner = require("./pipeRunner");
|
|
37
|
+
const kerror = require("../../kerror");
|
|
38
38
|
|
|
39
39
|
class PluginPipeDefinition {
|
|
40
|
-
constructor
|
|
40
|
+
constructor(event, handler, pipeId = null) {
|
|
41
41
|
this.event = event;
|
|
42
42
|
this.handler = handler;
|
|
43
43
|
|
|
@@ -46,7 +46,7 @@ class PluginPipeDefinition {
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
class KuzzleEventEmitter extends EventEmitter {
|
|
49
|
-
constructor
|
|
49
|
+
constructor(maxConcurrentPipes, pipesBufferSize) {
|
|
50
50
|
super();
|
|
51
51
|
this.superEmit = super.emit;
|
|
52
52
|
this.pipeRunner = new PipeRunner(maxConcurrentPipes, pipesBufferSize);
|
|
@@ -78,10 +78,13 @@ class KuzzleEventEmitter extends EventEmitter {
|
|
|
78
78
|
* @param {String} event
|
|
79
79
|
* @param {Function} fn
|
|
80
80
|
*/
|
|
81
|
-
onPipe
|
|
82
|
-
assert(
|
|
81
|
+
onPipe(event, fn) {
|
|
82
|
+
assert(
|
|
83
|
+
typeof fn === "function",
|
|
84
|
+
`Cannot listen to pipe event ${event}: "${fn}" is not a function`
|
|
85
|
+
);
|
|
83
86
|
|
|
84
|
-
if (!
|
|
87
|
+
if (!this.corePipes.has(event)) {
|
|
85
88
|
this.corePipes.set(event, []);
|
|
86
89
|
}
|
|
87
90
|
|
|
@@ -95,14 +98,19 @@ class KuzzleEventEmitter extends EventEmitter {
|
|
|
95
98
|
* @param {String} event
|
|
96
99
|
* @param {Function} fn
|
|
97
100
|
*/
|
|
98
|
-
onAsk
|
|
99
|
-
assert(
|
|
100
|
-
|
|
101
|
+
onAsk(event, fn) {
|
|
102
|
+
assert(
|
|
103
|
+
typeof fn === "function",
|
|
104
|
+
`Cannot listen to ask event "${event}": "${fn}" is not a function`
|
|
105
|
+
);
|
|
106
|
+
assert(
|
|
107
|
+
!this.coreAnswerers.has(event),
|
|
108
|
+
`Cannot add a listener to the ask event "${event}": event has already an answerer`
|
|
109
|
+
);
|
|
101
110
|
|
|
102
111
|
this.coreAnswerers.set(event, fn);
|
|
103
112
|
}
|
|
104
113
|
|
|
105
|
-
|
|
106
114
|
/**
|
|
107
115
|
* Registers a core 'callback' answerer
|
|
108
116
|
* There can only be 0 or 1 answerer per callback event.
|
|
@@ -110,9 +118,15 @@ class KuzzleEventEmitter extends EventEmitter {
|
|
|
110
118
|
* @param {String} event
|
|
111
119
|
* @param {Function} fn
|
|
112
120
|
*/
|
|
113
|
-
onCall
|
|
114
|
-
assert(
|
|
115
|
-
|
|
121
|
+
onCall(event, fn) {
|
|
122
|
+
assert(
|
|
123
|
+
typeof fn === "function",
|
|
124
|
+
`Cannot register callback for event "${event}": "${fn}" is not a function`
|
|
125
|
+
);
|
|
126
|
+
assert(
|
|
127
|
+
!this.coreSyncedAnswerers.has(event),
|
|
128
|
+
`Cannot register callback for event "${event}": a callback has already been registered`
|
|
129
|
+
);
|
|
116
130
|
|
|
117
131
|
this.coreSyncedAnswerers.set(event, fn);
|
|
118
132
|
}
|
|
@@ -125,7 +139,7 @@ class KuzzleEventEmitter extends EventEmitter {
|
|
|
125
139
|
* @param {string} event
|
|
126
140
|
* @param {*} data
|
|
127
141
|
*/
|
|
128
|
-
emit
|
|
142
|
+
emit(event, data) {
|
|
129
143
|
const events = getWildcardEvents(event);
|
|
130
144
|
debug('Triggering event "%s" with data: %o', event, data);
|
|
131
145
|
|
|
@@ -153,13 +167,16 @@ class KuzzleEventEmitter extends EventEmitter {
|
|
|
153
167
|
* @param {*} payload
|
|
154
168
|
* @returns {Promise.<*>|null}
|
|
155
169
|
*/
|
|
156
|
-
pipe
|
|
170
|
+
pipe(event, ...payload) {
|
|
157
171
|
debug('Triggering pipe "%s" with payload: %o', event, payload);
|
|
158
172
|
|
|
159
173
|
let callback = null;
|
|
160
174
|
|
|
161
175
|
// safe: a pipe's payload can never contain functions
|
|
162
|
-
if (
|
|
176
|
+
if (
|
|
177
|
+
payload.length > 0 &&
|
|
178
|
+
typeof payload[payload.length - 1] === "function"
|
|
179
|
+
) {
|
|
163
180
|
callback = payload.pop();
|
|
164
181
|
}
|
|
165
182
|
|
|
@@ -170,7 +187,7 @@ class KuzzleEventEmitter extends EventEmitter {
|
|
|
170
187
|
const targets = this.pluginPipes.get(events[i]);
|
|
171
188
|
|
|
172
189
|
if (targets) {
|
|
173
|
-
targets.forEach(t => funcs.push(t));
|
|
190
|
+
targets.forEach((t) => funcs.push(t));
|
|
174
191
|
}
|
|
175
192
|
}
|
|
176
193
|
|
|
@@ -185,8 +202,7 @@ class KuzzleEventEmitter extends EventEmitter {
|
|
|
185
202
|
|
|
186
203
|
if (funcs.length === 0) {
|
|
187
204
|
pipeCallback.call(callbackContext, null, ...payload);
|
|
188
|
-
}
|
|
189
|
-
else {
|
|
205
|
+
} else {
|
|
190
206
|
this.pipeRunner.run(funcs, payload, pipeCallback, callbackContext);
|
|
191
207
|
}
|
|
192
208
|
|
|
@@ -196,21 +212,28 @@ class KuzzleEventEmitter extends EventEmitter {
|
|
|
196
212
|
/**
|
|
197
213
|
* Emits an "ask" event to get information about the provided payload
|
|
198
214
|
*/
|
|
199
|
-
async ask
|
|
215
|
+
async ask(event, ...payload) {
|
|
200
216
|
debug('Triggering ask "%s" with payload: %o', event, payload);
|
|
201
217
|
|
|
202
218
|
const fn = this.coreAnswerers.get(event);
|
|
203
219
|
|
|
204
|
-
if (!
|
|
205
|
-
throw kerror.get(
|
|
220
|
+
if (!fn) {
|
|
221
|
+
throw kerror.get(
|
|
222
|
+
"core",
|
|
223
|
+
"fatal",
|
|
224
|
+
"assertion_failed",
|
|
225
|
+
`the requested ask event '${event}' doesn't have an answerer`
|
|
226
|
+
);
|
|
206
227
|
}
|
|
207
228
|
|
|
208
229
|
const response = await fn(...payload);
|
|
209
230
|
|
|
210
|
-
getWildcardEvents(event).forEach(ev =>
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
231
|
+
getWildcardEvents(event).forEach((ev) =>
|
|
232
|
+
super.emit(ev, {
|
|
233
|
+
args: payload,
|
|
234
|
+
response,
|
|
235
|
+
})
|
|
236
|
+
);
|
|
214
237
|
|
|
215
238
|
return response;
|
|
216
239
|
}
|
|
@@ -218,21 +241,28 @@ class KuzzleEventEmitter extends EventEmitter {
|
|
|
218
241
|
/**
|
|
219
242
|
* Calls a callback to get information about the provided payload
|
|
220
243
|
*/
|
|
221
|
-
call
|
|
244
|
+
call(event, ...payload) {
|
|
222
245
|
debug('Triggering callback "%s" with payload: %o', event, payload);
|
|
223
246
|
|
|
224
247
|
const fn = this.coreSyncedAnswerers.get(event);
|
|
225
248
|
|
|
226
|
-
if (!
|
|
227
|
-
throw kerror.get(
|
|
249
|
+
if (!fn) {
|
|
250
|
+
throw kerror.get(
|
|
251
|
+
"core",
|
|
252
|
+
"fatal",
|
|
253
|
+
"assertion_failed",
|
|
254
|
+
`the requested callback event '${event}' doesn't have an answerer`
|
|
255
|
+
);
|
|
228
256
|
}
|
|
229
257
|
|
|
230
258
|
const response = fn(...payload);
|
|
231
259
|
|
|
232
|
-
getWildcardEvents(event).forEach(ev =>
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
260
|
+
getWildcardEvents(event).forEach((ev) =>
|
|
261
|
+
super.emit(ev, {
|
|
262
|
+
args: payload,
|
|
263
|
+
response,
|
|
264
|
+
})
|
|
265
|
+
);
|
|
236
266
|
|
|
237
267
|
return response;
|
|
238
268
|
}
|
|
@@ -241,35 +271,32 @@ class KuzzleEventEmitter extends EventEmitter {
|
|
|
241
271
|
* Registers a plugin hook.
|
|
242
272
|
* Catch any error in the handler and emit the hook:onError event.
|
|
243
273
|
*/
|
|
244
|
-
registerPluginHook
|
|
274
|
+
registerPluginHook(pluginName, event, fn) {
|
|
245
275
|
this.on(event, (...args) => {
|
|
246
276
|
try {
|
|
247
277
|
const ret = fn(...args, event);
|
|
248
278
|
|
|
249
|
-
if (typeof ret ===
|
|
250
|
-
ret.catch(error => {
|
|
251
|
-
if (event !==
|
|
252
|
-
this.emit(
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
this.emit('plugin:hook:loop-error', { error, pluginName });
|
|
279
|
+
if (typeof ret === "object" && typeof ret.catch === "function") {
|
|
280
|
+
ret.catch((error) => {
|
|
281
|
+
if (event !== "hook:onError") {
|
|
282
|
+
this.emit("hook:onError", { error, event, pluginName });
|
|
283
|
+
} else {
|
|
284
|
+
this.emit("plugin:hook:loop-error", { error, pluginName });
|
|
256
285
|
}
|
|
257
286
|
});
|
|
258
287
|
}
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
else {
|
|
265
|
-
this.emit('plugin:hook:loop-error', { error, pluginName });
|
|
288
|
+
} catch (error) {
|
|
289
|
+
if (event !== "hook:onError") {
|
|
290
|
+
this.emit("hook:onError", { error, event, pluginName });
|
|
291
|
+
} else {
|
|
292
|
+
this.emit("plugin:hook:loop-error", { error, pluginName });
|
|
266
293
|
}
|
|
267
294
|
}
|
|
268
295
|
});
|
|
269
296
|
}
|
|
270
297
|
|
|
271
|
-
registerPluginPipe
|
|
272
|
-
if (!
|
|
298
|
+
registerPluginPipe(event, handler) {
|
|
299
|
+
if (!this.pluginPipes.has(event)) {
|
|
273
300
|
this.pluginPipes.set(event, []);
|
|
274
301
|
}
|
|
275
302
|
|
|
@@ -282,19 +309,18 @@ class KuzzleEventEmitter extends EventEmitter {
|
|
|
282
309
|
return definition.pipeId;
|
|
283
310
|
}
|
|
284
311
|
|
|
285
|
-
unregisterPluginPipe
|
|
312
|
+
unregisterPluginPipe(pipeId) {
|
|
286
313
|
const definition = this.pluginPipeDefinitions.get(pipeId);
|
|
287
314
|
|
|
288
|
-
if (!
|
|
289
|
-
throw kerror.get(
|
|
315
|
+
if (!definition) {
|
|
316
|
+
throw kerror.get("plugin", "runtime", "unknown_pipe", pipeId);
|
|
290
317
|
}
|
|
291
318
|
|
|
292
319
|
const handlers = this.pluginPipes.get(definition.event);
|
|
293
320
|
handlers.splice(handlers.indexOf(definition.handler), 1);
|
|
294
321
|
if (handlers.length > 0) {
|
|
295
322
|
this.pluginPipes.set(definition.event, handlers);
|
|
296
|
-
}
|
|
297
|
-
else {
|
|
323
|
+
} else {
|
|
298
324
|
this.pluginPipes.delete(definition.event);
|
|
299
325
|
}
|
|
300
326
|
|
|
@@ -307,7 +333,7 @@ class KuzzleEventEmitter extends EventEmitter {
|
|
|
307
333
|
* @param {string} event
|
|
308
334
|
* @return {Boolean} [description]
|
|
309
335
|
*/
|
|
310
|
-
hasAskAnswerer
|
|
336
|
+
hasAskAnswerer(event) {
|
|
311
337
|
return this.coreAnswerers.has(event);
|
|
312
338
|
}
|
|
313
339
|
}
|
|
@@ -321,7 +347,7 @@ class KuzzleEventEmitter extends EventEmitter {
|
|
|
321
347
|
*
|
|
322
348
|
* @warning Critical section of code
|
|
323
349
|
*/
|
|
324
|
-
async function pipeCallback
|
|
350
|
+
async function pipeCallback(error, ...updated) {
|
|
325
351
|
/* eslint-disable no-invalid-this */
|
|
326
352
|
if (error) {
|
|
327
353
|
this.promback.reject(error);
|
|
@@ -331,7 +357,7 @@ async function pipeCallback (error, ...updated) {
|
|
|
331
357
|
const corePipes = this.instance.corePipes.get(this.targetEvent);
|
|
332
358
|
|
|
333
359
|
if (corePipes) {
|
|
334
|
-
await Bluebird.map(corePipes, fn => fn(...updated));
|
|
360
|
+
await Bluebird.map(corePipes, (fn) => fn(...updated));
|
|
335
361
|
}
|
|
336
362
|
|
|
337
363
|
for (let i = 0; i < this.events.length; i++) {
|
|
@@ -354,9 +380,9 @@ async function pipeCallback (error, ...updated) {
|
|
|
354
380
|
* @param {String} event
|
|
355
381
|
* @returns {Array<String>} wildcard events
|
|
356
382
|
*/
|
|
357
|
-
const getWildcardEvents = memoize(event => {
|
|
383
|
+
const getWildcardEvents = memoize((event) => {
|
|
358
384
|
const events = [event];
|
|
359
|
-
const delimIndex = event.lastIndexOf(
|
|
385
|
+
const delimIndex = event.lastIndexOf(":");
|
|
360
386
|
|
|
361
387
|
if (delimIndex === -1) {
|
|
362
388
|
return events;
|
|
@@ -365,7 +391,7 @@ const getWildcardEvents = memoize(event => {
|
|
|
365
391
|
const scope = event.slice(0, delimIndex);
|
|
366
392
|
const name = event.slice(delimIndex + 1);
|
|
367
393
|
|
|
368
|
-
[
|
|
394
|
+
["before", "after"].forEach((prefix) => {
|
|
369
395
|
if (name.startsWith(prefix)) {
|
|
370
396
|
events.push(`${scope}:${prefix}*`);
|
|
371
397
|
}
|
|
@@ -19,15 +19,15 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const assert = require(
|
|
25
|
-
const Denque = require(
|
|
24
|
+
const assert = require("assert");
|
|
25
|
+
const Denque = require("denque");
|
|
26
26
|
|
|
27
|
-
const { KuzzleError } = require(
|
|
28
|
-
const waterfall = require(
|
|
27
|
+
const { KuzzleError } = require("../../kerror/errors");
|
|
28
|
+
const waterfall = require("./waterfall");
|
|
29
29
|
|
|
30
|
-
const kerror = require(
|
|
30
|
+
const kerror = require("../../kerror").wrap("plugin", "runtime");
|
|
31
31
|
|
|
32
32
|
/**
|
|
33
33
|
* We declare the callback used by waterfall one time instead
|
|
@@ -37,22 +37,22 @@ const kerror = require('../../kerror').wrap('plugin', 'runtime');
|
|
|
37
37
|
* { instance: (pipeRunner instance), callback: (callback after pipes execution) }
|
|
38
38
|
*/
|
|
39
39
|
/* eslint-disable no-invalid-this */
|
|
40
|
-
function waterfallCallback
|
|
40
|
+
function waterfallCallback(error, ...result) {
|
|
41
41
|
this.instance.running--;
|
|
42
42
|
|
|
43
|
-
if (!
|
|
43
|
+
if (!this.instance.buffer.isEmpty()) {
|
|
44
44
|
setImmediate(this.instance._boundRunNext);
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
if (error) {
|
|
48
|
-
const cbError =
|
|
49
|
-
|
|
50
|
-
|
|
48
|
+
const cbError =
|
|
49
|
+
error instanceof KuzzleError
|
|
50
|
+
? error
|
|
51
|
+
: kerror.getFrom(error, "unexpected_error", error.message);
|
|
51
52
|
|
|
52
53
|
this.callback.call(this.callbackContext, cbError);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
this.callback.call(this.callbackContext, null, result);
|
|
54
|
+
} else {
|
|
55
|
+
this.callback.call(this.callbackContext, null, ...result);
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
/* eslint-enable no-invalid-this */
|
|
@@ -62,7 +62,7 @@ function waterfallCallback (error, result) {
|
|
|
62
62
|
* @class PipeChain
|
|
63
63
|
*/
|
|
64
64
|
class PipeChain {
|
|
65
|
-
constructor
|
|
65
|
+
constructor(chain, args, callback, callbackContext) {
|
|
66
66
|
this.chain = chain;
|
|
67
67
|
this.args = args;
|
|
68
68
|
this.callback = callback;
|
|
@@ -80,13 +80,15 @@ class PipeChain {
|
|
|
80
80
|
* @param {Number} bufferSize - max number of delayed pipe chains
|
|
81
81
|
*/
|
|
82
82
|
class PipeRunner {
|
|
83
|
-
constructor
|
|
83
|
+
constructor(concurrent, bufferSize) {
|
|
84
84
|
assert(
|
|
85
|
-
typeof concurrent ===
|
|
86
|
-
|
|
85
|
+
typeof concurrent === "number" && concurrent > 0,
|
|
86
|
+
"Cannot instantiate pipes executor: invalid maxConcurrentPipes parameter value"
|
|
87
|
+
);
|
|
87
88
|
assert(
|
|
88
|
-
typeof bufferSize ===
|
|
89
|
-
|
|
89
|
+
typeof bufferSize === "number" && bufferSize > 0,
|
|
90
|
+
"Cannot instantiate pipes executor: invalid pipesBufferSize parameter value"
|
|
91
|
+
);
|
|
90
92
|
|
|
91
93
|
this.maxConcurrent = concurrent;
|
|
92
94
|
this.running = 0;
|
|
@@ -105,12 +107,11 @@ class PipeRunner {
|
|
|
105
107
|
* @param {Function} callback - end-of-chain callback
|
|
106
108
|
* @param {Object} callbackContext - functions/callback context
|
|
107
109
|
*/
|
|
108
|
-
run
|
|
110
|
+
run(chain, args, callback, callbackContext) {
|
|
109
111
|
if (this.running >= this.maxConcurrent) {
|
|
110
112
|
if (this.buffer.length >= this.maxBufferSize) {
|
|
111
|
-
callback.call(callbackContext, kerror.get(
|
|
112
|
-
}
|
|
113
|
-
else {
|
|
113
|
+
callback.call(callbackContext, kerror.get("too_many_pipes"));
|
|
114
|
+
} else {
|
|
114
115
|
this.buffer.push(new PipeChain(chain, args, callback, callbackContext));
|
|
115
116
|
}
|
|
116
117
|
|
|
@@ -129,7 +130,7 @@ class PipeRunner {
|
|
|
129
130
|
waterfall(chain, args, waterfallCallback, waterfallCallbackCtx);
|
|
130
131
|
}
|
|
131
132
|
|
|
132
|
-
_runNext
|
|
133
|
+
_runNext() {
|
|
133
134
|
if (this.buffer.isEmpty() || this.running >= this.maxConcurrent) {
|
|
134
135
|
return;
|
|
135
136
|
}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
24
|
class WaterfallContext {
|
|
25
25
|
/**
|
|
@@ -28,7 +28,7 @@ class WaterfallContext {
|
|
|
28
28
|
* @param {Function} cb - end of waterfall callback
|
|
29
29
|
* @param {Object} cbCtx - functions context
|
|
30
30
|
*/
|
|
31
|
-
constructor
|
|
31
|
+
constructor(chain, args, cb, cbCtx) {
|
|
32
32
|
this.chain = chain;
|
|
33
33
|
this.cb = cb;
|
|
34
34
|
this.cbCtx = cbCtx;
|
|
@@ -41,7 +41,7 @@ class WaterfallContext {
|
|
|
41
41
|
this.args = args.length ? args : [null];
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
hasNext
|
|
44
|
+
hasNext() {
|
|
45
45
|
return this.index < this.chain.length;
|
|
46
46
|
}
|
|
47
47
|
|
|
@@ -49,52 +49,50 @@ class WaterfallContext {
|
|
|
49
49
|
* Each function in the waterfall chain returns a result. This result should
|
|
50
50
|
* always be the 1st payload argument (updated or left intact, it matters not)
|
|
51
51
|
*/
|
|
52
|
-
set result
|
|
52
|
+
set result(result) {
|
|
53
53
|
this.args[0] = result;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
next
|
|
56
|
+
next(cb) {
|
|
57
57
|
this.index++;
|
|
58
58
|
this.chain[this.index - 1](...this.args, cb);
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
reject
|
|
61
|
+
reject(error) {
|
|
62
62
|
this.cb.call(this.cbCtx, error);
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
// Resolves with the updated payload
|
|
66
|
-
resolve
|
|
66
|
+
resolve() {
|
|
67
67
|
this.cb.call(this.cbCtx, null, ...this.args);
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
/* eslint-disable no-invalid-this */
|
|
72
|
-
function waterfallCB
|
|
72
|
+
function waterfallCB(err, res) {
|
|
73
73
|
if (err) {
|
|
74
74
|
this.reject(err);
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
75
|
+
} else {
|
|
77
76
|
this.result = res;
|
|
78
77
|
waterfallNext(this);
|
|
79
78
|
}
|
|
80
79
|
}
|
|
81
80
|
/* eslint-enable no-invalid-this */
|
|
82
81
|
|
|
83
|
-
function waterfallNext
|
|
84
|
-
if (!
|
|
82
|
+
function waterfallNext(ctx) {
|
|
83
|
+
if (!ctx.hasNext()) {
|
|
85
84
|
ctx.resolve();
|
|
86
85
|
return;
|
|
87
86
|
}
|
|
88
87
|
|
|
89
88
|
try {
|
|
90
89
|
ctx.next(waterfallCB.bind(ctx));
|
|
91
|
-
}
|
|
92
|
-
catch (error) {
|
|
90
|
+
} catch (error) {
|
|
93
91
|
ctx.reject(error);
|
|
94
92
|
}
|
|
95
93
|
}
|
|
96
94
|
|
|
97
|
-
function waterfall
|
|
95
|
+
function waterfall(chain, args, cb, context) {
|
|
98
96
|
const ctx = new WaterfallContext(chain, args, cb, context);
|
|
99
97
|
|
|
100
98
|
waterfallNext(ctx);
|
package/lib/kuzzle/index.js
CHANGED