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,26 +19,26 @@
19
19
  * limitations under the License.
20
20
  */
21
21
 
22
- 'use strict';
22
+ "use strict";
23
23
 
24
- const { difference } = require('lodash');
25
- const Bluebird = require('bluebird');
24
+ const { difference } = require("lodash");
25
+ const Bluebird = require("bluebird");
26
26
 
27
- const kerror = require('../../kerror');
28
- const actionEnum = require('./actionEnum');
29
- const { koncordeTest } = require('../../util/koncordeCompat');
27
+ const kerror = require("../../kerror");
28
+ const actionEnum = require("./actionEnum");
29
+ const { koncordeTest } = require("../../util/koncordeCompat");
30
30
  const {
31
31
  DocumentNotification,
32
32
  ServerNotification,
33
33
  UserNotification,
34
- } = require('./notification');
34
+ } = require("./notification");
35
35
 
36
36
  /**
37
37
  * Notification are meant to be dispatched on "channels" created when subscribing.
38
38
  * But some notification like TokenExpired don't have a specific channel to be received on,
39
39
  * so we need a constant channel name to send Kuzzle notification without having to subscribe.
40
40
  */
41
- const KUZZLE_NOTIFICATION_CHANNEL = 'kuzzle:notification:server';
41
+ const KUZZLE_NOTIFICATION_CHANNEL = "kuzzle:notification:server";
42
42
 
43
43
  /**
44
44
  * @typedef {Object} DocumentChanges
@@ -53,12 +53,12 @@ const KUZZLE_NOTIFICATION_CHANNEL = 'kuzzle:notification:server';
53
53
  * @class NotifierController
54
54
  */
55
55
  class NotifierController {
56
- constructor (realtimeModule) {
56
+ constructor(realtimeModule) {
57
57
  this.module = realtimeModule;
58
58
  this.ttl = global.kuzzle.config.limits.subscriptionDocumentTTL;
59
59
  }
60
60
 
61
- async init () {
61
+ async init() {
62
62
  /**
63
63
  * Low-level document notification method, allocating a new Notification
64
64
  * message and dispatching it to a precomputed list of rooms.
@@ -67,11 +67,11 @@ class NotifierController {
67
67
  * @param {Object} [opts]
68
68
  */
69
69
  global.kuzzle.onAsk(
70
- 'core:realtime:document:dispatch',
70
+ "core:realtime:document:dispatch",
71
71
  (rooms, notification, opts) => {
72
72
  return this._notifyDocument(rooms, notification, opts);
73
- });
74
-
73
+ }
74
+ );
75
75
 
76
76
  /**
77
77
  * Low-level user notification method, allocating a new Notification
@@ -81,10 +81,11 @@ class NotifierController {
81
81
  * @param {Object} [opts]
82
82
  */
83
83
  global.kuzzle.onAsk(
84
- 'core:realtime:user:sendMessage',
84
+ "core:realtime:user:sendMessage",
85
85
  (room, notification, opts) => {
86
86
  return this._notifyUser(room, notification, opts);
87
- });
87
+ }
88
+ );
88
89
 
89
90
  /**
90
91
  * Notify about document creations, updates, replacements or deletions
@@ -93,8 +94,9 @@ class NotifierController {
93
94
  * @param {Array.<DocumentChanges>} docs
94
95
  */
95
96
  global.kuzzle.onAsk(
96
- 'core:realtime:document:mNotify',
97
- (request, action, docs) => this.notifyDocuments(request, action, docs));
97
+ "core:realtime:document:mNotify",
98
+ (request, action, docs) => this.notifyDocuments(request, action, docs)
99
+ );
98
100
 
99
101
  /**
100
102
  * Notify about document creations, updates, replacements or deletions
@@ -103,23 +105,25 @@ class NotifierController {
103
105
  * @param {DocumentChanges} doc
104
106
  */
