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.
Files changed (289) hide show
  1. package/lib/api/controllers/adminController.js +94 -80
  2. package/lib/api/controllers/authController.js +239 -212
  3. package/lib/api/controllers/baseController.js +89 -51
  4. package/lib/api/controllers/bulkController.js +62 -49
  5. package/lib/api/controllers/clusterController.js +6 -8
  6. package/lib/api/controllers/collectionController.js +140 -129
  7. package/lib/api/controllers/debugController.d.ts +2 -2
  8. package/lib/api/controllers/debugController.js +33 -31
  9. package/lib/api/controllers/documentController.js +365 -274
  10. package/lib/api/controllers/index.js +13 -13
  11. package/lib/api/controllers/indexController.js +46 -50
  12. package/lib/api/controllers/memoryStorageController.js +410 -360
  13. package/lib/api/controllers/realtimeController.js +37 -36
  14. package/lib/api/controllers/securityController.js +553 -412
  15. package/lib/api/controllers/serverController.js +111 -104
  16. package/lib/api/documentExtractor.js +75 -68
  17. package/lib/api/funnel.js +411 -312
  18. package/lib/api/httpRoutes.js +1493 -324
  19. package/lib/api/openapi/OpenApiManager.d.ts +1 -1
  20. package/lib/api/openapi/OpenApiManager.js +22 -22
  21. package/lib/api/openapi/components/document/count.yaml +1 -1
  22. package/lib/api/openapi/components/document/create.yaml +2 -2
  23. package/lib/api/openapi/components/document/delete.yaml +1 -1
  24. package/lib/api/openapi/components/document/deleteByQuery.yaml +1 -1
  25. package/lib/api/openapi/components/document/exists.yaml +1 -1
  26. package/lib/api/openapi/components/document/get.yaml +2 -2
  27. package/lib/api/openapi/components/document/index.js +12 -12
  28. package/lib/api/openapi/components/document/replace.yaml +1 -1
  29. package/lib/api/openapi/components/document/scroll.yaml +1 -1
  30. package/lib/api/openapi/components/document/validate.yaml +1 -1
  31. package/lib/api/openapi/components/index.d.ts +2 -2
  32. package/lib/api/openapi/components/index.js +1 -1
  33. package/lib/api/openapi/components/security/index.js +1 -1
  34. package/lib/api/openapi/components/security/upsertUser.yaml +2 -3
  35. package/lib/api/openapi/index.d.ts +1 -1
  36. package/lib/api/openapi/openApiGenerator.d.ts +1 -1
  37. package/lib/api/openapi/openApiGenerator.js +7 -7
  38. package/lib/api/rateLimiter.js +12 -13
  39. package/lib/api/request/index.d.ts +4 -4
  40. package/lib/api/request/kuzzleRequest.d.ts +9 -9
  41. package/lib/api/request/kuzzleRequest.js +89 -87
  42. package/lib/api/request/requestContext.d.ts +2 -2
  43. package/lib/api/request/requestContext.js +17 -17
  44. package/lib/api/request/requestInput.d.ts +1 -1
  45. package/lib/api/request/requestInput.js +19 -19
  46. package/lib/api/request/requestResponse.d.ts +4 -4
  47. package/lib/api/request/requestResponse.js +31 -33
  48. package/lib/cluster/command.js +48 -44
  49. package/lib/cluster/idCardHandler.d.ts +1 -1
  50. package/lib/cluster/idCardHandler.js +15 -15
  51. package/lib/cluster/index.js +2 -2
  52. package/lib/cluster/node.js +301 -269
  53. package/lib/cluster/publisher.js +45 -46
  54. package/lib/cluster/state.d.ts +5 -5
  55. package/lib/cluster/state.js +8 -8
  56. package/lib/cluster/subscriber.js +163 -113
  57. package/lib/cluster/workers/IDCardRenewer.js +33 -32
  58. package/lib/config/default.config.d.ts +1 -1
  59. package/lib/config/default.config.js +212 -171
  60. package/lib/config/documentEventAliases.js +6 -6
  61. package/lib/config/index.js +161 -98
  62. package/lib/config/sdkCompatibility.json +8 -8
  63. package/lib/core/auth/formatProcessing.js +7 -7
  64. package/lib/core/auth/passportResponse.js +7 -7
  65. package/lib/core/auth/passportWrapper.js +34 -30
  66. package/lib/core/auth/tokenManager.d.ts +2 -2
  67. package/lib/core/auth/tokenManager.js +11 -10
  68. package/lib/core/backend/applicationManager.d.ts +1 -1
  69. package/lib/core/backend/applicationManager.js +2 -2
  70. package/lib/core/backend/backend.d.ts +3 -3
  71. package/lib/core/backend/backend.js +34 -31
  72. package/lib/core/backend/backendCluster.d.ts +2 -2
  73. package/lib/core/backend/backendCluster.js +5 -5
  74. package/lib/core/backend/backendConfig.d.ts +2 -2
  75. package/lib/core/backend/backendConfig.js +3 -3
  76. package/lib/core/backend/backendController.d.ts +2 -2
  77. package/lib/core/backend/backendController.js +9 -10
  78. package/lib/core/backend/backendErrors.d.ts +3 -3
  79. package/lib/core/backend/backendErrors.js +2 -1
  80. package/lib/core/backend/backendHook.d.ts +2 -2
  81. package/lib/core/backend/backendHook.js +5 -5
  82. package/lib/core/backend/backendImport.d.ts +3 -3
  83. package/lib/core/backend/backendImport.js +23 -23
  84. package/lib/core/backend/backendOpenApi.d.ts +2 -2
  85. package/lib/core/backend/backendOpenApi.js +16 -16
  86. package/lib/core/backend/backendPipe.d.ts +2 -2
  87. package/lib/core/backend/backendPipe.js +6 -6
  88. package/lib/core/backend/backendPlugin.d.ts +4 -4
  89. package/lib/core/backend/backendPlugin.js +14 -14
  90. package/lib/core/backend/backendStorage.d.ts +2 -2
  91. package/lib/core/backend/backendStorage.js +1 -2
  92. package/lib/core/backend/backendVault.d.ts +2 -2
  93. package/lib/core/backend/backendVault.js +3 -3
  94. package/lib/core/backend/index.d.ts +14 -14
  95. package/lib/core/backend/internalLogger.d.ts +1 -1
  96. package/lib/core/backend/internalLogger.js +5 -5
  97. package/lib/core/cache/cacheDbEnum.js +4 -4
  98. package/lib/core/cache/cacheEngine.js +79 -85
  99. package/lib/core/network/accessLogger.js +126 -120
  100. package/lib/core/network/clientConnection.js +5 -5
  101. package/lib/core/network/context.js +8 -8
  102. package/lib/core/network/entryPoint.js +100 -85
  103. package/lib/core/network/httpRouter/index.js +63 -60
  104. package/lib/core/network/httpRouter/routeHandler.js +18 -19
  105. package/lib/core/network/httpRouter/routePart.js +23 -19
  106. package/lib/core/network/protocolManifest.js +3 -3
  107. package/lib/core/network/protocols/httpMessage.js +8 -10
  108. package/lib/core/network/protocols/httpwsProtocol.js +305 -250
  109. package/lib/core/network/protocols/internalProtocol.js +27 -24
  110. package/lib/core/network/protocols/mqttProtocol.js +106 -96
  111. package/lib/core/network/protocols/protocol.js +20 -17
  112. package/lib/core/network/router.js +56 -46
  113. package/lib/core/plugin/plugin.js +151 -120
  114. package/lib/core/plugin/pluginContext.d.ts +7 -7
  115. package/lib/core/plugin/pluginContext.js +48 -44
  116. package/lib/core/plugin/pluginManifest.js +13 -12
  117. package/lib/core/plugin/pluginRepository.js +26 -27
  118. package/lib/core/plugin/pluginsManager.js +425 -304
  119. package/lib/core/plugin/privilegedContext.js +3 -3
  120. package/lib/core/realtime/actionEnum.js +1 -1
  121. package/lib/core/realtime/channel.d.ts +1 -1
  122. package/lib/core/realtime/channel.js +22 -22
  123. package/lib/core/realtime/connectionRooms.d.ts +1 -1
  124. package/lib/core/realtime/hotelClerk.d.ts +2 -2
  125. package/lib/core/realtime/hotelClerk.js +53 -50
  126. package/lib/core/realtime/index.js +5 -5
  127. package/lib/core/realtime/notification/document.js +25 -25
  128. package/lib/core/realtime/notification/index.js +4 -4
  129. package/lib/core/realtime/notification/server.js +3 -3
  130. package/lib/core/realtime/notification/user.js +4 -4
  131. package/lib/core/realtime/notifier.js +113 -75
  132. package/lib/core/realtime/room.d.ts +1 -1
  133. package/lib/core/realtime/subscription.d.ts +1 -1
  134. package/lib/core/realtime/subscription.js +1 -1
  135. package/lib/core/security/index.js +8 -8
  136. package/lib/core/security/profileRepository.d.ts +6 -6
  137. package/lib/core/security/profileRepository.js +48 -45
  138. package/lib/core/security/roleRepository.js +127 -115
  139. package/lib/core/security/securityLoader.js +70 -63
  140. package/lib/core/security/tokenRepository.js +132 -118
  141. package/lib/core/security/userRepository.js +104 -88
  142. package/lib/core/shared/KoncordeWrapper.d.ts +1 -1
  143. package/lib/core/shared/KoncordeWrapper.js +3 -1
  144. package/lib/core/shared/abstractManifest.js +22 -23
  145. package/lib/core/shared/repository.js +69 -67
  146. package/lib/core/shared/sdk/embeddedSdk.d.ts +2 -2
  147. package/lib/core/shared/sdk/embeddedSdk.js +36 -32
  148. package/lib/core/shared/sdk/funnelProtocol.d.ts +1 -1
  149. package/lib/core/shared/sdk/funnelProtocol.js +11 -11
  150. package/lib/core/shared/sdk/impersonatedSdk.js +19 -18
  151. package/lib/core/shared/store.js +127 -32
  152. package/lib/core/statistics/index.js +2 -2
  153. package/lib/core/statistics/statistics.js +99 -85
  154. package/lib/core/storage/clientAdapter.js +219 -136
  155. package/lib/core/storage/indexCache.js +3 -3
  156. package/lib/core/storage/storageEngine.js +10 -13
  157. package/lib/core/storage/storeScopeEnum.js +3 -3
  158. package/lib/core/validation/baseType.js +12 -10
  159. package/lib/core/validation/index.js +2 -2
  160. package/lib/core/validation/types/anything.js +4 -4
  161. package/lib/core/validation/types/boolean.js +7 -7
  162. package/lib/core/validation/types/date.js +165 -131
  163. package/lib/core/validation/types/email.js +18 -21
  164. package/lib/core/validation/types/enum.js +34 -21
  165. package/lib/core/validation/types/geoPoint.js +7 -7
  166. package/lib/core/validation/types/geoShape.js +148 -125
  167. package/lib/core/validation/types/integer.js +9 -9
  168. package/lib/core/validation/types/ipAddress.js +17 -19
  169. package/lib/core/validation/types/numeric.js +36 -29
  170. package/lib/core/validation/types/object.js +19 -19
  171. package/lib/core/validation/types/string.js +36 -29
  172. package/lib/core/validation/types/url.js +17 -19
  173. package/lib/core/validation/validation.js +422 -378
  174. package/lib/kerror/codes/1-services.json +7 -1
  175. package/lib/kerror/codes/4-plugin.json +2 -2
  176. package/lib/kerror/codes/index.js +85 -63
  177. package/lib/kerror/errors/badRequestError.d.ts +1 -1
  178. package/lib/kerror/errors/externalServiceError.d.ts +1 -1
  179. package/lib/kerror/errors/forbiddenError.d.ts +1 -1
  180. package/lib/kerror/errors/gatewayTimeoutError.d.ts +1 -1
  181. package/lib/kerror/errors/index.d.ts +15 -15
  182. package/lib/kerror/errors/internalError.d.ts +1 -1
  183. package/lib/kerror/errors/kuzzleError.d.ts +1 -1
  184. package/lib/kerror/errors/multipleErrorsError.d.ts +1 -1
  185. package/lib/kerror/errors/multipleErrorsError.js +1 -1
  186. package/lib/kerror/errors/notFoundError.d.ts +1 -1
  187. package/lib/kerror/errors/partialError.d.ts +1 -1
  188. package/lib/kerror/errors/partialError.js +1 -1
  189. package/lib/kerror/errors/pluginImplementationError.d.ts +1 -1
  190. package/lib/kerror/errors/pluginImplementationError.js +2 -1
  191. package/lib/kerror/errors/preconditionError.d.ts +1 -1
  192. package/lib/kerror/errors/serviceUnavailableError.d.ts +1 -1
  193. package/lib/kerror/errors/sizeLimitError.d.ts +1 -1
  194. package/lib/kerror/errors/tooManyRequestsError.d.ts +1 -1
  195. package/lib/kerror/errors/unauthorizedError.d.ts +1 -1
  196. package/lib/kerror/index.d.ts +3 -3
  197. package/lib/kerror/index.js +17 -16
  198. package/lib/kuzzle/dumpGenerator.js +130 -114
  199. package/lib/kuzzle/event/kuzzleEventEmitter.js +96 -70
  200. package/lib/kuzzle/event/pipeRunner.js +25 -24
  201. package/lib/kuzzle/event/waterfall.js +13 -15
  202. package/lib/kuzzle/index.js +2 -2
  203. package/lib/kuzzle/internalIndexHandler.js +80 -59
  204. package/lib/kuzzle/kuzzle.js +99 -99
  205. package/lib/kuzzle/kuzzleStateEnum.js +1 -1
  206. package/lib/kuzzle/log.js +23 -18
  207. package/lib/kuzzle/vault.js +34 -19
  208. package/lib/model/security/profile.d.ts +3 -3
  209. package/lib/model/security/profile.js +38 -37
  210. package/lib/model/security/rights.js +5 -5
  211. package/lib/model/security/role.d.ts +3 -3
  212. package/lib/model/security/role.js +25 -26
  213. package/lib/model/security/token.d.ts +1 -1
  214. package/lib/model/security/token.js +4 -4
  215. package/lib/model/security/user.d.ts +2 -2
  216. package/lib/model/security/user.js +9 -9
  217. package/lib/model/storage/apiKey.js +43 -33
  218. package/lib/model/storage/baseModel.js +49 -45
  219. package/lib/service/cache/redis.js +60 -55
  220. package/lib/service/service.js +17 -17
  221. package/lib/service/storage/elasticsearch.js +839 -755
  222. package/lib/service/storage/esWrapper.js +103 -86
  223. package/lib/service/storage/queryTranslator.js +52 -59
  224. package/lib/types/Controller.d.ts +3 -3
  225. package/lib/types/ControllerDefinition.d.ts +3 -3
  226. package/lib/types/DebugModule.d.ts +2 -2
  227. package/lib/types/DebugModule.js +1 -1
  228. package/lib/types/Global.d.ts +1 -1
  229. package/lib/types/HttpStream.d.ts +2 -1
  230. package/lib/types/HttpStream.js +7 -5
  231. package/lib/types/Kuzzle.d.ts +1 -1
  232. package/lib/types/KuzzleDocument.d.ts +1 -1
  233. package/lib/types/OpenApiDefinition.d.ts +1 -1
  234. package/lib/types/PasswordPolicy.d.ts +1 -1
  235. package/lib/types/Plugin.d.ts +6 -6
  236. package/lib/types/Plugin.js +2 -2
  237. package/lib/types/Policy.d.ts +1 -1
  238. package/lib/types/RequestPayload.d.ts +1 -1
  239. package/lib/types/ResponsePayload.d.ts +1 -1
  240. package/lib/types/Token.d.ts +1 -1
  241. package/lib/types/User.d.ts +1 -1
  242. package/lib/types/config/DumpConfiguration.d.ts +8 -8
  243. package/lib/types/config/HttpConfiguration.d.ts +1 -1
  244. package/lib/types/config/KuzzleConfiguration.d.ts +1 -1
  245. package/lib/types/config/LimitsConfiguration.d.ts +8 -8
  246. package/lib/types/config/PluginsConfiguration.d.ts +4 -4
  247. package/lib/types/config/SecurityConfiguration.d.ts +62 -62
  248. package/lib/types/config/ServerConfiguration.d.ts +55 -55
  249. package/lib/types/config/ServicesConfiguration.d.ts +2 -2
  250. package/lib/types/config/internalCache/InternalCacheRedisConfiguration.d.ts +10 -10
  251. package/lib/types/config/publicCache/PublicCacheRedisConfiguration.d.ts +3 -3
  252. package/lib/types/config/storageEngine/StorageEngineElasticsearchConfiguration.d.ts +194 -110
  253. package/lib/types/errors/ErrorDefinition.d.ts +1 -1
  254. package/lib/types/errors/ErrorDomains.d.ts +1 -1
  255. package/lib/types/index.d.ts +38 -38
  256. package/lib/types/realtime/RealtimeScope.d.ts +1 -1
  257. package/lib/types/realtime/RealtimeUsers.d.ts +1 -1
  258. package/lib/util/assertType.js +13 -11
  259. package/lib/util/async.d.ts +1 -0
  260. package/lib/util/async.js +61 -0
  261. package/lib/util/asyncStore.js +19 -21
  262. package/lib/util/bufferedPassThrough.d.ts +2 -2
  263. package/lib/util/bufferedPassThrough.js +4 -4
  264. package/lib/util/bytes.js +9 -13
  265. package/lib/util/crypto.js +1 -1
  266. package/lib/util/debug.js +5 -5
  267. package/lib/util/deprecate.js +24 -21
  268. package/lib/util/didYouMean.js +7 -7
  269. package/lib/util/dump-collection.d.ts +2 -2
  270. package/lib/util/dump-collection.js +26 -26
  271. package/lib/util/esRequest.d.ts +1 -0
  272. package/lib/util/esRequest.js +62 -0
  273. package/lib/util/extractFields.js +24 -25
  274. package/lib/util/inflector.js +5 -5
  275. package/lib/util/koncordeCompat.d.ts +2 -2
  276. package/lib/util/koncordeCompat.js +5 -5
  277. package/lib/util/memoize.js +3 -5
  278. package/lib/util/mutex.d.ts +19 -1
  279. package/lib/util/mutex.js +39 -12
  280. package/lib/util/name-generator.js +1331 -1331
  281. package/lib/util/promback.js +8 -10
  282. package/lib/util/readYamlFile.d.ts +1 -1
  283. package/lib/util/readYamlFile.js +1 -1
  284. package/lib/util/requestAssertions.js +34 -34
  285. package/lib/util/safeObject.js +5 -5
  286. package/lib/util/stackTrace.js +20 -22
  287. package/lib/util/wildcard.js +15 -15
  288. package/package.json +6 -6
  289. package/npm-shrinkwrap.json +0 -19422
