kuzzle 2.19.2 → 2.19.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api/controllers/adminController.js +94 -80
- package/lib/api/controllers/authController.js +239 -212
- package/lib/api/controllers/baseController.js +89 -51
- package/lib/api/controllers/bulkController.js +62 -49
- package/lib/api/controllers/clusterController.js +6 -8
- package/lib/api/controllers/collectionController.js +140 -129
- package/lib/api/controllers/debugController.d.ts +2 -2
- package/lib/api/controllers/debugController.js +33 -31
- package/lib/api/controllers/documentController.js +365 -274
- package/lib/api/controllers/index.js +13 -13
- package/lib/api/controllers/indexController.js +46 -50
- package/lib/api/controllers/memoryStorageController.js +410 -360
- package/lib/api/controllers/realtimeController.js +37 -36
- package/lib/api/controllers/securityController.js +553 -412
- package/lib/api/controllers/serverController.js +111 -104
- package/lib/api/documentExtractor.js +75 -68
- package/lib/api/funnel.js +411 -312
- package/lib/api/httpRoutes.js +1493 -324
- package/lib/api/openapi/OpenApiManager.d.ts +1 -1
- package/lib/api/openapi/OpenApiManager.js +22 -22
- package/lib/api/openapi/components/document/count.yaml +1 -1
- package/lib/api/openapi/components/document/create.yaml +2 -2
- package/lib/api/openapi/components/document/delete.yaml +1 -1
- package/lib/api/openapi/components/document/deleteByQuery.yaml +1 -1
- package/lib/api/openapi/components/document/exists.yaml +1 -1
- package/lib/api/openapi/components/document/get.yaml +2 -2
- package/lib/api/openapi/components/document/index.js +12 -12
- package/lib/api/openapi/components/document/replace.yaml +1 -1
- package/lib/api/openapi/components/document/scroll.yaml +1 -1
- package/lib/api/openapi/components/document/validate.yaml +1 -1
- package/lib/api/openapi/components/index.d.ts +2 -2
- package/lib/api/openapi/components/index.js +1 -1
- package/lib/api/openapi/components/security/index.js +1 -1
- package/lib/api/openapi/components/security/upsertUser.yaml +2 -3
- package/lib/api/openapi/index.d.ts +1 -1
- package/lib/api/openapi/openApiGenerator.d.ts +1 -1
- package/lib/api/openapi/openApiGenerator.js +7 -7
- package/lib/api/rateLimiter.js +12 -13
- package/lib/api/request/index.d.ts +4 -4
- package/lib/api/request/kuzzleRequest.d.ts +9 -9
- package/lib/api/request/kuzzleRequest.js +89 -87
- package/lib/api/request/requestContext.d.ts +2 -2
- package/lib/api/request/requestContext.js +17 -17
- package/lib/api/request/requestInput.d.ts +1 -1
- package/lib/api/request/requestInput.js +19 -19
- package/lib/api/request/requestResponse.d.ts +4 -4
- package/lib/api/request/requestResponse.js +31 -33
- package/lib/cluster/command.js +48 -44
- package/lib/cluster/idCardHandler.d.ts +1 -1
- package/lib/cluster/idCardHandler.js +15 -15
- package/lib/cluster/index.js +2 -2
- package/lib/cluster/node.js +301 -269
- package/lib/cluster/publisher.js +45 -46
- package/lib/cluster/state.d.ts +5 -5
- package/lib/cluster/state.js +8 -8
- package/lib/cluster/subscriber.js +163 -113
- package/lib/cluster/workers/IDCardRenewer.js +33 -32
- package/lib/config/default.config.d.ts +1 -1
- package/lib/config/default.config.js +212 -171
- package/lib/config/documentEventAliases.js +6 -6
- package/lib/config/index.js +161 -98
- package/lib/config/sdkCompatibility.json +8 -8
- package/lib/core/auth/formatProcessing.js +7 -7
- package/lib/core/auth/passportResponse.js +7 -7
- package/lib/core/auth/passportWrapper.js +34 -30
- package/lib/core/auth/tokenManager.d.ts +2 -2
- package/lib/core/auth/tokenManager.js +11 -10
- package/lib/core/backend/applicationManager.d.ts +1 -1
- package/lib/core/backend/applicationManager.js +2 -2
- package/lib/core/backend/backend.d.ts +3 -3
- package/lib/core/backend/backend.js +34 -31
- package/lib/core/backend/backendCluster.d.ts +2 -2
- package/lib/core/backend/backendCluster.js +5 -5
- package/lib/core/backend/backendConfig.d.ts +2 -2
- package/lib/core/backend/backendConfig.js +3 -3
- package/lib/core/backend/backendController.d.ts +2 -2
- package/lib/core/backend/backendController.js +9 -10
- package/lib/core/backend/backendErrors.d.ts +3 -3
- package/lib/core/backend/backendErrors.js +2 -1
- package/lib/core/backend/backendHook.d.ts +2 -2
- package/lib/core/backend/backendHook.js +5 -5
- package/lib/core/backend/backendImport.d.ts +3 -3
- package/lib/core/backend/backendImport.js +23 -23
- package/lib/core/backend/backendOpenApi.d.ts +2 -2
- package/lib/core/backend/backendOpenApi.js +16 -16
- package/lib/core/backend/backendPipe.d.ts +2 -2
- package/lib/core/backend/backendPipe.js +6 -6
- package/lib/core/backend/backendPlugin.d.ts +4 -4
- package/lib/core/backend/backendPlugin.js +14 -14
- package/lib/core/backend/backendStorage.d.ts +2 -2
- package/lib/core/backend/backendStorage.js +1 -2
- package/lib/core/backend/backendVault.d.ts +2 -2
- package/lib/core/backend/backendVault.js +3 -3
- package/lib/core/backend/index.d.ts +14 -14
- package/lib/core/backend/internalLogger.d.ts +1 -1
- package/lib/core/backend/internalLogger.js +5 -5
- package/lib/core/cache/cacheDbEnum.js +4 -4
- package/lib/core/cache/cacheEngine.js +79 -85
- package/lib/core/network/accessLogger.js +126 -120
- package/lib/core/network/clientConnection.js +5 -5
- package/lib/core/network/context.js +8 -8
- package/lib/core/network/entryPoint.js +100 -85
- package/lib/core/network/httpRouter/index.js +63 -60
- package/lib/core/network/httpRouter/routeHandler.js +18 -19
- package/lib/core/network/httpRouter/routePart.js +23 -19
- package/lib/core/network/protocolManifest.js +3 -3
- package/lib/core/network/protocols/httpMessage.js +8 -10
- package/lib/core/network/protocols/httpwsProtocol.js +305 -250
- package/lib/core/network/protocols/internalProtocol.js +27 -24
- package/lib/core/network/protocols/mqttProtocol.js +106 -96
- package/lib/core/network/protocols/protocol.js +20 -17
- package/lib/core/network/router.js +56 -46
- package/lib/core/plugin/plugin.js +151 -120
- package/lib/core/plugin/pluginContext.d.ts +7 -7
- package/lib/core/plugin/pluginContext.js +48 -44
- package/lib/core/plugin/pluginManifest.js +13 -12
- package/lib/core/plugin/pluginRepository.js +26 -27
- package/lib/core/plugin/pluginsManager.js +425 -304
- package/lib/core/plugin/privilegedContext.js +3 -3
- package/lib/core/realtime/actionEnum.js +1 -1
- package/lib/core/realtime/channel.d.ts +1 -1
- package/lib/core/realtime/channel.js +22 -22
- package/lib/core/realtime/connectionRooms.d.ts +1 -1
- package/lib/core/realtime/hotelClerk.d.ts +2 -2
- package/lib/core/realtime/hotelClerk.js +53 -50
- package/lib/core/realtime/index.js +5 -5
- package/lib/core/realtime/notification/document.js +25 -25
- package/lib/core/realtime/notification/index.js +4 -4
- package/lib/core/realtime/notification/server.js +3 -3
- package/lib/core/realtime/notification/user.js +4 -4
- package/lib/core/realtime/notifier.js +113 -75
- package/lib/core/realtime/room.d.ts +1 -1
- package/lib/core/realtime/subscription.d.ts +1 -1
- package/lib/core/realtime/subscription.js +1 -1
- package/lib/core/security/index.js +8 -8
- package/lib/core/security/profileRepository.d.ts +6 -6
- package/lib/core/security/profileRepository.js +48 -45
- package/lib/core/security/roleRepository.js +127 -115
- package/lib/core/security/securityLoader.js +70 -63
- package/lib/core/security/tokenRepository.js +132 -118
- package/lib/core/security/userRepository.js +104 -88
- package/lib/core/shared/KoncordeWrapper.d.ts +1 -1
- package/lib/core/shared/KoncordeWrapper.js +3 -1
- package/lib/core/shared/abstractManifest.js +22 -23
- package/lib/core/shared/repository.js +69 -67
- package/lib/core/shared/sdk/embeddedSdk.d.ts +2 -2
- package/lib/core/shared/sdk/embeddedSdk.js +36 -32
- package/lib/core/shared/sdk/funnelProtocol.d.ts +1 -1
- package/lib/core/shared/sdk/funnelProtocol.js +11 -11
- package/lib/core/shared/sdk/impersonatedSdk.js +19 -18
- package/lib/core/shared/store.js +127 -32
- package/lib/core/statistics/index.js +2 -2
- package/lib/core/statistics/statistics.js +99 -85
- package/lib/core/storage/clientAdapter.js +219 -136
- package/lib/core/storage/indexCache.js +3 -3
- package/lib/core/storage/storageEngine.js +10 -13
- package/lib/core/storage/storeScopeEnum.js +3 -3
- package/lib/core/validation/baseType.js +12 -10
- package/lib/core/validation/index.js +2 -2
- package/lib/core/validation/types/anything.js +4 -4
- package/lib/core/validation/types/boolean.js +7 -7
- package/lib/core/validation/types/date.js +165 -131
- package/lib/core/validation/types/email.js +18 -21
- package/lib/core/validation/types/enum.js +34 -21
- package/lib/core/validation/types/geoPoint.js +7 -7
- package/lib/core/validation/types/geoShape.js +148 -125
- package/lib/core/validation/types/integer.js +9 -9
- package/lib/core/validation/types/ipAddress.js +17 -19
- package/lib/core/validation/types/numeric.js +36 -29
- package/lib/core/validation/types/object.js +19 -19
- package/lib/core/validation/types/string.js +36 -29
- package/lib/core/validation/types/url.js +17 -19
- package/lib/core/validation/validation.js +422 -378
- package/lib/kerror/codes/1-services.json +7 -1
- package/lib/kerror/codes/4-plugin.json +2 -2
- package/lib/kerror/codes/index.js +85 -63
- package/lib/kerror/errors/badRequestError.d.ts +1 -1
- package/lib/kerror/errors/externalServiceError.d.ts +1 -1
- package/lib/kerror/errors/forbiddenError.d.ts +1 -1
- package/lib/kerror/errors/gatewayTimeoutError.d.ts +1 -1
- package/lib/kerror/errors/index.d.ts +15 -15
- package/lib/kerror/errors/internalError.d.ts +1 -1
- package/lib/kerror/errors/kuzzleError.d.ts +1 -1
- package/lib/kerror/errors/multipleErrorsError.d.ts +1 -1
- package/lib/kerror/errors/multipleErrorsError.js +1 -1
- package/lib/kerror/errors/notFoundError.d.ts +1 -1
- package/lib/kerror/errors/partialError.d.ts +1 -1
- package/lib/kerror/errors/partialError.js +1 -1
- package/lib/kerror/errors/pluginImplementationError.d.ts +1 -1
- package/lib/kerror/errors/pluginImplementationError.js +2 -1
- package/lib/kerror/errors/preconditionError.d.ts +1 -1
- package/lib/kerror/errors/serviceUnavailableError.d.ts +1 -1
- package/lib/kerror/errors/sizeLimitError.d.ts +1 -1
- package/lib/kerror/errors/tooManyRequestsError.d.ts +1 -1
- package/lib/kerror/errors/unauthorizedError.d.ts +1 -1
- package/lib/kerror/index.d.ts +3 -3
- package/lib/kerror/index.js +17 -16
- package/lib/kuzzle/dumpGenerator.js +130 -114
- package/lib/kuzzle/event/kuzzleEventEmitter.js +96 -70
- package/lib/kuzzle/event/pipeRunner.js +25 -24
- package/lib/kuzzle/event/waterfall.js +13 -15
- package/lib/kuzzle/index.js +2 -2
- package/lib/kuzzle/internalIndexHandler.js +80 -59
- package/lib/kuzzle/kuzzle.js +99 -99
- package/lib/kuzzle/kuzzleStateEnum.js +1 -1
- package/lib/kuzzle/log.js +23 -18
- package/lib/kuzzle/vault.js +34 -19
- package/lib/model/security/profile.d.ts +3 -3
- package/lib/model/security/profile.js +38 -37
- package/lib/model/security/rights.js +5 -5
- package/lib/model/security/role.d.ts +3 -3
- package/lib/model/security/role.js +25 -26
- package/lib/model/security/token.d.ts +1 -1
- package/lib/model/security/token.js +4 -4
- package/lib/model/security/user.d.ts +2 -2
- package/lib/model/security/user.js +9 -9
- package/lib/model/storage/apiKey.js +43 -33
- package/lib/model/storage/baseModel.js +49 -45
- package/lib/service/cache/redis.js +60 -55
- package/lib/service/service.js +17 -17
- package/lib/service/storage/elasticsearch.js +839 -755
- package/lib/service/storage/esWrapper.js +103 -86
- package/lib/service/storage/queryTranslator.js +52 -59
- package/lib/types/Controller.d.ts +3 -3
- package/lib/types/ControllerDefinition.d.ts +3 -3
- package/lib/types/DebugModule.d.ts +2 -2
- package/lib/types/DebugModule.js +1 -1
- package/lib/types/Global.d.ts +1 -1
- package/lib/types/HttpStream.d.ts +2 -1
- package/lib/types/HttpStream.js +7 -5
- package/lib/types/Kuzzle.d.ts +1 -1
- package/lib/types/KuzzleDocument.d.ts +1 -1
- package/lib/types/OpenApiDefinition.d.ts +1 -1
- package/lib/types/PasswordPolicy.d.ts +1 -1
- package/lib/types/Plugin.d.ts +6 -6
- package/lib/types/Plugin.js +2 -2
- package/lib/types/Policy.d.ts +1 -1
- package/lib/types/RequestPayload.d.ts +1 -1
- package/lib/types/ResponsePayload.d.ts +1 -1
- package/lib/types/Token.d.ts +1 -1
- package/lib/types/User.d.ts +1 -1
- package/lib/types/config/DumpConfiguration.d.ts +8 -8
- package/lib/types/config/HttpConfiguration.d.ts +1 -1
- package/lib/types/config/KuzzleConfiguration.d.ts +1 -1
- package/lib/types/config/LimitsConfiguration.d.ts +8 -8
- package/lib/types/config/PluginsConfiguration.d.ts +4 -4
- package/lib/types/config/SecurityConfiguration.d.ts +62 -62
- package/lib/types/config/ServerConfiguration.d.ts +55 -55
- package/lib/types/config/ServicesConfiguration.d.ts +2 -2
- package/lib/types/config/internalCache/InternalCacheRedisConfiguration.d.ts +10 -10
- package/lib/types/config/publicCache/PublicCacheRedisConfiguration.d.ts +3 -3
- package/lib/types/config/storageEngine/StorageEngineElasticsearchConfiguration.d.ts +194 -110
- package/lib/types/errors/ErrorDefinition.d.ts +1 -1
- package/lib/types/errors/ErrorDomains.d.ts +1 -1
- package/lib/types/index.d.ts +38 -38
- package/lib/types/realtime/RealtimeScope.d.ts +1 -1
- package/lib/types/realtime/RealtimeUsers.d.ts +1 -1
- package/lib/util/assertType.js +13 -11
- package/lib/util/async.d.ts +1 -0
- package/lib/util/async.js +61 -0
- package/lib/util/asyncStore.js +19 -21
- package/lib/util/bufferedPassThrough.d.ts +2 -2
- package/lib/util/bufferedPassThrough.js +4 -4
- package/lib/util/bytes.js +9 -13
- package/lib/util/crypto.js +1 -1
- package/lib/util/debug.js +5 -5
- package/lib/util/deprecate.js +24 -21
- package/lib/util/didYouMean.js +7 -7
- package/lib/util/dump-collection.d.ts +2 -2
- package/lib/util/dump-collection.js +26 -26
- package/lib/util/esRequest.d.ts +1 -0
- package/lib/util/esRequest.js +62 -0
- package/lib/util/extractFields.js +24 -25
- package/lib/util/inflector.js +5 -5
- package/lib/util/koncordeCompat.d.ts +2 -2
- package/lib/util/koncordeCompat.js +5 -5
- package/lib/util/memoize.js +3 -5
- package/lib/util/mutex.d.ts +19 -1
- package/lib/util/mutex.js +39 -12
- package/lib/util/name-generator.js +1331 -1331
- package/lib/util/promback.js +8 -10
- package/lib/util/readYamlFile.d.ts +1 -1
- package/lib/util/readYamlFile.js +1 -1
- package/lib/util/requestAssertions.js +34 -34
- package/lib/util/safeObject.js +5 -5
- package/lib/util/stackTrace.js +20 -22
- package/lib/util/wildcard.js +15 -15
- package/package.json +6 -6
- package/npm-shrinkwrap.json +0 -19422
|
@@ -19,17 +19,17 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const { Subscriber } = require(
|
|
25
|
-
const protobuf = require(
|
|
26
|
-
const Long = require(
|
|
24
|
+
const { Subscriber } = require("zeromq");
|
|
25
|
+
const protobuf = require("protobufjs");
|
|
26
|
+
const Long = require("long");
|
|
27
27
|
|
|
28
|
-
const debug = require(
|
|
29
|
-
const DocumentNotification = require(
|
|
30
|
-
const UserNotification = require(
|
|
31
|
-
const { has } = require(
|
|
32
|
-
const { fromKoncordeIndex } = require(
|
|
28
|
+
const debug = require("../util/debug")("kuzzle:cluster:sync");
|
|
29
|
+
const DocumentNotification = require("../core/realtime/notification/document");
|
|
30
|
+
const UserNotification = require("../core/realtime/notification/user");
|
|
31
|
+
const { has } = require("../util/safeObject");
|
|
32
|
+
const { fromKoncordeIndex } = require("../util/koncordeCompat");
|
|
33
33
|
|
|
34
34
|
/* eslint-disable sort-keys */
|
|
35
35
|
const stateEnum = Object.freeze({
|
|
@@ -48,7 +48,7 @@ class ClusterSubscriber {
|
|
|
48
48
|
* @param {string} remoteNodeId - Remote node unique ID
|
|
49
49
|
* @param {string} remoteNodeIP - address of the distant node
|
|
50
50
|
*/
|
|
51
|
-
constructor
|
|
51
|
+
constructor(localNode, remoteNodeId, remoteNodeIP) {
|
|
52
52
|
// not to be confused with remote nodes
|
|
53
53
|
this.localNode = localNode;
|
|
54
54
|
|
|
@@ -106,14 +106,15 @@ class ClusterSubscriber {
|
|
|
106
106
|
* Initializes this class, establishes a connection to the remote node and
|
|
107
107
|
* starts listening to it.
|
|
108
108
|
*/
|
|
109
|
-
async init
|
|
109
|
+
async init() {
|
|
110
110
|
this.protoroot = await protobuf.load(`${__dirname}/protobuf/sync.proto`);
|
|
111
111
|
this.socket = new Subscriber();
|
|
112
112
|
this.socket.connect(this.remoteNodeAddress);
|
|
113
113
|
this.socket.subscribe();
|
|
114
114
|
this.heartbeatTimer = setInterval(
|
|
115
115
|
() => this.checkHeartbeat(),
|
|
116
|
-
this.heartbeatDelay
|
|
116
|
+
this.heartbeatDelay
|
|
117
|
+
);
|
|
117
118
|
|
|
118
119
|
this.listen();
|
|
119
120
|
}
|
|
@@ -123,15 +124,14 @@ class ClusterSubscriber {
|
|
|
123
124
|
* Do NOT wait this method: it's an infinite loop, it's not meant to ever
|
|
124
125
|
* return (unless the remote node has been evicted)
|
|
125
126
|
*/
|
|
126
|
-
async listen
|
|
127
|
+
async listen() {
|
|
127
128
|
while (this.state !== stateEnum.EVICTED) {
|
|
128
129
|
let topic;
|
|
129
130
|
let data;
|
|
130
131
|
|
|
131
132
|
try {
|
|
132
133
|
[topic, data] = await this.socket.receive();
|
|
133
|
-
}
|
|
134
|
-
catch (e) {
|
|
134
|
+
} catch (e) {
|
|
135
135
|
if (this.state !== stateEnum.EVICTED) {
|
|
136
136
|
await this.evictNode({
|
|
137
137
|
broadcast: true,
|
|
@@ -150,8 +150,7 @@ class ClusterSubscriber {
|
|
|
150
150
|
|
|
151
151
|
if (this.state !== stateEnum.BUFFERING) {
|
|
152
152
|
await this.processData(topic.toString(), data);
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
153
|
+
} else {
|
|
155
154
|
this.buffer.push([topic.toString(), data]);
|
|
156
155
|
}
|
|
157
156
|
}
|
|
@@ -164,7 +163,7 @@ class ClusterSubscriber {
|
|
|
164
163
|
* @param {Long} lastMessageId
|
|
165
164
|
* @return {void}
|
|
166
165
|
*/
|
|
167
|
-
async sync
|
|
166
|
+
async sync(lastMessageId) {
|
|
168
167
|
this.lastMessageId = lastMessageId;
|
|
169
168
|
|
|
170
169
|
// copy the buffer for processing: new sync messages might be buffered
|
|
@@ -194,7 +193,7 @@ class ClusterSubscriber {
|
|
|
194
193
|
* @param {Buffer} data
|
|
195
194
|
* @return {void}
|
|
196
195
|
*/
|
|
197
|
-
async processData
|
|
196
|
+
async processData(topic, data) {
|
|
198
197
|
if (this.state === stateEnum.EVICTED) {
|
|
199
198
|
return;
|
|
200
199
|
}
|
|
@@ -211,20 +210,22 @@ class ClusterSubscriber {
|
|
|
211
210
|
|
|
212
211
|
const message = decoder.toObject(decoder.decode(data));
|
|
213
212
|
|
|
214
|
-
if (!
|
|
213
|
+
if (!(await this.validateMessage(message))) {
|
|
215
214
|
return;
|
|
216
215
|
}
|
|
217
216
|
|
|
218
217
|
try {
|
|
219
|
-
// If we are receiving messages from a node,
|
|
218
|
+
// If we are receiving messages from a node,
|
|
220
219
|
// it means the node is alive so it should counts as an heartbeat
|
|
221
220
|
this.handleHeartbeat();
|
|
222
221
|
await this.handlers[topic].call(this, message);
|
|
223
|
-
}
|
|
224
|
-
catch (e) {
|
|
222
|
+
} catch (e) {
|
|
225
223
|
this.localNode.evictSelf(
|
|
226
|
-
`Unable to process sync message (topic: ${topic}, message: ${JSON.stringify(
|
|
227
|
-
|
|
224
|
+
`Unable to process sync message (topic: ${topic}, message: ${JSON.stringify(
|
|
225
|
+
message
|
|
226
|
+
)}`,
|
|
227
|
+
e
|
|
228
|
+
);
|
|
228
229
|
}
|
|
229
230
|
}
|
|
230
231
|
|
|
@@ -233,7 +234,7 @@ class ClusterSubscriber {
|
|
|
233
234
|
*
|
|
234
235
|
* @return {void}
|
|
235
236
|
*/
|
|
236
|
-
handleHeartbeat
|
|
237
|
+
handleHeartbeat() {
|
|
237
238
|
this.lastHeartbeat = Date.now();
|
|
238
239
|
}
|
|
239
240
|
|
|
@@ -243,9 +244,11 @@ class ClusterSubscriber {
|
|
|
243
244
|
* @param {Object} message - decoded NodeEvicted protobuf message
|
|
244
245
|
* @return {void}
|
|
245
246
|
*/
|
|
246
|
-
async handleNodeEviction
|
|
247
|
+
async handleNodeEviction(message) {
|
|
247
248
|
if (message.nodeId === this.localNode.nodeId) {
|
|
248
|
-
global.kuzzle.log.error(
|
|
249
|
+
global.kuzzle.log.error(
|
|
250
|
+
`[CLUSTER] Node evicted by ${message.evictor}. Reason: ${message.reason}`
|
|
251
|
+
);
|
|
249
252
|
global.kuzzle.shutdown();
|
|
250
253
|
return;
|
|
251
254
|
}
|
|
@@ -262,10 +265,10 @@ class ClusterSubscriber {
|
|
|
262
265
|
* @param {Object} message - decoded NodeShutdown protobuf message
|
|
263
266
|
* @return {void}
|
|
264
267
|
*/
|
|
265
|
-
async handleNodeShutdown
|
|
268
|
+
async handleNodeShutdown(message) {
|
|
266
269
|
await this.localNode.evictNode(message.nodeId, {
|
|
267
270
|
broadcast: false,
|
|
268
|
-
reason:
|
|
271
|
+
reason: "Node is shutting down",
|
|
269
272
|
});
|
|
270
273
|
}
|
|
271
274
|
|
|
@@ -275,17 +278,18 @@ class ClusterSubscriber {
|
|
|
275
278
|
* @param {Object} message - decoded NewRealtimeRoom protobuf message
|
|
276
279
|
* @return {void}
|
|
277
280
|
*/
|
|
278
|
-
handleNewRealtimeRoom
|
|
281
|
+
handleNewRealtimeRoom(message) {
|
|
279
282
|
const { id, index, filter, messageId } = message;
|
|
280
283
|
const icpair = fromKoncordeIndex(index);
|
|
281
284
|
|
|
282
285
|
debug(
|
|
283
|
-
|
|
286
|
+
"New realtime room created by node %s (message: %d, room: %s, index: %s, collection: %s)",
|
|
284
287
|
this.remoteNodeId,
|
|
285
288
|
messageId,
|
|
286
289
|
id,
|
|
287
290
|
icpair.index,
|
|
288
|
-
icpair.collection
|
|
291
|
+
icpair.collection
|
|
292
|
+
);
|
|
289
293
|
|
|
290
294
|
this.localNode.fullState.addRealtimeRoom(
|
|
291
295
|
id,
|
|
@@ -296,7 +300,8 @@ class ClusterSubscriber {
|
|
|
296
300
|
messageId,
|
|
297
301
|
nodeId: this.remoteNodeId,
|
|
298
302
|
subscribers: 0,
|
|
299
|
-
}
|
|
303
|
+
}
|
|
304
|
+
);
|
|
300
305
|
}
|
|
301
306
|
|
|
302
307
|
/**
|
|
@@ -305,16 +310,19 @@ class ClusterSubscriber {
|
|
|
305
310
|
* @param {Object} message - decoded Subscription protobuf message
|
|
306
311
|
* @return {void}
|
|
307
312
|
*/
|
|
308
|
-
handleSubscription
|
|
309
|
-
debug(
|
|
313
|
+
handleSubscription(message) {
|
|
314
|
+
debug(
|
|
315
|
+
"New realtime subscription received from node %s (message: %d, room: %s)",
|
|
310
316
|
this.remoteNodeId,
|
|
311
317
|
message.messageId,
|
|
312
|
-
message.roomId
|
|
318
|
+
message.roomId
|
|
319
|
+
);
|
|
313
320
|
|
|
314
321
|
this.localNode.fullState.addRealtimeSubscription(
|
|
315
322
|
message.roomId,
|
|
316
323
|
this.remoteNodeId,
|
|
317
|
-
message.messageId
|
|
324
|
+
message.messageId
|
|
325
|
+
);
|
|
318
326
|
}
|
|
319
327
|
|
|
320
328
|
/**
|
|
@@ -323,13 +331,18 @@ class ClusterSubscriber {
|
|
|
323
331
|
* @param {Object} message - decoded RemoveRealtimeRoom protobuf message
|
|
324
332
|
* @return {void}
|
|
325
333
|
*/
|
|
326
|
-
handleRealtimeRoomRemoval
|
|
327
|
-
debug(
|
|
334
|
+
handleRealtimeRoomRemoval(message) {
|
|
335
|
+
debug(
|
|
336
|
+
"Realtime room removal received from node %s (message: %d, room: %s)",
|
|
328
337
|
this.remoteNodeId,
|
|
329
338
|
message.messageId,
|
|
330
|
-
message.roomId
|
|
339
|
+
message.roomId
|
|
340
|
+
);
|
|
331
341
|
|
|
332
|
-
this.localNode.fullState.removeRealtimeRoom(
|
|
342
|
+
this.localNode.fullState.removeRealtimeRoom(
|
|
343
|
+
message.roomId,
|
|
344
|
+
this.remoteNodeId
|
|
345
|
+
);
|
|
333
346
|
}
|
|
334
347
|
|
|
335
348
|
/**
|
|
@@ -338,16 +351,19 @@ class ClusterSubscriber {
|
|
|
338
351
|
* @param {Object} message - decoded Unscription protobuf message
|
|
339
352
|
* @return {void}
|
|
340
353
|
*/
|
|
341
|
-
handleUnsubscription
|
|
342
|
-
debug(
|
|
354
|
+
handleUnsubscription(message) {
|
|
355
|
+
debug(
|
|
356
|
+
"Realtime unsubscription received from node %s (message: %d, room: %s)",
|
|
343
357
|
this.remoteNodeId,
|
|
344
358
|
message.messageId,
|
|
345
|
-
message.roomId
|
|
359
|
+
message.roomId
|
|
360
|
+
);
|
|
346
361
|
|
|
347
362
|
this.localNode.fullState.removeRealtimeSubscription(
|
|
348
363
|
message.roomId,
|
|
349
364
|
this.remoteNodeId,
|
|
350
|
-
message.messageId
|
|
365
|
+
message.messageId
|
|
366
|
+
);
|
|
351
367
|
}
|
|
352
368
|
|
|
353
369
|
/**
|
|
@@ -356,7 +372,7 @@ class ClusterSubscriber {
|
|
|
356
372
|
* @param {Object} message - decoded ClusterWideEvent protobuf message
|
|
357
373
|
* @return {void}
|
|
358
374
|
*/
|
|
359
|
-
handleClusterWideEvent
|
|
375
|
+
handleClusterWideEvent(message) {
|
|
360
376
|
const payload = JSON.parse(message.payload);
|
|
361
377
|
|
|
362
378
|
this.localNode.eventEmitter.emit(message.event, payload);
|
|
@@ -368,7 +384,7 @@ class ClusterSubscriber {
|
|
|
368
384
|
* @param {Object} message - decoded DocumentNotification protobuf message
|
|
369
385
|
* @return {void}
|
|
370
386
|
*/
|
|
371
|
-
async handleDocumentNotification
|
|
387
|
+
async handleDocumentNotification(message) {
|
|
372
388
|
const notification = new DocumentNotification({
|
|
373
389
|
action: message.action,
|
|
374
390
|
collection: message.collection,
|
|
@@ -385,9 +401,10 @@ class ClusterSubscriber {
|
|
|
385
401
|
});
|
|
386
402
|
|
|
387
403
|
return global.kuzzle.ask(
|
|
388
|
-
|
|
404
|
+
"core:realtime:document:dispatch",
|
|
389
405
|
message.rooms,
|
|
390
|
-
notification
|
|
406
|
+
notification
|
|
407
|
+
);
|
|
391
408
|
}
|
|
392
409
|
|
|
393
410
|
/**
|
|
@@ -396,7 +413,7 @@ class ClusterSubscriber {
|
|
|
396
413
|
* @param {Object} message - decoded UserNotification protobuf message
|
|
397
414
|
* @return {void}
|
|
398
415
|
*/
|
|
399
|
-
async handleUserNotification
|
|
416
|
+
async handleUserNotification(message) {
|
|
400
417
|
const notification = new UserNotification({
|
|
401
418
|
action: message.action,
|
|
402
419
|
collection: message.collection,
|
|
@@ -412,9 +429,10 @@ class ClusterSubscriber {
|
|
|
412
429
|
});
|
|
413
430
|
|
|
414
431
|
return global.kuzzle.ask(
|
|
415
|
-
|
|
432
|
+
"core:realtime:user:sendMessage",
|
|
416
433
|
message.room,
|
|
417
|
-
notification
|
|
434
|
+
notification
|
|
435
|
+
);
|
|
418
436
|
}
|
|
419
437
|
|
|
420
438
|
/**
|
|
@@ -423,21 +441,23 @@ class ClusterSubscriber {
|
|
|
423
441
|
* @param {Object} message - decoded NewAuthStrategy protobuf message
|
|
424
442
|
* @return {void}
|
|
425
443
|
*/
|
|
426
|
-
handleNewAuthStrategy
|
|
444
|
+
handleNewAuthStrategy(message) {
|
|
427
445
|
const { pluginName, strategy, strategyName } = message;
|
|
428
446
|
|
|
429
447
|
debug(
|
|
430
|
-
|
|
448
|
+
"New authentication strategy added by node %s (plugin: %s, strategy: %s)",
|
|
431
449
|
this.remoteNodeId,
|
|
432
450
|
pluginName,
|
|
433
|
-
strategyName
|
|
451
|
+
strategyName
|
|
452
|
+
);
|
|
434
453
|
|
|
435
454
|
this.localNode.fullState.addAuthStrategy(message);
|
|
436
455
|
|
|
437
456
|
global.kuzzle.pluginsManager.registerStrategy(
|
|
438
457
|
pluginName,
|
|
439
458
|
strategyName,
|
|
440
|
-
strategy
|
|
459
|
+
strategy
|
|
460
|
+
);
|
|
441
461
|
}
|
|
442
462
|
|
|
443
463
|
/**
|
|
@@ -446,14 +466,15 @@ class ClusterSubscriber {
|
|
|
446
466
|
* @param {Object} message - decoded RemoveAuthStrategy protobuf message
|
|
447
467
|
* @return {void}
|
|
448
468
|
*/
|
|
449
|
-
handleAuthStrategyRemoval
|
|
469
|
+
handleAuthStrategyRemoval(message) {
|
|
450
470
|
const { pluginName, strategyName } = message;
|
|
451
471
|
|
|
452
472
|
debug(
|
|
453
|
-
|
|
473
|
+
"Authentication strategy removed by node %s (plugin: %s, strategy: %s)",
|
|
454
474
|
this.remoteNodeId,
|
|
455
475
|
pluginName,
|
|
456
|
-
strategyName
|
|
476
|
+
strategyName
|
|
477
|
+
);
|
|
457
478
|
|
|
458
479
|
global.kuzzle.pluginsManager.unregisterStrategy(pluginName, strategyName);
|
|
459
480
|
this.localNode.fullState.removeAuthStrategy(strategyName);
|
|
@@ -464,10 +485,10 @@ class ClusterSubscriber {
|
|
|
464
485
|
*
|
|
465
486
|
* @return {void}
|
|
466
487
|
*/
|
|
467
|
-
async handleResetSecurity
|
|
468
|
-
debug(
|
|
469
|
-
await global.kuzzle.ask(
|
|
470
|
-
await global.kuzzle.ask(
|
|
488
|
+
async handleResetSecurity() {
|
|
489
|
+
debug("Security reset received from node %s", this.remoteNodeId);
|
|
490
|
+
await global.kuzzle.ask("core:security:profile:invalidate");
|
|
491
|
+
await global.kuzzle.ask("core:security:role:invalidate");
|
|
471
492
|
}
|
|
472
493
|
|
|
473
494
|
/**
|
|
@@ -476,8 +497,8 @@ class ClusterSubscriber {
|
|
|
476
497
|
* @param {Object} message - decoded DumpRequest protobuf message
|
|
477
498
|
* @return {void}
|
|
478
499
|
*/
|
|
479
|
-
handleDumpRequest
|
|
480
|
-
debug(
|
|
500
|
+
handleDumpRequest(message) {
|
|
501
|
+
debug("Dump generation request received from node %s", this.remoteNodeId);
|
|
481
502
|
global.kuzzle.dump(message.suffix);
|
|
482
503
|
}
|
|
483
504
|
|
|
@@ -485,9 +506,14 @@ class ClusterSubscriber {
|
|
|
485
506
|
* Handles cluster-wide shutdown
|
|
486
507
|
* @return {void}
|
|
487
508
|
*/
|
|
488
|
-
handleShutdown
|
|
489
|
-
debug(
|
|
490
|
-
|
|
509
|
+
handleShutdown() {
|
|
510
|
+
debug(
|
|
511
|
+
"Cluster-wide shutdown request received from node %s",
|
|
512
|
+
this.remoteNodeId
|
|
513
|
+
);
|
|
514
|
+
global.kuzzle.log.error(
|
|
515
|
+
`[CLUSTER] Cluster wide shutdown from ${this.remoteNodeId}`
|
|
516
|
+
);
|
|
491
517
|
global.kuzzle.shutdown();
|
|
492
518
|
}
|
|
493
519
|
|
|
@@ -496,17 +522,25 @@ class ClusterSubscriber {
|
|
|
496
522
|
*
|
|
497
523
|
* @return {void}
|
|
498
524
|
*/
|
|
499
|
-
async handleRefreshValidators
|
|
500
|
-
debug(
|
|
525
|
+
async handleRefreshValidators() {
|
|
526
|
+
debug(
|
|
527
|
+
"Validators changed notification received from node %s",
|
|
528
|
+
this.remoteNodeId
|
|
529
|
+
);
|
|
501
530
|
await global.kuzzle.validation.curateSpecification();
|
|
502
531
|
}
|
|
503
532
|
|
|
504
533
|
/**
|
|
505
534
|
* Handles manual refresh of the index cache
|
|
506
535
|
*/
|
|
507
|
-
async handleRefreshIndexCache
|
|
508
|
-
debug(
|
|
509
|
-
|
|
536
|
+
async handleRefreshIndexCache() {
|
|
537
|
+
debug(
|
|
538
|
+
"Index cache manually refresh received from node %s",
|
|
539
|
+
this.remoteNodeId
|
|
540
|
+
);
|
|
541
|
+
await global.kuzzle.ask("core:storage:public:cache:refresh", {
|
|
542
|
+
from: "cluster",
|
|
543
|
+
});
|
|
510
544
|
}
|
|
511
545
|
|
|
512
546
|
/**
|
|
@@ -515,13 +549,17 @@ class ClusterSubscriber {
|
|
|
515
549
|
* @param {Object} message - decoded DumpRequest protobuf message
|
|
516
550
|
* @return {void}
|
|
517
551
|
*/
|
|
518
|
-
async handleProfileInvalidation
|
|
552
|
+
async handleProfileInvalidation(message) {
|
|
519
553
|
debug(
|
|
520
|
-
|
|
554
|
+
"Profile invalidation request received from node %s (profile: %s)",
|
|
521
555
|
this.remoteNodeId,
|
|
522
|
-
message.profileId
|
|
556
|
+
message.profileId
|
|
557
|
+
);
|
|
523
558
|
|
|
524
|
-
await global.kuzzle.ask(
|
|
559
|
+
await global.kuzzle.ask(
|
|
560
|
+
"core:security:profile:invalidate",
|
|
561
|
+
message.profileId
|
|
562
|
+
);
|
|
525
563
|
}
|
|
526
564
|
|
|
527
565
|
/**
|
|
@@ -530,13 +568,14 @@ class ClusterSubscriber {
|
|
|
530
568
|
* @param {Object} message - decoded DumpRequest protobuf message
|
|
531
569
|
* @return {void}
|
|
532
570
|
*/
|
|
533
|
-
async handleRoleInvalidation
|
|
571
|
+
async handleRoleInvalidation(message) {
|
|
534
572
|
debug(
|
|
535
|
-
|
|
573
|
+
"Role invalidation request received from node %s (role: %s)",
|
|
536
574
|
this.remoteNodeId,
|
|
537
|
-
message.roleId
|
|
575
|
+
message.roleId
|
|
576
|
+
);
|
|
538
577
|
|
|
539
|
-
await global.kuzzle.ask(
|
|
578
|
+
await global.kuzzle.ask("core:security:role:invalidate", message.roleId);
|
|
540
579
|
}
|
|
541
580
|
|
|
542
581
|
/**
|
|
@@ -545,14 +584,15 @@ class ClusterSubscriber {
|
|
|
545
584
|
* @param {Object} message - decoded IndexCacheAdd protobuf message
|
|
546
585
|
* @return {void}
|
|
547
586
|
*/
|
|
548
|
-
async handleIndexAddition
|
|
587
|
+
async handleIndexAddition(message) {
|
|
549
588
|
const { index, scope } = message;
|
|
550
589
|
|
|
551
590
|
debug(
|
|
552
|
-
|
|
591
|
+
"New index added by node %s (scope: %s, index: %s)",
|
|
553
592
|
this.remoteNodeId,
|
|
554
593
|
scope,
|
|
555
|
-
index
|
|
594
|
+
index
|
|
595
|
+
);
|
|
556
596
|
|
|
557
597
|
await global.kuzzle.ask(`core:storage:${scope}:cache:addIndex`, index);
|
|
558
598
|
}
|
|
@@ -563,18 +603,20 @@ class ClusterSubscriber {
|
|
|
563
603
|
* @param {Object} message - decoded IndexCacheAdd protobuf message
|
|
564
604
|
* @return {void}
|
|
565
605
|
*/
|
|
566
|
-
async handleIndexesRemoval
|
|
606
|
+
async handleIndexesRemoval(message) {
|
|
567
607
|
const { indexes, scope } = message;
|
|
568
608
|
|
|
569
609
|
debug(
|
|
570
|
-
|
|
610
|
+
"Indexes removed by node %s (scope: %s, indexes: %s)",
|
|
571
611
|
this.remoteNodeId,
|
|
572
612
|
scope,
|
|
573
|
-
indexes
|
|
613
|
+
indexes
|
|
614
|
+
);
|
|
574
615
|
|
|
575
616
|
await global.kuzzle.ask(
|
|
576
617
|
`core:storage:${scope}:cache:removeIndexes`,
|
|
577
|
-
indexes
|
|
618
|
+
indexes
|
|
619
|
+
);
|
|
578
620
|
}
|
|
579
621
|
|
|
580
622
|
/**
|
|
@@ -583,20 +625,22 @@ class ClusterSubscriber {
|
|
|
583
625
|
* @param {Object} message - decoded IndexCacheAdd protobuf message
|
|
584
626
|
* @return {void}
|
|
585
627
|
*/
|
|
586
|
-
async handleCollectionAddition
|
|
628
|
+
async handleCollectionAddition(message) {
|
|
587
629
|
const { collection, index, scope } = message;
|
|
588
630
|
|
|
589
631
|
debug(
|
|
590
|
-
|
|
632
|
+
"New collection added by node %s (scope: %s, index: %s, collection: %s)",
|
|
591
633
|
this.remoteNodeId,
|
|
592
634
|
scope,
|
|
593
635
|
index,
|
|
594
|
-
collection
|
|
636
|
+
collection
|
|
637
|
+
);
|
|
595
638
|
|
|
596
639
|
await global.kuzzle.ask(
|
|
597
640
|
`core:storage:${scope}:cache:addCollection`,
|
|
598
641
|
index,
|
|
599
|
-
collection
|
|
642
|
+
collection
|
|
643
|
+
);
|
|
600
644
|
}
|
|
601
645
|
|
|
602
646
|
/**
|
|
@@ -605,47 +649,46 @@ class ClusterSubscriber {
|
|
|
605
649
|
* @param {Object} message - decoded IndexCacheAdd protobuf message
|
|
606
650
|
* @return {void}
|
|
607
651
|
*/
|
|
608
|
-
async handleCollectionRemoval
|
|
652
|
+
async handleCollectionRemoval(message) {
|
|
609
653
|
const { collection, index, scope } = message;
|
|
610
654
|
|
|
611
655
|
debug(
|
|
612
|
-
|
|
656
|
+
"Indexes removed by node %s (scope: %s, index: %s, collection: %s)",
|
|
613
657
|
this.remoteNodeId,
|
|
614
658
|
scope,
|
|
615
659
|
index,
|
|
616
|
-
collection
|
|
660
|
+
collection
|
|
661
|
+
);
|
|
617
662
|
|
|
618
663
|
await global.kuzzle.ask(
|
|
619
664
|
`core:storage:${scope}:cache:removeCollection`,
|
|
620
665
|
index,
|
|
621
|
-
collection
|
|
666
|
+
collection
|
|
667
|
+
);
|
|
622
668
|
}
|
|
623
669
|
|
|
624
|
-
|
|
625
670
|
/**
|
|
626
671
|
* Checks that we did receive a heartbeat from the remote node
|
|
627
672
|
* If a heartbeat is missing, we allow 1 heartbeat round for the remote node
|
|
628
673
|
* to recover, otherwise we evict it from the cluster.
|
|
629
674
|
*/
|
|
630
|
-
async checkHeartbeat
|
|
675
|
+
async checkHeartbeat() {
|
|
631
676
|
if (this.state === stateEnum.EVICTED) {
|
|
632
677
|
return;
|
|
633
678
|
}
|
|
634
679
|
|
|
635
680
|
const now = Date.now();
|
|
636
681
|
|
|
637
|
-
if (
|
|
682
|
+
if (now - this.lastHeartbeat > this.heartbeatDelay) {
|
|
638
683
|
if (this.state === stateEnum.MISSING_HEARTBEAT) {
|
|
639
684
|
await this.evictNode({
|
|
640
685
|
broadcast: true,
|
|
641
|
-
reason:
|
|
686
|
+
reason: "heartbeat timeout",
|
|
642
687
|
});
|
|
643
|
-
}
|
|
644
|
-
else {
|
|
688
|
+
} else {
|
|
645
689
|
this.state = stateEnum.MISSING_HEARTBEAT;
|
|
646
690
|
}
|
|
647
|
-
}
|
|
648
|
-
else {
|
|
691
|
+
} else {
|
|
649
692
|
this.state = stateEnum.SANE;
|
|
650
693
|
}
|
|
651
694
|
}
|
|
@@ -653,7 +696,7 @@ class ClusterSubscriber {
|
|
|
653
696
|
/**
|
|
654
697
|
* Disconnects from the remote node, and frees all allocated resources.
|
|
655
698
|
*/
|
|
656
|
-
dispose
|
|
699
|
+
dispose() {
|
|
657
700
|
if (this.state === stateEnum.EVICTED) {
|
|
658
701
|
return;
|
|
659
702
|
}
|
|
@@ -669,9 +712,11 @@ class ClusterSubscriber {
|
|
|
669
712
|
* @param {Object} message - decoded protobuf message
|
|
670
713
|
* @return {boolean} false: the message must be discarded, true otherwise
|
|
671
714
|
*/
|
|
672
|
-
async validateMessage
|
|
673
|
-
if (!
|
|
674
|
-
global.kuzzle.log.warn(
|
|
715
|
+
async validateMessage(message) {
|
|
716
|
+
if (!has(message, "messageId")) {
|
|
717
|
+
global.kuzzle.log.warn(
|
|
718
|
+
`Invalid message received from node ${this.remoteNodeId}. Evicting it.`
|
|
719
|
+
);
|
|
675
720
|
|
|
676
721
|
await this.evictNode({
|
|
677
722
|
broadcast: true,
|
|
@@ -681,8 +726,9 @@ class ClusterSubscriber {
|
|
|
681
726
|
return false;
|
|
682
727
|
}
|
|
683
728
|
|
|
684
|
-
if (
|
|
685
|
-
|
|
729
|
+
if (
|
|
730
|
+
this.state === stateEnum.BUFFERING &&
|
|
731
|
+
this.lastMessageId.greaterThanOrEqual(message.messageId)
|
|
686
732
|
) {
|
|
687
733
|
return false;
|
|
688
734
|
}
|
|
@@ -690,14 +736,18 @@ class ClusterSubscriber {
|
|
|
690
736
|
this.lastMessageId = this.lastMessageId.add(1);
|
|
691
737
|
|
|
692
738
|
if (this.lastMessageId.notEquals(message.messageId)) {
|
|
693
|
-
await this.localNode.evictSelf(
|
|
739
|
+
await this.localNode.evictSelf(
|
|
740
|
+
`Node out-of-sync: ${
|
|
741
|
+
message.messageId - this.lastMessageId - 1
|
|
742
|
+
} messages lost from node ${this.remoteNodeId}`
|
|
743
|
+
);
|
|
694
744
|
return false;
|
|
695
745
|
}
|
|
696
746
|
|
|
697
747
|
return true;
|
|
698
748
|
}
|
|
699
749
|
|
|
700
|
-
async evictNode
|
|
750
|
+
async evictNode({ broadcast, reason }) {
|
|
701
751
|
this.state = stateEnum.EVICTED;
|
|
702
752
|
|
|
703
753
|
await this.localNode.evictNode(this.remoteNodeId, { broadcast, reason });
|