105
107
  global.kuzzle.onAsk(
106
- 'core:realtime:document:notify',
107
- (request, action, doc) => this.notifyDocuments(request, action, [doc]));
108
-
108
+ "core:realtime:document:notify",
109
+ (request, action, doc) => this.notifyDocuments(request, action, [doc])
110
+ );
109
111
 
110
112
  /**
111
113
  * Send a "token expired" notification to the target user
112
114
  * @param {string} connectionId
113
115
  */
114
- global.kuzzle.onAsk(
115
- 'core:realtime:tokenExpired:notify',
116
- connectionId => this.notifyTokenExpired(connectionId));
116
+ global.kuzzle.onAsk("core:realtime:tokenExpired:notify", (connectionId) =>
117
+ this.notifyTokenExpired(connectionId)
118
+ );
117
119
 
118
120
  /**
119
121
  * Publish the provided request content to listening subscribers
120
122
  * @param {Request} request
121
123
  */
122
- global.kuzzle.onAsk('core:realtime:publish', request => this.publish(request));
124
+ global.kuzzle.onAsk("core:realtime:publish", (request) =>
125
+ this.publish(request)
126
+ );
123
127
  }
124
128
 
125
129
  /**
@@ -133,7 +137,7 @@ class NotifierController {
133
137
  *
134
138
  * @returns {Promise}
135
139
  */