@@ -19,17 +19,17 @@
19
19
  * limitations under the License.
20
20
  */
21
21
 
22
- 'use strict';
22
+ "use strict";
23
23
 
24
- const { Subscriber } = require('zeromq');
25
- const protobuf = require('protobufjs');
26
- const Long = require('long');
24
+ const { Subscriber } = require("zeromq");
25
+ const protobuf = require("protobufjs");
26
+ const Long = require("long");
27
27
 
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');
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 (localNode, remoteNodeId, remoteNodeIP) {
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 (lastMessageId) {
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 (topic, data) {
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 (! await this.validateMessage(message)) {
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(message)}`,
227
- e);
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 (message) {
247
+ async handleNodeEviction(message) {
247
248
  if (message.nodeId === this.localNode.nodeId) {
248
- global.kuzzle.log.error(`[CLUSTER] Node evicted by ${message.evictor}. Reason: ${message.reason}`);
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 (message) {
268
+ async handleNodeShutdown(message) {
266
269
  await this.localNode.evictNode(message.nodeId, {
267
270
  broadcast: false,
268
- reason: 'Node is shutting down',
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 (message) {
281
+ handleNewRealtimeRoom(message) {
279
282
  const { id, index, filter, messageId } = message;
280
283
  const icpair = fromKoncordeIndex(index);
281
284
 
282
285
  debug(
283
- 'New realtime room created by node %s (message: %d, room: %s, index: %s, collection: %s)',
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 (message) {
309
- debug('New realtime subscription received from node %s (message: %d, room: %s)',
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 (message) {
327
- debug('Realtime room removal received from node %s (message: %d, room: %s)',
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(message.roomId, this.remoteNodeId);
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 (message) {
342
- debug('Realtime unsubscription received from node %s (message: %d, room: %s)',
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 (message) {
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 (message) {
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
- 'core:realtime:document:dispatch',
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 (message) {
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
- 'core:realtime:user:sendMessage',
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 (message) {
444
+ handleNewAuthStrategy(message) {
427
445
  const { pluginName, strategy, strategyName } = message;
428
446
 
429
447
  debug(
430
- 'New authentication strategy added by node %s (plugin: %s, strategy: %s)',
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 (message) {
469
+ handleAuthStrategyRemoval(message) {
450
470
  const { pluginName, strategyName } = message;
451
471
 
452
472
  debug(
453
- 'Authentication strategy removed by node %s (plugin: %s, strategy: %s)',
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('Security reset received from node %s', this.remoteNodeId);
469
- await global.kuzzle.ask('core:security:profile:invalidate');
470
- await global.kuzzle.ask('core:security:role:invalidate');
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 (message) {
480
- debug('Dump generation request received from node %s', this.remoteNodeId);
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('Cluster-wide shutdown request received from node %s', this.remoteNodeId);
490
- global.kuzzle.log.error(`[CLUSTER] Cluster wide shutdown from ${this.remoteNodeId}`);
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('Validators changed notification received from node %s', this.remoteNodeId);
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('Index cache manually refresh received from node %s', this.remoteNodeId);
509
- await global.kuzzle.ask('core:storage:public:cache:refresh', { from: 'cluster' });
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 (message) {
552
+ async handleProfileInvalidation(message) {
519
553
  debug(
520
- 'Profile invalidation request received from node %s (profile: %s)',
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('core:security:profile:invalidate', message.profileId);
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 (message) {
571
+ async handleRoleInvalidation(message) {
534
572
  debug(
535
- 'Role invalidation request received from node %s (role: %s)',
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('core:security:role:invalidate', message.roleId);
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 (message) {
587
+ async handleIndexAddition(message) {
549
588
  const { index, scope } = message;
550
589
 
551
590
  debug(
552
- 'New index added by node %s (scope: %s, index: %s)',
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 (message) {
606
+ async handleIndexesRemoval(message) {
567
607
  const { indexes, scope } = message;
568
608
 
569
609
  debug(
570
- 'Indexes removed by node %s (scope: %s, indexes: %s)',
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 (message) {
628
+ async handleCollectionAddition(message) {
587
629
  const { collection, index, scope } = message;
588
630
 
589
631
  debug(
590
- 'New collection added by node %s (scope: %s, index: %s, collection: %s)',
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 (message) {
652
+ async handleCollectionRemoval(message) {
609
653
  const { collection, index, scope } = message;
610
654
 
611
655
  debug(
612
- 'Indexes removed by node %s (scope: %s, index: %s, collection: %s)',
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 ((now - this.lastHeartbeat) > this.heartbeatDelay) {
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: 'heartbeat timeout',
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 (message) {
673
- if (! has(message, 'messageId')) {
674
- global.kuzzle.log.warn(`Invalid message received from node ${this.remoteNodeId}. Evicting it.`);
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 ( this.state === stateEnum.BUFFERING
685
- && this.lastMessageId.greaterThanOrEqual(message.messageId)
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(`Node out-of-sync: ${message.messageId - this.lastMessageId - 1} messages lost from node ${this.remoteNodeId}`);
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 ({ broadcast, reason }) {
750
+ async evictNode({ broadcast, reason }) {
701
751
  this.state = stateEnum.EVICTED;
702
752
 
703
753
  await this.localNode.evictNode(this.remoteNodeId, { broadcast, reason });