136
- async notifyDocument (rooms, request, scope, action, content) {
140
+ async notifyDocument(rooms, request, scope, action, content) {
137
141
  if (rooms.length === 0) {
138
142
  return;
139
143
  }
@@ -142,15 +146,16 @@ class NotifierController {
142
146
  request,
143
147
  scope,
144
148
  action,
145
- content);
149
+ content
150
+ );
146
151
 
147
- global.kuzzle.emit('core:notify:document', {
152
+ global.kuzzle.emit("core:notify:document", {
148
153
  notification,
149
154
  rooms,
150
155
  });
151
156
 
152
157
  await this._notifyDocument(rooms, notification, {
153
- fromCluster: false
158
+ fromCluster: false,
154
159
  });
155
160
  }
156
161
 
@@ -165,16 +170,16 @@ class NotifierController {
165
170
  *
166
171
  * @returns {Promise}
167
172
  */
168
- notifyUser (room, request, scope, content) {
173
+ notifyUser(room, request, scope, content) {
169
174
  const notification = UserNotification.fromRequest(request, scope, content);
170
175
 
171
- global.kuzzle.emit('core:notify:user', {
176
+ global.kuzzle.emit("core:notify:user", {
172
177
  notification,
173
178
  room,
174
179
  });
175
180
 
176
181
  return this._notifyUser(room, notification, {
177
- fromCluster: false
182
+ fromCluster: false,
178
183
  });
179
184
  }
180
185
 
@@ -184,13 +189,13 @@ class NotifierController {
184
189
  * @param {string} connectionId - User's connection identifier
185
190
  * @returns {Promise}
186
191
  */
187
- async notifyTokenExpired (connectionId) {
188
-
192
+ async notifyTokenExpired(connectionId) {
189
193
  await this._dispatch(
190
- 'notify:server',
194
+ "notify:server",
191
195
  [KUZZLE_NOTIFICATION_CHANNEL], // Sending notification on Kuzzle notification channel
192
- new ServerNotification('TokenExpired', 'Authentication Token Expired'),
193
- connectionId);
196
+ new ServerNotification("TokenExpired", "Authentication Token Expired"),
197
+ connectionId
198
+ );
194
199
 
195
200
  await this.module.hotelClerk.removeConnection(connectionId);
196
201
  }
@@ -201,14 +206,14 @@ class NotifierController {
201
206
  * @param {Request} request
202
207
  * @returns {Promise.<Object>}
203
208
  */
204
- publish (request) {
209
+ publish(request) {
205
210
  const rooms = this._test(request);
206
211
 
207
212
  if (rooms.length === 0) {
208
213
  return Bluebird.resolve(null);
209
214
  }
210
215
 
211
- return this.notifyDocument(rooms, request, 'in', 'publish', {
216
+ return this.notifyDocument(rooms, request, "in", "publish", {
212
217
  _id: request.input.args._id,
213
218
  _source: request.input.body,
214
219
  });
@@ -221,11 +226,11 @@ class NotifierController {
221
226
  * @param {DocumentChanges} document created
222
227
  * @returns {Promise.<Array.<string>>} list of matched rooms
223
228
  */
224
- async notifyDocumentCreate (request, document) {
229
+ async notifyDocumentCreate(request, document) {
225
230
  const rooms = this._test(request, document._source, document._id);
226
231
 
227
232
  if (rooms.length > 0) {
228
- await this.notifyDocument(rooms, request, 'in', 'create', document);
233
+ await this.notifyDocument(rooms, request, "in", "create", document);
229
234
  }
230
235
 
231
236
  return rooms;
@@ -239,17 +244,23 @@ class NotifierController {
239
244
  * @param {string} cache notification content for that document
240
245
  * @returns {Promise.<Array.<string>} list of matched rooms
241
246
  */
242
- async notifyDocumentReplace (request, document, cache = null) {
247
+ async notifyDocumentReplace(request, document, cache = null) {
243
248
  const rooms = this._test(request, document._source, document._id);
244
249
 
245
250
  if (rooms.length > 0) {
246
- await this.notifyDocument(rooms, request, 'in', 'replace', document);
251
+ await this.notifyDocument(rooms, request, "in", "replace", document);
247
252
  }
248
253
 
249
254
  if (cache !== null) {
250
255
  const stopListening = difference(JSON.parse(cache), rooms);
251
256
 
252
- await this.notifyDocument(stopListening, request, 'out', 'replace', document);
257
+ await this.notifyDocument(
258
+ stopListening,
259
+ request,
260
+ "out",
261
+ "replace",
262
+ document
263
+ );
253
264
  }
254
265
 
255
266
  return rooms;
@@ -262,12 +273,15 @@ class NotifierController {
262
273
  * @param {Array.<DocumentChanges>} documents
263
274
  * @return {Promise}
264
275
  */
265
- async notifyDocuments (request, action, documents) {
276
+ async notifyDocuments(request, action, documents) {
266
277
  const prefix = getCachePrefix(request);
267
278
  let cached = action === actionEnum.REPLACE || action === actionEnum.UPDATE;
268
279
 
269
- const cacheIds = documents.map(doc => {
270
- if ((action === actionEnum.WRITE || action === actionEnum.UPSERT) && ! cached) {
280
+ const cacheIds = documents.map((doc) => {
281
+ if (
282
+ (action === actionEnum.WRITE || action === actionEnum.UPSERT) &&
283
+ !cached
284
+ ) {
271
285
  cached = doc.created !== true; // force a bool value if undefined
272
286
  }
273
287
 
@@ -275,7 +289,7 @@ class NotifierController {
275
289
  });
276
290
 
277
291
  const cache = cached
278
- ? await global.kuzzle.ask('core:cache:internal:mget', cacheIds)
292
+ ? await global.kuzzle.ask("core:cache:internal:mget", cacheIds)
279
293
  : [];
280
294
 
281
295
  const result = await Bluebird.map(documents, (doc, index) => {
@@ -303,7 +317,12 @@ class NotifierController {
303
317
  : this.notifyDocumentReplace(request, doc, cache[index]);
304
318
 
305
319
  default:
306
- throw kerror.get('core', 'fatal', 'assertion_failed', `unknown notify action "${doc.action}"`);
320
+ throw kerror.get(
321
+ "core",
322
+ "fatal",
323
+ "assertion_failed",
324
+ `unknown notify action "${doc.action}"`
325
+ );
307
326
  }
308
327
  });
309
328
 
@@ -312,10 +331,11 @@ class NotifierController {
312
331
  await Bluebird.map(result, (rooms, index) => {
313
332
  if (rooms.length > 0) {
314
333
  return global.kuzzle.ask(
315
- 'core:cache:internal:store',
334
+ "core:cache:internal:store",
316
335
  cacheIds[index],
317
336
  JSON.stringify(rooms),
318
- { ttl: this.ttl });
337
+ { ttl: this.ttl }
338
+ );
319
339
  }
320
340
 
321
341
  toDelete.push(cacheIds[index]);
@@ -323,7 +343,7 @@ class NotifierController {
323
343
  });
324
344
 
325
345
  if (toDelete.length > 0) {
326
- await global.kuzzle.ask('core:cache:internal:del', toDelete);
346
+ await global.kuzzle.ask("core:cache:internal:del", toDelete);
327
347
  }
328
348
  }
329
349
 
@@ -334,17 +354,23 @@ class NotifierController {
334
354
  * @param {string} cache notification content for that document
335
355
  * @returns {Promise.<Array.<string>} list of matched rooms
336
356
  */
337
- async notifyDocumentUpdate (request, document, cache = null) {
357
+ async notifyDocumentUpdate(request, document, cache = null) {
338
358
  const rooms = this._test(request, document._source, document._id);
339
359
 
340
360
  if (rooms.length > 0) {
341
- await this.notifyDocument(rooms, request, 'in', 'update', document);
361
+ await this.notifyDocument(rooms, request, "in", "update", document);
342
362
  }
343
363
 
344
364
  if (cache !== null) {
345
365
  const stopListening = difference(JSON.parse(cache), rooms);
346
366
 
347
- await this.notifyDocument(stopListening, request, 'out', 'update', document);
367
+ await this.notifyDocument(
368
+ stopListening,
369
+ request,
370
+ "out",
371
+ "update",
372
+ document
373
+ );
348
374
  }
349
375
 
350
376
  return rooms;
@@ -357,11 +383,11 @@ class NotifierController {
357
383
  * @param {DocumentChanges} document
358
384
  * @returns {Promise.<Array>} returns an empty array ("no room match anymore")
359
385
  */
360
- async notifyDocumentDelete (request, document) {
386
+ async notifyDocumentDelete(request, document) {
361
387
  const rooms = this._test(request, document._source, document._id);
362
388
 
363
389
  if (rooms.length > 0) {
364
- await this.notifyDocument(rooms, request, 'out', 'delete', document);
390
+ await this.notifyDocument(rooms, request, "out", "delete", document);
365
391
  }
366
392
 
367
393
  return [];
@@ -379,20 +405,31 @@ class NotifierController {
379
405
  *
380
406
  * @returns {Promise}
381
407
  */
382
- async _dispatch (event, channels, notification, connectionId) {
408
+ async _dispatch(event, channels, notification, connectionId) {
383
409
  try {
384
410
  let updated = await global.kuzzle.pipe(event, notification);
385
- updated = await global.kuzzle.pipe('notify:dispatch', updated);
411
+ /**
412
+ * @deprecated Should be replaced by `core:realtime:notification:dispatch`
413
+ */
414
+ updated = await global.kuzzle.pipe("notify:dispatch", updated);
415
+
416
+ const updatedInfo = await global.kuzzle.pipe(
417
+ "core:realtime:notification:dispatch:before",
418
+ {
419
+ channels: channels,
420
+ connectionId: connectionId,
421
+ notification: updated,
422
+ }
423
+ );
386
424
 
387
- const action = connectionId ? 'notify' : 'broadcast';
425
+ const action = updatedInfo.connectionId ? "notify" : "broadcast";
388
426
 
389
427
  global.kuzzle.entryPoint.dispatch(action, {
390
- channels,
391
- connectionId,
392
- payload: updated
428
+ channels: updatedInfo.channels,
429
+ connectionId: updatedInfo.connectionId,
430
+ payload: updatedInfo.notification,
393
431
  });
394
- }
395
- catch (error) {
432
+ } catch (error) {
396
433
  global.kuzzle.log.error(error);
397
434
  }
398
435
  }
@@ -414,7 +451,7 @@ class NotifierController {
414
451
  *
415
452
  * @returns {Promise}
416
453
  */
417
- _notifyDocument (rooms, notification, { fromCluster = true } = {}) {
454
+ _notifyDocument(rooms, notification, { fromCluster = true } = {}) {
418
455
  const channels = [];
419
456
 
420
457
  for (const room of rooms) {
@@ -426,8 +463,8 @@ class NotifierController {
426
463
 
427
464
  for (const [channelId, channel] of hotelClerkRoom.channels.entries()) {
428
465
  const executeOnNode = fromCluster ? channel.cluster : true;
429
- const matchScope = channel.scope === 'all'
430
- || channel.scope === notification.scope;
466
+ const matchScope =
467
+ channel.scope === "all" || channel.scope === notification.scope;
431
468
 
432
469
  if (matchScope && executeOnNode) {
433
470
  channels.push(channelId);
@@ -439,7 +476,7 @@ class NotifierController {
439
476
  return Bluebird.resolve();
440
477
  }
441
478
 
442
- return this._dispatch('notify:document', channels, notification);
479
+ return this._dispatch("notify:document", channels, notification);
443
480
  }
444
481
 
445
482
  /**
@@ -452,14 +489,14 @@ class NotifierController {
452
489
  *
453
490
  * @returns {Promise}
454
491
  */
455
- _notifyUser (room, notification, { fromCluster = true } = {}) {
492
+ _notifyUser(room, notification, { fromCluster = true } = {}) {
456
493
  const channels = [];
457
494
  const hotelClerkRoom = this.module.hotelClerk.rooms.get(room);
458
495
 
459
496
  if (hotelClerkRoom !== undefined) {
460
497
  for (const [id, channel] of hotelClerkRoom.channels.entries()) {
461
- const match = channel.users === 'all'
462
- || channel.users === notification.user;
498
+ const match =
499
+ channel.users === "all" || channel.users === notification.user;
463
500
  const executeOnNode = fromCluster ? channel.cluster : true;
464
501
 
465
502
  if (executeOnNode && match) {
@@ -472,7 +509,7 @@ class NotifierController {
472
509
  return Bluebird.resolve();
473
510
  }
474
511
 
475
- return this._dispatch('notify:user', channels, notification);
512
+ return this._dispatch("notify:user", channels, notification);
476
513
  }
477
514
 
478
515
  /**
@@ -483,17 +520,18 @@ class NotifierController {
483
520
  *
484
521
  * @returns {Array.<string>}
485
522
  */
486
- _test (request, source = null, id = null) {
523
+ _test(request, source = null, id = null) {
487
524
  return koncordeTest(
488
525
  global.kuzzle.koncorde,
489
526
  request.input.args.index,
490
527
  request.input.args.collection,
491
528
  source || request.input.body || {},
492
- id || request.input.args._id);
529
+ id || request.input.args._id
530
+ );
493
531
  }
494
532
  }
495
533
 
496
- function getCachePrefix (request) {
534
+ function getCachePrefix(request) {
497
535
  // use redis key hash tag
498
536
  // (see https://redis.io/topics/cluster-spec#keys-distribution-model)
499
537
  return `{notif/${request.input.args.index}/${request.input.args.collection}}/`;
@@ -1,4 +1,4 @@
1
- import { Channel } from './channel';
1
+ import { Channel } from "./channel";
2
2
  /**
3
3
  * A room represents a subscription scope made on a combination of:
4
4
  * - index
@@ -1,4 +1,4 @@
1
- import { JSONObject } from 'kuzzle-sdk';
1
+ import { JSONObject } from "kuzzle-sdk";
2
2
  /**
3
3
  * Represents a realtime subscription of a connection to a room.
4
4
  *
@@ -41,7 +41,7 @@ class Subscription {
41
41
  this.index = index;
42
42
  this.collection = collection;
43
43
  this.filters = filters;
44
- this.kuid = user && user._id || null;
44
+ this.kuid = (user && user._id) || null;
45
45
  }
46
46
  }
47
47
  exports.Subscription = Subscription;
@@ -19,16 +19,16 @@
19
19
  * limitations under the License.
20
20
  */
21
21
 
22
- 'use strict';
22
+ "use strict";
23
23
 
24
- const RoleRepository = require('./roleRepository');
25
- const { ProfileRepository } = require('./profileRepository');
26
- const TokenRepository = require('./tokenRepository');
27
- const UserRepository = require('./userRepository');
28
- const SecurityLoader = require('./securityLoader');
24
+ const RoleRepository = require("./roleRepository");
25
+ const { ProfileRepository } = require("./profileRepository");
26
+ const TokenRepository = require("./tokenRepository");
27
+ const UserRepository = require("./userRepository");
28
+ const SecurityLoader = require("./securityLoader");
29
29
 
30
30
  class SecurityModule {
31
- constructor () {
31
+ constructor() {
32
32
  this.role = new RoleRepository(this);
33
33
  this.profile = new ProfileRepository(this);
34
34
  this.token = new TokenRepository();
@@ -36,7 +36,7 @@ class SecurityModule {
36
36
  this.loader = new SecurityLoader();
37
37
  }
38
38
 
39
- async init () {
39
+ async init() {
40
40
  await this.role.init();
41
41
  await this.profile.init();
42
42
  await this.token.init();
@@ -1,7 +1,7 @@
1
1
  /// <reference types="lodash" />
2
- import { Profile } from '../../model/security/profile';
3
- import Repository from '../shared/repository';
4
- import { JSONObject } from 'kuzzle-sdk';
2
+ import { Profile } from "../../model/security/profile";
3
+ import Repository from "../shared/repository";
4
+ import { JSONObject } from "kuzzle-sdk";
5
5
  /** @internal */
6
6
  declare type CreateOrReplaceOptions = {
7
7
  method?: string;
@@ -70,7 +70,7 @@ export declare class ProfileRepository extends Repository {
70
70
  * @param {Object} [opts]
71
71
  * @returns {Profile}
72
72
  */
73
- _createOrReplace(id: string, content: JSONObject, { method, refresh, strict, userId }?: CreateOrReplaceOptions): Promise<Profile>;
73
+ _createOrReplace(id: string, content: JSONObject, { method, refresh, strict, userId, }?: CreateOrReplaceOptions): Promise<Profile>;
74
74
  /**
75
75
  * Creates a new profile
76
76
  *
@@ -108,7 +108,7 @@ export declare class ProfileRepository extends Repository {
108
108
  /**
109
109
  * @override
110
110
  */
111
- delete(profile: Profile, { refresh, onAssignedUsers, userId, }?: {
111
+ delete(profile: Profile, { refresh, onAssignedUsers, userId }?: {
112
112
  refresh?: string;
113
113
  onAssignedUsers?: string;
114
114
  userId?: string;
@@ -134,7 +134,7 @@ export declare class ProfileRepository extends Repository {
134
134
  * applied on existing indexes/collections
135
135
  * @returns {Promise<Profile>}
136
136
  **/
137
- validateAndSaveProfile(profile: Profile, { method, refresh, retryOnConflict, strict }?: ValidateAndSaveProfileOptions): Promise<Profile>;
137
+ validateAndSaveProfile(profile: Profile, { method, refresh, retryOnConflict, strict, }?: ValidateAndSaveProfileOptions): Promise<Profile>;
138
138
  /**
139
139
  * @param {object} dto
140
140
  * @returns {Promise<Profile>}