kuzzle 2.49.1 → 2.50.0-beta.4

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 (591) hide show
  1. package/dist/bin/copy-protobuf.js +17 -0
  2. package/dist/lib/api/controllers/adminController.d.ts +51 -0
  3. package/dist/lib/api/controllers/adminController.js +191 -0
  4. package/{lib → dist/lib}/api/controllers/authController.d.ts +20 -40
  5. package/{lib → dist/lib}/api/controllers/authController.js +23 -24
  6. package/dist/lib/api/controllers/bulkController.d.ts +46 -0
  7. package/dist/lib/api/controllers/bulkController.js +132 -0
  8. package/dist/lib/api/controllers/clusterController.d.ts +6 -0
  9. package/{lib → dist/lib}/api/controllers/clusterController.js +7 -11
  10. package/dist/lib/api/controllers/collectionController.d.ts +136 -0
  11. package/dist/lib/api/controllers/collectionController.js +356 -0
  12. package/dist/lib/api/controllers/documentController.d.ts +181 -0
  13. package/dist/lib/api/controllers/documentController.js +768 -0
  14. package/dist/lib/api/controllers/index.d.ts +12 -0
  15. package/{lib → dist/lib}/api/controllers/index.js +13 -14
  16. package/dist/lib/api/controllers/indexController.d.ts +65 -0
  17. package/dist/lib/api/controllers/indexController.js +139 -0
  18. package/dist/lib/api/controllers/memoryStorageController.d.ts +8 -0
  19. package/dist/lib/api/controllers/memoryStorageController.js +867 -0
  20. package/dist/lib/api/controllers/realtimeController.d.ts +47 -0
  21. package/dist/lib/api/controllers/realtimeController.js +128 -0
  22. package/dist/lib/api/controllers/securityController.d.ts +423 -0
  23. package/dist/lib/api/controllers/securityController.js +1139 -0
  24. package/dist/lib/api/controllers/serverController.d.ts +82 -0
  25. package/dist/lib/api/controllers/serverController.js +321 -0
  26. package/dist/lib/api/documentExtractor.d.ts +9 -0
  27. package/dist/lib/api/documentExtractor.js +274 -0
  28. package/dist/lib/api/funnel.d.ts +183 -0
  29. package/dist/lib/api/funnel.js +821 -0
  30. package/dist/lib/api/httpRoutes.d.ts +17 -0
  31. package/dist/lib/api/httpRoutes.js +1496 -0
  32. package/dist/lib/api/rateLimiter.d.ts +18 -0
  33. package/dist/lib/api/rateLimiter.js +74 -0
  34. package/{lib → dist/lib}/api/request/kuzzleRequest.d.ts +2 -2
  35. package/{lib → dist/lib}/api/request/requestContext.d.ts +2 -1
  36. package/dist/lib/cluster/command.d.ts +73 -0
  37. package/dist/lib/cluster/command.js +236 -0
  38. package/dist/lib/cluster/index.d.ts +2 -0
  39. package/{lib → dist/lib}/cluster/index.js +1 -2
  40. package/dist/lib/cluster/node.d.ts +278 -0
  41. package/dist/lib/cluster/node.js +876 -0
  42. package/dist/lib/cluster/publisher.d.ts +188 -0
  43. package/dist/lib/cluster/publisher.js +347 -0
  44. package/dist/lib/cluster/subscriber.d.ts +269 -0
  45. package/dist/lib/cluster/subscriber.js +555 -0
  46. package/dist/lib/cluster/workers/IDCardRenewer.d.ts +13 -0
  47. package/dist/lib/cluster/workers/IDCardRenewer.js +120 -0
  48. package/{lib → dist/lib}/config/documentEventAliases.d.ts +1 -2
  49. package/dist/lib/config/index.d.ts +5 -0
  50. package/dist/lib/config/index.js +244 -0
  51. package/dist/lib/config/sdkCompatibility.json +9 -0
  52. package/dist/lib/core/auth/formatProcessing.d.ts +30 -0
  53. package/dist/lib/core/auth/formatProcessing.js +55 -0
  54. package/dist/lib/core/auth/passportResponse.d.ts +15 -0
  55. package/{lib → dist/lib}/core/auth/passportResponse.js +24 -30
  56. package/dist/lib/core/auth/passportWrapper.d.ts +28 -0
  57. package/dist/lib/core/auth/passportWrapper.js +126 -0
  58. package/{lib → dist/lib}/core/backend/backendConfig.js +2 -2
  59. package/{lib → dist/lib}/core/backend/backendErrors.js +9 -12
  60. package/dist/lib/core/cache/cacheEngine.d.ts +15 -0
  61. package/dist/lib/core/cache/cacheEngine.js +205 -0
  62. package/dist/lib/core/network/accessLogger.d.ts +29 -0
  63. package/dist/lib/core/network/accessLogger.js +250 -0
  64. package/dist/lib/core/network/clientConnection.d.ts +15 -0
  65. package/{lib → dist/lib}/core/network/clientConnection.js +17 -24
  66. package/dist/lib/core/network/context.d.ts +42 -0
  67. package/dist/lib/core/network/context.js +57 -0
  68. package/dist/lib/core/network/entryPoint.d.ts +62 -0
  69. package/dist/lib/core/network/entryPoint.js +261 -0
  70. package/dist/lib/core/network/httpRouter/index.d.ts +85 -0
  71. package/dist/lib/core/network/httpRouter/index.js +258 -0
  72. package/dist/lib/core/network/httpRouter/routeHandler.d.ts +46 -0
  73. package/dist/lib/core/network/httpRouter/routeHandler.js +101 -0
  74. package/dist/lib/core/network/httpRouter/routePart.d.ts +35 -0
  75. package/dist/lib/core/network/httpRouter/routePart.js +117 -0
  76. package/dist/lib/core/network/protocolManifest.d.ts +6 -0
  77. package/{lib → dist/lib}/core/network/protocolManifest.js +5 -9
  78. package/dist/lib/core/network/protocols/httpMessage.d.ts +22 -0
  79. package/dist/lib/core/network/protocols/httpMessage.js +62 -0
  80. package/dist/lib/core/network/protocols/httpwsProtocol.d.ts +171 -0
  81. package/dist/lib/core/network/protocols/httpwsProtocol.js +921 -0
  82. package/dist/lib/core/network/protocols/internalProtocol.d.ts +27 -0
  83. package/dist/lib/core/network/protocols/internalProtocol.js +82 -0
  84. package/dist/lib/core/network/protocols/mqttProtocol.d.ts +39 -0
  85. package/dist/lib/core/network/protocols/mqttProtocol.js +219 -0
  86. package/dist/lib/core/network/protocols/protocol.d.ts +26 -0
  87. package/dist/lib/core/network/protocols/protocol.js +74 -0
  88. package/dist/lib/core/network/router.d.ts +49 -0
  89. package/dist/lib/core/network/router.js +193 -0
  90. package/dist/lib/core/plugin/plugin.d.ts +56 -0
  91. package/dist/lib/core/plugin/plugin.js +282 -0
  92. package/{lib → dist/lib}/core/plugin/pluginContext.js +2 -2
  93. package/dist/lib/core/plugin/pluginManifest.d.ts +5 -0
  94. package/{lib → dist/lib}/core/plugin/pluginManifest.js +16 -27
  95. package/dist/lib/core/plugin/pluginRepository.d.ts +53 -0
  96. package/dist/lib/core/plugin/pluginRepository.js +112 -0
  97. package/dist/lib/core/plugin/pluginsManager.d.ts +190 -0
  98. package/dist/lib/core/plugin/pluginsManager.js +817 -0
  99. package/dist/lib/core/plugin/privilegedContext.d.ts +14 -0
  100. package/{lib → dist/lib}/core/plugin/privilegedContext.js +10 -14
  101. package/dist/lib/core/realtime/actionEnum.d.ts +25 -0
  102. package/{lib → dist/lib}/core/realtime/actionEnum.js +7 -10
  103. package/dist/lib/core/realtime/index.d.ts +8 -0
  104. package/{lib → dist/lib}/core/realtime/index.js +9 -13
  105. package/dist/lib/core/realtime/notification/document.d.ts +34 -0
  106. package/dist/lib/core/realtime/notification/document.js +98 -0
  107. package/dist/lib/core/realtime/notification/index.d.ts +3 -0
  108. package/{lib → dist/lib}/core/realtime/notification/index.js +4 -5
  109. package/dist/lib/core/realtime/notification/server.d.ts +17 -0
  110. package/{lib → dist/lib}/core/realtime/notification/server.js +8 -10
  111. package/dist/lib/core/realtime/notification/user.d.ts +29 -0
  112. package/dist/lib/core/realtime/notification/user.js +66 -0
  113. package/dist/lib/core/realtime/notifier.d.ts +171 -0
  114. package/dist/lib/core/realtime/notifier.js +405 -0
  115. package/dist/lib/core/security/index.d.ts +14 -0
  116. package/{lib → dist/lib}/core/security/index.js +15 -19
  117. package/dist/lib/core/security/roleRepository.d.ts +143 -0
  118. package/dist/lib/core/security/roleRepository.js +445 -0
  119. package/dist/lib/core/security/securityLoader.d.ts +24 -0
  120. package/dist/lib/core/security/securityLoader.js +125 -0
  121. package/{lib → dist/lib}/core/security/tokenRepository.js +1 -1
  122. package/dist/lib/core/security/userRepository.d.ts +81 -0
  123. package/dist/lib/core/security/userRepository.js +346 -0
  124. package/dist/lib/core/shared/abstractManifest.d.ts +27 -0
  125. package/dist/lib/core/shared/abstractManifest.js +85 -0
  126. package/dist/lib/core/shared/sdk/impersonatedSdk.d.ts +7 -0
  127. package/dist/lib/core/shared/sdk/impersonatedSdk.js +80 -0
  128. package/{lib → dist/lib}/core/shared/store.d.ts +2 -2
  129. package/dist/lib/core/statistics/statistics.d.ts +94 -0
  130. package/dist/lib/core/statistics/statistics.js +287 -0
  131. package/dist/lib/core/storage/clientAdapter.d.ts +62 -0
  132. package/dist/lib/core/storage/clientAdapter.js +756 -0
  133. package/dist/lib/core/storage/storageEngine.d.ts +13 -0
  134. package/dist/lib/core/storage/storageEngine.js +52 -0
  135. package/dist/lib/core/validation/baseType.d.ts +35 -0
  136. package/dist/lib/core/validation/baseType.js +70 -0
  137. package/dist/lib/core/validation/types/anything.d.ts +10 -0
  138. package/{lib → dist/lib}/core/validation/types/anything.js +7 -10
  139. package/dist/lib/core/validation/types/boolean.d.ts +16 -0
  140. package/{lib → dist/lib}/core/validation/types/boolean.js +18 -23
  141. package/dist/lib/core/validation/types/date.d.ts +17 -0
  142. package/dist/lib/core/validation/types/date.js +215 -0
  143. package/dist/lib/core/validation/types/email.d.ts +17 -0
  144. package/dist/lib/core/validation/types/email.js +80 -0
  145. package/dist/lib/core/validation/types/enum.d.ts +17 -0
  146. package/dist/lib/core/validation/types/enum.js +70 -0
  147. package/dist/lib/core/validation/types/geoPoint.d.ts +17 -0
  148. package/{lib → dist/lib}/core/validation/types/geoPoint.js +19 -24
  149. package/dist/lib/core/validation/types/geoShape.d.ts +31 -0
  150. package/dist/lib/core/validation/types/geoShape.js +280 -0
  151. package/dist/lib/core/validation/types/integer.d.ts +7 -0
  152. package/{lib → dist/lib}/core/validation/types/integer.js +21 -27
  153. package/dist/lib/core/validation/types/ipAddress.d.ts +17 -0
  154. package/dist/lib/core/validation/types/ipAddress.js +73 -0
  155. package/dist/lib/core/validation/types/numeric.d.ts +17 -0
  156. package/dist/lib/core/validation/types/numeric.js +84 -0
  157. package/dist/lib/core/validation/types/object.d.ts +24 -0
  158. package/dist/lib/core/validation/types/object.js +74 -0
  159. package/dist/lib/core/validation/types/string.d.ts +17 -0
  160. package/dist/lib/core/validation/types/string.js +85 -0
  161. package/dist/lib/core/validation/types/url.d.ts +17 -0
  162. package/dist/lib/core/validation/types/url.js +73 -0
  163. package/dist/lib/core/validation/validation.d.ts +113 -0
  164. package/dist/lib/core/validation/validation.js +692 -0
  165. package/dist/lib/kerror/codes/0-core.json +194 -0
  166. package/dist/lib/kerror/codes/1-services.json +351 -0
  167. package/dist/lib/kerror/codes/2-api.json +195 -0
  168. package/dist/lib/kerror/codes/3-network.json +151 -0
  169. package/dist/lib/kerror/codes/4-plugin.json +498 -0
  170. package/dist/lib/kerror/codes/5-validation.json +158 -0
  171. package/dist/lib/kerror/codes/6-protocol.json +28 -0
  172. package/dist/lib/kerror/codes/7-security.json +283 -0
  173. package/dist/lib/kerror/codes/8-cluster.json +16 -0
  174. package/dist/lib/kerror/codes/index.d.ts +24 -0
  175. package/dist/lib/kerror/codes/index.js +140 -0
  176. package/{lib → dist/lib}/kerror/index.d.ts +5 -5
  177. package/{lib → dist/lib}/kuzzle/Logger.d.ts +6 -0
  178. package/{lib → dist/lib}/kuzzle/Logger.js +26 -5
  179. package/dist/lib/kuzzle/dumpGenerator.d.ts +14 -0
  180. package/dist/lib/kuzzle/dumpGenerator.js +180 -0
  181. package/dist/lib/kuzzle/event/pipeRunner.d.ts +30 -0
  182. package/dist/lib/kuzzle/event/pipeRunner.js +119 -0
  183. package/dist/lib/kuzzle/event/waterfall.d.ts +2 -0
  184. package/dist/lib/kuzzle/event/waterfall.js +90 -0
  185. package/dist/lib/kuzzle/internalIndexHandler.d.ts +186 -0
  186. package/dist/lib/kuzzle/internalIndexHandler.js +174 -0
  187. package/{lib → dist/lib}/kuzzle/kuzzle.d.ts +6 -7
  188. package/{lib → dist/lib}/kuzzle/kuzzle.js +5 -2
  189. package/dist/lib/kuzzle/kuzzleStateEnum.d.ts +20 -0
  190. package/{lib → dist/lib}/kuzzle/kuzzleStateEnum.js +5 -8
  191. package/dist/lib/kuzzle/vault.d.ts +2 -0
  192. package/dist/lib/kuzzle/vault.js +63 -0
  193. package/dist/lib/model/security/rights.d.ts +8 -0
  194. package/{lib → dist/lib}/model/security/rights.js +4 -8
  195. package/{lib → dist/lib}/model/security/role.d.ts +1 -1
  196. package/{lib → dist/lib}/model/security/user.d.ts +1 -0
  197. package/dist/lib/model/storage/apiKey.d.ts +49 -0
  198. package/dist/lib/model/storage/apiKey.js +126 -0
  199. package/dist/lib/model/storage/baseModel.d.ts +100 -0
  200. package/dist/lib/model/storage/baseModel.js +211 -0
  201. package/dist/lib/service/cache/redis.d.ts +74 -0
  202. package/dist/lib/service/cache/redis.js +237 -0
  203. package/dist/lib/service/service.d.ts +30 -0
  204. package/dist/lib/service/service.js +74 -0
  205. package/{lib → dist/lib}/service/storage/7/elasticsearch.d.ts +2 -2
  206. package/{lib → dist/lib}/service/storage/7/elasticsearch.js +23 -25
  207. package/dist/lib/service/storage/7/esWrapper.d.ts +19 -0
  208. package/dist/lib/service/storage/7/esWrapper.js +245 -0
  209. package/{lib → dist/lib}/service/storage/8/elasticsearch.js +23 -25
  210. package/dist/lib/service/storage/8/esWrapper.d.ts +19 -0
  211. package/dist/lib/service/storage/8/esWrapper.js +245 -0
  212. package/{lib → dist/lib}/types/Plugin.d.ts +1 -1
  213. package/{lib/types → dist/lib/types/controllers}/Controller.d.ts +2 -2
  214. package/{lib/types → dist/lib/types/controllers}/ControllerDefinition.d.ts +1 -1
  215. package/dist/lib/types/controllers/adminControlller.type.d.ts +5 -0
  216. package/dist/lib/types/controllers/adminControlller.type.js +3 -0
  217. package/dist/lib/types/controllers/authController.type.d.ts +5 -0
  218. package/dist/lib/types/controllers/authController.type.js +3 -0
  219. package/dist/lib/types/core/auth/formatProcessing.type.d.ts +7 -0
  220. package/dist/lib/types/core/auth/formatProcessing.type.js +3 -0
  221. package/{lib → dist/lib}/types/index.d.ts +3 -3
  222. package/{lib → dist/lib}/types/index.js +3 -3
  223. package/dist/lib/util/assertType.d.ts +41 -0
  224. package/{lib → dist/lib}/util/assertType.js +38 -56
  225. package/dist/lib/util/asyncStore.d.ts +38 -0
  226. package/dist/lib/util/asyncStore.js +70 -0
  227. package/dist/lib/util/bytes.d.ts +2 -0
  228. package/dist/lib/util/bytes.js +33 -0
  229. package/dist/lib/util/debug.d.ts +2 -0
  230. package/{lib → dist/lib}/util/debug.js +15 -23
  231. package/dist/lib/util/deprecate.d.ts +1 -0
  232. package/dist/lib/util/deprecate.js +64 -0
  233. package/dist/lib/util/didYouMean.d.ts +2 -0
  234. package/{lib → dist/lib}/util/didYouMean.js +9 -15
  235. package/dist/lib/util/extractFields.d.ts +17 -0
  236. package/{lib → dist/lib}/util/extractFields.js +18 -32
  237. package/dist/lib/util/memoize.d.ts +7 -0
  238. package/{lib → dist/lib}/util/memoize.js +14 -21
  239. package/dist/lib/util/promback.d.ts +13 -0
  240. package/dist/lib/util/promback.js +60 -0
  241. package/dist/lib/util/requestAssertions.d.ts +10 -0
  242. package/dist/lib/util/requestAssertions.js +143 -0
  243. package/dist/lib/util/safeObject.d.ts +3 -0
  244. package/{lib → dist/lib}/util/safeObject.js +7 -13
  245. package/dist/lib/util/stackTrace.d.ts +19 -0
  246. package/{lib → dist/lib}/util/stackTrace.js +35 -41
  247. package/dist/lib/util/wildcard.d.ts +1 -0
  248. package/{lib → dist/lib}/util/wildcard.js +21 -30
  249. package/dist/package.json +119 -0
  250. package/package.json +44 -58
  251. package/bin/start-kuzzle-server +0 -126
  252. package/check-node-version.js +0 -17
  253. package/lib/api/controllers/adminController.js +0 -229
  254. package/lib/api/controllers/bulkController.js +0 -210
  255. package/lib/api/controllers/collectionController.js +0 -502
  256. package/lib/api/controllers/documentController.js +0 -1156
  257. package/lib/api/controllers/indexController.js +0 -179
  258. package/lib/api/controllers/memoryStorageController.js +0 -1023
  259. package/lib/api/controllers/realtimeController.js +0 -155
  260. package/lib/api/controllers/securityController.js +0 -1571
  261. package/lib/api/controllers/serverController.js +0 -381
  262. package/lib/api/documentExtractor.js +0 -309
  263. package/lib/api/funnel.js +0 -1143
  264. package/lib/api/httpRoutes.js +0 -1547
  265. package/lib/api/rateLimiter.js +0 -87
  266. package/lib/cluster/command.js +0 -284
  267. package/lib/cluster/node.js +0 -1203
  268. package/lib/cluster/publisher.js +0 -386
  269. package/lib/cluster/subscriber.js +0 -776
  270. package/lib/cluster/workers/IDCardRenewer.js +0 -144
  271. package/lib/config/index.js +0 -351
  272. package/lib/config/sdkCompatibility.json +0 -9
  273. package/lib/core/auth/formatProcessing.js +0 -66
  274. package/lib/core/auth/passportWrapper.js +0 -126
  275. package/lib/core/cache/cacheEngine.js +0 -278
  276. package/lib/core/network/accessLogger.js +0 -322
  277. package/lib/core/network/context.js +0 -80
  278. package/lib/core/network/entryPoint.js +0 -358
  279. package/lib/core/network/httpRouter/index.js +0 -316
  280. package/lib/core/network/httpRouter/routeHandler.js +0 -111
  281. package/lib/core/network/httpRouter/routePart.js +0 -147
  282. package/lib/core/network/protocols/httpMessage.js +0 -69
  283. package/lib/core/network/protocols/httpwsProtocol.js +0 -1254
  284. package/lib/core/network/protocols/internalProtocol.js +0 -109
  285. package/lib/core/network/protocols/mqttProtocol.js +0 -291
  286. package/lib/core/network/protocols/protocol.js +0 -102
  287. package/lib/core/network/router.js +0 -255
  288. package/lib/core/plugin/plugin.js +0 -436
  289. package/lib/core/plugin/pluginRepository.js +0 -132
  290. package/lib/core/plugin/pluginsManager.js +0 -1244
  291. package/lib/core/realtime/notification/document.js +0 -108
  292. package/lib/core/realtime/notification/user.js +0 -70
  293. package/lib/core/realtime/notifier.js +0 -541
  294. package/lib/core/security/README.md +0 -223
  295. package/lib/core/security/roleRepository.js +0 -569
  296. package/lib/core/security/securityLoader.js +0 -174
  297. package/lib/core/security/userRepository.js +0 -446
  298. package/lib/core/shared/README.md +0 -3
  299. package/lib/core/shared/abstractManifest.js +0 -102
  300. package/lib/core/shared/sdk/impersonatedSdk.js +0 -94
  301. package/lib/core/statistics/index.js +0 -24
  302. package/lib/core/statistics/statistics.js +0 -373
  303. package/lib/core/storage/clientAdapter.js +0 -1045
  304. package/lib/core/storage/storageEngine.js +0 -63
  305. package/lib/core/validation/baseType.js +0 -80
  306. package/lib/core/validation/index.js +0 -24
  307. package/lib/core/validation/types/date.js +0 -284
  308. package/lib/core/validation/types/email.js +0 -92
  309. package/lib/core/validation/types/enum.js +0 -100
  310. package/lib/core/validation/types/geoShape.js +0 -370
  311. package/lib/core/validation/types/ipAddress.js +0 -83
  312. package/lib/core/validation/types/numeric.js +0 -108
  313. package/lib/core/validation/types/object.js +0 -88
  314. package/lib/core/validation/types/string.js +0 -110
  315. package/lib/core/validation/types/url.js +0 -83
  316. package/lib/core/validation/validation.js +0 -1180
  317. package/lib/kerror/codes/0-core.json +0 -194
  318. package/lib/kerror/codes/1-services.json +0 -351
  319. package/lib/kerror/codes/2-api.json +0 -195
  320. package/lib/kerror/codes/3-network.json +0 -151
  321. package/lib/kerror/codes/4-plugin.json +0 -498
  322. package/lib/kerror/codes/5-validation.json +0 -158
  323. package/lib/kerror/codes/6-protocol.json +0 -28
  324. package/lib/kerror/codes/7-security.json +0 -283
  325. package/lib/kerror/codes/8-cluster.json +0 -16
  326. package/lib/kerror/codes/index.js +0 -208
  327. package/lib/kuzzle/dumpGenerator.js +0 -259
  328. package/lib/kuzzle/event/pipeRunner.js +0 -144
  329. package/lib/kuzzle/event/waterfall.js +0 -101
  330. package/lib/kuzzle/internalIndexHandler.js +0 -234
  331. package/lib/kuzzle/vault.js +0 -89
  332. package/lib/model/storage/apiKey.js +0 -158
  333. package/lib/model/storage/baseModel.js +0 -275
  334. package/lib/service/cache/redis.js +0 -282
  335. package/lib/service/service.js +0 -84
  336. package/lib/service/storage/7/esWrapper.js +0 -303
  337. package/lib/service/storage/8/esWrapper.js +0 -303
  338. package/lib/util/asyncStore.js +0 -112
  339. package/lib/util/bytes.js +0 -36
  340. package/lib/util/deprecate.js +0 -82
  341. package/lib/util/promback.js +0 -66
  342. package/lib/util/readYamlFile.d.ts +0 -2
  343. package/lib/util/readYamlFile.js +0 -10
  344. package/lib/util/requestAssertions.js +0 -157
  345. /package/{index.d.ts → dist/index.d.ts} +0 -0
  346. /package/{index.js → dist/index.js} +0 -0
  347. /package/{lib → dist/lib}/api/controllers/baseController.d.ts +0 -0
  348. /package/{lib → dist/lib}/api/controllers/baseController.js +0 -0
  349. /package/{lib → dist/lib}/api/controllers/debugController.d.ts +0 -0
  350. /package/{lib → dist/lib}/api/controllers/debugController.js +0 -0
  351. /package/{lib → dist/lib}/api/openapi/OpenApiManager.d.ts +0 -0
  352. /package/{lib → dist/lib}/api/openapi/OpenApiManager.js +0 -0
  353. /package/{lib → dist/lib}/api/openapi/index.d.ts +0 -0
  354. /package/{lib → dist/lib}/api/openapi/index.js +0 -0
  355. /package/{lib → dist/lib}/api/openapi/openApiGenerator.d.ts +0 -0
  356. /package/{lib → dist/lib}/api/openapi/openApiGenerator.js +0 -0
  357. /package/{lib → dist/lib}/api/request/index.d.ts +0 -0
  358. /package/{lib → dist/lib}/api/request/index.js +0 -0
  359. /package/{lib → dist/lib}/api/request/kuzzleRequest.js +0 -0
  360. /package/{lib → dist/lib}/api/request/requestContext.js +0 -0
  361. /package/{lib → dist/lib}/api/request/requestInput.d.ts +0 -0
  362. /package/{lib → dist/lib}/api/request/requestInput.js +0 -0
  363. /package/{lib → dist/lib}/api/request/requestResponse.d.ts +0 -0
  364. /package/{lib → dist/lib}/api/request/requestResponse.js +0 -0
  365. /package/{lib → dist/lib}/cluster/idCardHandler.d.ts +0 -0
  366. /package/{lib → dist/lib}/cluster/idCardHandler.js +0 -0
  367. /package/{lib → dist/lib}/cluster/protobuf/command.proto +0 -0
  368. /package/{lib → dist/lib}/cluster/protobuf/sync.proto +0 -0
  369. /package/{lib → dist/lib}/cluster/state.d.ts +0 -0
  370. /package/{lib → dist/lib}/cluster/state.js +0 -0
  371. /package/{lib → dist/lib}/config/default.config.d.ts +0 -0
  372. /package/{lib → dist/lib}/config/default.config.js +0 -0
  373. /package/{lib → dist/lib}/config/documentEventAliases.js +0 -0
  374. /package/{lib → dist/lib}/core/auth/tokenManager.d.ts +0 -0
  375. /package/{lib → dist/lib}/core/auth/tokenManager.js +0 -0
  376. /package/{lib → dist/lib}/core/backend/applicationManager.d.ts +0 -0
  377. /package/{lib → dist/lib}/core/backend/applicationManager.js +0 -0
  378. /package/{lib → dist/lib}/core/backend/backend.d.ts +0 -0
  379. /package/{lib → dist/lib}/core/backend/backend.js +0 -0
  380. /package/{lib → dist/lib}/core/backend/backendCluster.d.ts +0 -0
  381. /package/{lib → dist/lib}/core/backend/backendCluster.js +0 -0
  382. /package/{lib → dist/lib}/core/backend/backendConfig.d.ts +0 -0
  383. /package/{lib → dist/lib}/core/backend/backendController.d.ts +0 -0
  384. /package/{lib → dist/lib}/core/backend/backendController.js +0 -0
  385. /package/{lib → dist/lib}/core/backend/backendErrors.d.ts +0 -0
  386. /package/{lib → dist/lib}/core/backend/backendHook.d.ts +0 -0
  387. /package/{lib → dist/lib}/core/backend/backendHook.js +0 -0
  388. /package/{lib → dist/lib}/core/backend/backendImport.d.ts +0 -0
  389. /package/{lib → dist/lib}/core/backend/backendImport.js +0 -0
  390. /package/{lib → dist/lib}/core/backend/backendOpenApi.d.ts +0 -0
  391. /package/{lib → dist/lib}/core/backend/backendOpenApi.js +0 -0
  392. /package/{lib → dist/lib}/core/backend/backendPipe.d.ts +0 -0
  393. /package/{lib → dist/lib}/core/backend/backendPipe.js +0 -0
  394. /package/{lib → dist/lib}/core/backend/backendPlugin.d.ts +0 -0
  395. /package/{lib → dist/lib}/core/backend/backendPlugin.js +0 -0
  396. /package/{lib → dist/lib}/core/backend/backendStorage.d.ts +0 -0
  397. /package/{lib → dist/lib}/core/backend/backendStorage.js +0 -0
  398. /package/{lib → dist/lib}/core/backend/backendSubscription.d.ts +0 -0
  399. /package/{lib → dist/lib}/core/backend/backendSubscription.js +0 -0
  400. /package/{lib → dist/lib}/core/backend/backendVault.d.ts +0 -0
  401. /package/{lib → dist/lib}/core/backend/backendVault.js +0 -0
  402. /package/{lib → dist/lib}/core/backend/index.d.ts +0 -0
  403. /package/{lib → dist/lib}/core/backend/index.js +0 -0
  404. /package/{lib → dist/lib}/core/backend/internalLogger.d.ts +0 -0
  405. /package/{lib → dist/lib}/core/backend/internalLogger.js +0 -0
  406. /package/{lib → dist/lib}/core/cache/cacheDbEnum.d.ts +0 -0
  407. /package/{lib → dist/lib}/core/cache/cacheDbEnum.js +0 -0
  408. /package/{lib → dist/lib}/core/debug/kuzzleDebugger.d.ts +0 -0
  409. /package/{lib → dist/lib}/core/debug/kuzzleDebugger.js +0 -0
  410. /package/{lib → dist/lib}/core/plugin/pluginContext.d.ts +0 -0
  411. /package/{lib → dist/lib}/core/realtime/channel.d.ts +0 -0
  412. /package/{lib → dist/lib}/core/realtime/channel.js +0 -0
  413. /package/{lib → dist/lib}/core/realtime/connectionRooms.d.ts +0 -0
  414. /package/{lib → dist/lib}/core/realtime/connectionRooms.js +0 -0
  415. /package/{lib → dist/lib}/core/realtime/hotelClerk.d.ts +0 -0
  416. /package/{lib → dist/lib}/core/realtime/hotelClerk.js +0 -0
  417. /package/{lib → dist/lib}/core/realtime/room.d.ts +0 -0
  418. /package/{lib → dist/lib}/core/realtime/room.js +0 -0
  419. /package/{lib → dist/lib}/core/realtime/subscription.d.ts +0 -0
  420. /package/{lib → dist/lib}/core/realtime/subscription.js +0 -0
  421. /package/{lib → dist/lib}/core/security/profileRepository.d.ts +0 -0
  422. /package/{lib → dist/lib}/core/security/profileRepository.js +0 -0
  423. /package/{lib → dist/lib}/core/security/tokenRepository.d.ts +0 -0
  424. /package/{lib → dist/lib}/core/shared/KoncordeWrapper.d.ts +0 -0
  425. /package/{lib → dist/lib}/core/shared/KoncordeWrapper.js +0 -0
  426. /package/{lib → dist/lib}/core/shared/ObjectRepository.d.ts +0 -0
  427. /package/{lib → dist/lib}/core/shared/ObjectRepository.js +0 -0
  428. /package/{lib → dist/lib}/core/shared/sdk/embeddedSdk.d.ts +0 -0
  429. /package/{lib → dist/lib}/core/shared/sdk/embeddedSdk.js +0 -0
  430. /package/{lib → dist/lib}/core/shared/sdk/funnelProtocol.d.ts +0 -0
  431. /package/{lib → dist/lib}/core/shared/sdk/funnelProtocol.js +0 -0
  432. /package/{lib → dist/lib}/core/shared/store.js +0 -0
  433. /package/{lib → dist/lib}/core/storage/indexCache.d.ts +0 -0
  434. /package/{lib → dist/lib}/core/storage/indexCache.js +0 -0
  435. /package/{lib → dist/lib}/core/storage/storeScopeEnum.d.ts +0 -0
  436. /package/{lib → dist/lib}/core/storage/storeScopeEnum.js +0 -0
  437. /package/{lib → dist/lib}/kerror/errors/badRequestError.d.ts +0 -0
  438. /package/{lib → dist/lib}/kerror/errors/badRequestError.js +0 -0
  439. /package/{lib → dist/lib}/kerror/errors/externalServiceError.d.ts +0 -0
  440. /package/{lib → dist/lib}/kerror/errors/externalServiceError.js +0 -0
  441. /package/{lib → dist/lib}/kerror/errors/forbiddenError.d.ts +0 -0
  442. /package/{lib → dist/lib}/kerror/errors/forbiddenError.js +0 -0
  443. /package/{lib → dist/lib}/kerror/errors/gatewayTimeoutError.d.ts +0 -0
  444. /package/{lib → dist/lib}/kerror/errors/gatewayTimeoutError.js +0 -0
  445. /package/{lib → dist/lib}/kerror/errors/index.d.ts +0 -0
  446. /package/{lib → dist/lib}/kerror/errors/index.js +0 -0
  447. /package/{lib → dist/lib}/kerror/errors/internalError.d.ts +0 -0
  448. /package/{lib → dist/lib}/kerror/errors/internalError.js +0 -0
  449. /package/{lib → dist/lib}/kerror/errors/kuzzleError.d.ts +0 -0
  450. /package/{lib → dist/lib}/kerror/errors/kuzzleError.js +0 -0
  451. /package/{lib → dist/lib}/kerror/errors/multipleErrorsError.d.ts +0 -0
  452. /package/{lib → dist/lib}/kerror/errors/multipleErrorsError.js +0 -0
  453. /package/{lib → dist/lib}/kerror/errors/notFoundError.d.ts +0 -0
  454. /package/{lib → dist/lib}/kerror/errors/notFoundError.js +0 -0
  455. /package/{lib → dist/lib}/kerror/errors/partialError.d.ts +0 -0
  456. /package/{lib → dist/lib}/kerror/errors/partialError.js +0 -0
  457. /package/{lib → dist/lib}/kerror/errors/pluginImplementationError.d.ts +0 -0
  458. /package/{lib → dist/lib}/kerror/errors/pluginImplementationError.js +0 -0
  459. /package/{lib → dist/lib}/kerror/errors/preconditionError.d.ts +0 -0
  460. /package/{lib → dist/lib}/kerror/errors/preconditionError.js +0 -0
  461. /package/{lib → dist/lib}/kerror/errors/serviceUnavailableError.d.ts +0 -0
  462. /package/{lib → dist/lib}/kerror/errors/serviceUnavailableError.js +0 -0
  463. /package/{lib → dist/lib}/kerror/errors/sizeLimitError.d.ts +0 -0
  464. /package/{lib → dist/lib}/kerror/errors/sizeLimitError.js +0 -0
  465. /package/{lib → dist/lib}/kerror/errors/tooManyRequestsError.d.ts +0 -0
  466. /package/{lib → dist/lib}/kerror/errors/tooManyRequestsError.js +0 -0
  467. /package/{lib → dist/lib}/kerror/errors/unauthorizedError.d.ts +0 -0
  468. /package/{lib → dist/lib}/kerror/errors/unauthorizedError.js +0 -0
  469. /package/{lib → dist/lib}/kerror/index.js +0 -0
  470. /package/{lib → dist/lib}/kuzzle/event/KuzzleEventEmitter.d.ts +0 -0
  471. /package/{lib → dist/lib}/kuzzle/event/KuzzleEventEmitter.js +0 -0
  472. /package/{lib → dist/lib}/kuzzle/index.d.ts +0 -0
  473. /package/{lib → dist/lib}/kuzzle/index.js +0 -0
  474. /package/{lib → dist/lib}/model/security/profile.d.ts +0 -0
  475. /package/{lib → dist/lib}/model/security/profile.js +0 -0
  476. /package/{lib → dist/lib}/model/security/role.js +0 -0
  477. /package/{lib → dist/lib}/model/security/token.d.ts +0 -0
  478. /package/{lib → dist/lib}/model/security/token.js +0 -0
  479. /package/{lib → dist/lib}/model/security/user.js +0 -0
  480. /package/{lib → dist/lib}/service/storage/8/elasticsearch.d.ts +0 -0
  481. /package/{lib → dist/lib}/service/storage/Elasticsearch.d.ts +0 -0
  482. /package/{lib → dist/lib}/service/storage/Elasticsearch.js +0 -0
  483. /package/{lib → dist/lib}/service/storage/commons/queryTranslator.d.ts +0 -0
  484. /package/{lib → dist/lib}/service/storage/commons/queryTranslator.js +0 -0
  485. /package/{lib → dist/lib}/types/ClientConnection.d.ts +0 -0
  486. /package/{lib → dist/lib}/types/ClientConnection.js +0 -0
  487. /package/{lib → dist/lib}/types/Deprecation.d.ts +0 -0
  488. /package/{lib → dist/lib}/types/Deprecation.js +0 -0
  489. /package/{lib → dist/lib}/types/EventHandler.d.ts +0 -0
  490. /package/{lib → dist/lib}/types/EventHandler.js +0 -0
  491. /package/{lib → dist/lib}/types/Global.d.ts +0 -0
  492. /package/{lib → dist/lib}/types/Global.js +0 -0
  493. /package/{lib → dist/lib}/types/HttpMessage.d.ts +0 -0
  494. /package/{lib → dist/lib}/types/HttpMessage.js +0 -0
  495. /package/{lib → dist/lib}/types/HttpStream.d.ts +0 -0
  496. /package/{lib → dist/lib}/types/HttpStream.js +0 -0
  497. /package/{lib → dist/lib}/types/Kuzzle.d.ts +0 -0
  498. /package/{lib → dist/lib}/types/Kuzzle.js +0 -0
  499. /package/{lib → dist/lib}/types/KuzzleDocument.d.ts +0 -0
  500. /package/{lib → dist/lib}/types/KuzzleDocument.js +0 -0
  501. /package/{lib → dist/lib}/types/OpenApiDefinition.d.ts +0 -0
  502. /package/{lib → dist/lib}/types/OpenApiDefinition.js +0 -0
  503. /package/{lib → dist/lib}/types/PasswordPolicy.d.ts +0 -0
  504. /package/{lib → dist/lib}/types/PasswordPolicy.js +0 -0
  505. /package/{lib → dist/lib}/types/Plugin.js +0 -0
  506. /package/{lib → dist/lib}/types/PluginManifest.d.ts +0 -0
  507. /package/{lib → dist/lib}/types/PluginManifest.js +0 -0
  508. /package/{lib → dist/lib}/types/Policy.d.ts +0 -0
  509. /package/{lib → dist/lib}/types/Policy.js +0 -0
  510. /package/{lib → dist/lib}/types/PolicyRestrictions.d.ts +0 -0
  511. /package/{lib → dist/lib}/types/PolicyRestrictions.js +0 -0
  512. /package/{lib → dist/lib}/types/ProfileDefinition.d.ts +0 -0
  513. /package/{lib → dist/lib}/types/ProfileDefinition.js +0 -0
  514. /package/{lib → dist/lib}/types/RoleDefinition.d.ts +0 -0
  515. /package/{lib → dist/lib}/types/RoleDefinition.js +0 -0
  516. /package/{lib → dist/lib}/types/StrategyDefinition.d.ts +0 -0
  517. /package/{lib → dist/lib}/types/StrategyDefinition.js +0 -0
  518. /package/{lib → dist/lib}/types/Target.d.ts +0 -0
  519. /package/{lib → dist/lib}/types/Target.js +0 -0
  520. /package/{lib → dist/lib}/types/Token.d.ts +0 -0
  521. /package/{lib → dist/lib}/types/Token.js +0 -0
  522. /package/{lib → dist/lib}/types/User.d.ts +0 -0
  523. /package/{lib → dist/lib}/types/User.js +0 -0
  524. /package/{lib → dist/lib}/types/config/DumpConfiguration.d.ts +0 -0
  525. /package/{lib → dist/lib}/types/config/DumpConfiguration.js +0 -0
  526. /package/{lib → dist/lib}/types/config/HttpConfiguration.d.ts +0 -0
  527. /package/{lib → dist/lib}/types/config/HttpConfiguration.js +0 -0
  528. /package/{lib → dist/lib}/types/config/KuzzleConfiguration.d.ts +0 -0
  529. /package/{lib → dist/lib}/types/config/KuzzleConfiguration.js +0 -0
  530. /package/{lib → dist/lib}/types/config/LimitsConfiguration.d.ts +0 -0
  531. /package/{lib → dist/lib}/types/config/LimitsConfiguration.js +0 -0
  532. /package/{lib → dist/lib}/types/config/PluginsConfiguration.d.ts +0 -0
  533. /package/{lib → dist/lib}/types/config/PluginsConfiguration.js +0 -0
  534. /package/{lib → dist/lib}/types/config/SecurityConfiguration.d.ts +0 -0
  535. /package/{lib → dist/lib}/types/config/SecurityConfiguration.js +0 -0
  536. /package/{lib → dist/lib}/types/config/ServerConfiguration.d.ts +0 -0
  537. /package/{lib → dist/lib}/types/config/ServerConfiguration.js +0 -0
  538. /package/{lib → dist/lib}/types/config/ServicesConfiguration.d.ts +0 -0
  539. /package/{lib → dist/lib}/types/config/ServicesConfiguration.js +0 -0
  540. /package/{lib → dist/lib}/types/config/internalCache/InternalCacheRedisConfiguration.d.ts +0 -0
  541. /package/{lib → dist/lib}/types/config/internalCache/InternalCacheRedisConfiguration.js +0 -0
  542. /package/{lib → dist/lib}/types/config/publicCache/PublicCacheRedisConfiguration.d.ts +0 -0
  543. /package/{lib → dist/lib}/types/config/publicCache/PublicCacheRedisConfiguration.js +0 -0
  544. /package/{lib → dist/lib}/types/config/storageEngine/StorageEngineElasticsearchConfiguration.d.ts +0 -0
  545. /package/{lib → dist/lib}/types/config/storageEngine/StorageEngineElasticsearchConfiguration.js +0 -0
  546. /package/{lib/types → dist/lib/types/controllers}/Controller.js +0 -0
  547. /package/{lib/types → dist/lib/types/controllers}/ControllerDefinition.js +0 -0
  548. /package/{lib/types → dist/lib/types/controllers}/ControllerRights.d.ts +0 -0
  549. /package/{lib/types → dist/lib/types/controllers}/ControllerRights.js +0 -0
  550. /package/{lib → dist/lib}/types/errors/ErrorDefinition.d.ts +0 -0
  551. /package/{lib → dist/lib}/types/errors/ErrorDefinition.js +0 -0
  552. /package/{lib → dist/lib}/types/errors/ErrorDomains.d.ts +0 -0
  553. /package/{lib → dist/lib}/types/errors/ErrorDomains.js +0 -0
  554. /package/{lib → dist/lib}/types/events/EventGenericDocument.d.ts +0 -0
  555. /package/{lib → dist/lib}/types/events/EventGenericDocument.js +0 -0
  556. /package/{lib → dist/lib}/types/events/EventProtocol.d.ts +0 -0
  557. /package/{lib → dist/lib}/types/events/EventProtocol.js +0 -0
  558. /package/{lib → dist/lib}/types/realtime/RealtimeScope.d.ts +0 -0
  559. /package/{lib → dist/lib}/types/realtime/RealtimeScope.js +0 -0
  560. /package/{lib → dist/lib}/types/realtime/RealtimeUsers.d.ts +0 -0
  561. /package/{lib → dist/lib}/types/realtime/RealtimeUsers.js +0 -0
  562. /package/{lib → dist/lib}/types/realtime/RoomList.d.ts +0 -0
  563. /package/{lib → dist/lib}/types/realtime/RoomList.js +0 -0
  564. /package/{lib → dist/lib}/types/shared/StoreCollectionsDefinition.d.ts +0 -0
  565. /package/{lib → dist/lib}/types/shared/StoreCollectionsDefinition.js +0 -0
  566. /package/{lib → dist/lib}/types/storage/7/Elasticsearch.d.ts +0 -0
  567. /package/{lib → dist/lib}/types/storage/7/Elasticsearch.js +0 -0
  568. /package/{lib → dist/lib}/types/storage/8/Elasticsearch.d.ts +0 -0
  569. /package/{lib → dist/lib}/types/storage/8/Elasticsearch.js +0 -0
  570. /package/{lib → dist/lib}/util/Inflector.d.ts +0 -0
  571. /package/{lib → dist/lib}/util/Inflector.js +0 -0
  572. /package/{lib → dist/lib}/util/array.d.ts +0 -0
  573. /package/{lib → dist/lib}/util/array.js +0 -0
  574. /package/{lib → dist/lib}/util/async.d.ts +0 -0
  575. /package/{lib → dist/lib}/util/async.js +0 -0
  576. /package/{lib → dist/lib}/util/bufferedPassThrough.d.ts +0 -0
  577. /package/{lib → dist/lib}/util/bufferedPassThrough.js +0 -0
  578. /package/{lib → dist/lib}/util/crypto.d.ts +0 -0
  579. /package/{lib → dist/lib}/util/crypto.js +0 -0
  580. /package/{lib → dist/lib}/util/dump-collection.d.ts +0 -0
  581. /package/{lib → dist/lib}/util/dump-collection.js +0 -0
  582. /package/{lib → dist/lib}/util/esRequest.d.ts +0 -0
  583. /package/{lib → dist/lib}/util/esRequest.js +0 -0
  584. /package/{lib → dist/lib}/util/koncordeCompat.d.ts +0 -0
  585. /package/{lib → dist/lib}/util/koncordeCompat.js +0 -0
  586. /package/{lib → dist/lib}/util/mutex.d.ts +0 -0
  587. /package/{lib → dist/lib}/util/mutex.js +0 -0
  588. /package/{lib → dist/lib}/util/name-generator.d.ts +0 -0
  589. /package/{lib → dist/lib}/util/name-generator.js +0 -0
  590. /package/{lib → dist/lib}/util/time.d.ts +0 -0
  591. /package/{lib → dist/lib}/util/time.js +0 -0
@@ -1,1203 +0,0 @@
1
- /*
2
- * Kuzzle, a backend software, self-hostable and ready to use
3
- * to power modern apps
4
- *
5
- * Copyright 2015-2022 Kuzzle
6
- * mailto: support AT kuzzle.io
7
- * website: http://kuzzle.io
8
- *
9
- * Licensed under the Apache License, Version 2.0 (the "License");
10
- * you may not use this file except in compliance with the License.
11
- * You may obtain a copy of the License at
12
- *
13
- * https://www.apache.org/licenses/LICENSE-2.0
14
- *
15
- * Unless required by applicable law or agreed to in writing, software
16
- * distributed under the License is distributed on an "AS IS" BASIS,
17
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
- * See the License for the specific language governing permissions and
19
- * limitations under the License.
20
- */
21
-
22
- "use strict";
23
-
24
- const os = require("os");
25
- const net = require("net");
26
- const assert = require("assert");
27
-
28
- const Bluebird = require("bluebird");
29
- const EventEmitter = require("eventemitter3");
30
- const _ = require("lodash");
31
-
32
- const debug = require("../util/debug")("kuzzle:cluster:sync");
33
- const { Mutex } = require("../util/mutex");
34
- const { ClusterIdCardHandler } = require("./idCardHandler");
35
- const ClusterPublisher = require("./publisher");
36
- const ClusterSubscriber = require("./subscriber");
37
- const ClusterState = require("./state");
38
- const ClusterCommand = require("./command");
39
- const kuzzleStateEnum = require("../kuzzle/kuzzleStateEnum");
40
- const { fromKoncordeIndex } = require("../util/koncordeCompat");
41
-
42
- /**
43
- * Test an IP address and determine if it's in the public or private range.
44
- *
45
- * @param {String} ip
46
- * @return {Boolean}
47
- */
48
- function isPrivateIP(ip) {
49
- if (net.isIPv6(ip)) {
50
- const prefix = ip.split(":")[0];
51
-
52
- return (
53
- (prefix.startsWith("fd") && prefix.length === 4) || prefix === "fe80"
54
- );
55
- }
56
-
57
- // IPv4
58
- const exploded = ip.split(".").map((s) => Number.parseInt(s));
59
-
60
- return (
61
- exploded[0] === 10 ||
62
- (exploded[0] === 172 && exploded[1] >= 16 && exploded[1] <= 31) ||
63
- (exploded[0] === 192 && exploded[1] === 168)
64
- );
65
- }
66
-
67
- /**
68
- * Some IPv4 addresses are reserved for internal uses only, and cannot be
69
- * reached from other machines. We need to detect and filter them
70
- * @param {String} ip
71
- * @return {Boolean}
72
- */
73
- function isInternalIP(ip) {
74
- // To my knowledge, there aren't any reserved, non-loopback and non-routable
75
- // IPv6 addresses
76
- if (net.isIPv6(ip)) {
77
- return false;
78
- }
79
-
80
- const exploded = ip.split(".").map((s) => Number.parseInt(s));
81
-
82
- // 127.x.x: loopback addresses are already flagged as "internal" by
83
- // os.networkInterfaces.
84
- return (
85
- exploded[0] === 127 ||
86
- // 169.254.x.x addresses are APIPA addresses: temporary and non-routable.
87
- // We need to remove them from the accepted list of IP addresses
88
- // (this is a "just in case" scenario: APIPA addresses are obsolete and
89
- // should not be used anymore, but we never know...)
90
- (exploded[0] === 169 && exploded[1] === 254)
91
- );
92
- }
93
-
94
- /**
95
- * Return the first IP address matching the provided configuration
96
- * @param {Object} [options]
97
- * @param {String} [options.family] IP family (IPv4 or IPv6)
98
- * @param {String} [options.interface] Network interface/IP/MAC to use
99
- * @param {String} [options.ip] Used to target public or private addresses
100
- * @return {String|null}
101
- */
102
- function getIP({ family = "IPv4", interface: netInterface, ip } = {}) {
103
- const mustBePrivate = ip === "private";
104
-
105
- let interfaces = [];
106
-
107
- for (const [key, value] of Object.entries(os.networkInterfaces())) {
108
- for (const _interface of value) {
109
- interfaces.push({
110
- interface: key,
111
- ..._interface,
112
- });
113
- }
114
- }
115
-
116
- debug("Found interfaces %o", interfaces);
117
-
118
- interfaces = interfaces.filter((n) => {
119
- return (
120
- !n.internal &&
121
- !isInternalIP(n.address) &&
122
- n.family === family &&
123
- (!ip || mustBePrivate === isPrivateIP(n.address))
124
- );
125
- });
126
-
127
- debug("Filtered interfaces %o", interfaces);
128
-
129
- if (interfaces.length === 0) {
130
- return null;
131
- }
132
-
133
- // take the first IP from the list if no interface has been defined
134
- if (!netInterface) {
135
- return interfaces[0].address;
136
- }
137
-
138
- for (const i of interfaces) {
139
- if ([i.interface, i.address, i.mac].includes(netInterface)) {
140
- return i.address;
141
- }
142
- }
143
-
144
- return null;
145
- }
146
-
147
- /**
148
- * @typedef {nodeActivityEnum}
149
- */
150
- const nodeActivityEnum = Object.freeze({
151
- ADDED: 1,
152
- EVICTED: 2,
153
- });
154
-
155
- // Handles the node logic: discovery, eviction, heartbeat, ...
156
- // Dependencies: core:cache module must be started
157
- class ClusterNode {
158
- constructor() {
159
- this.config = global.kuzzle.config.cluster;
160
- this.logger = global.kuzzle.log.child("cluster:node");
161
- this.heartbeatDelay = this.config.heartbeat;
162
-
163
- const family = this.config.ipv6 ? "IPv6" : "IPv4";
164
-
165
- this.ip = getIP({
166
- family,
167
- interface: this.config.interface,
168
- ip: this.config.ip,
169
- });
170
-
171
- debug("Found IP address: %s with config %o", this.ip, this.config);
172
- assert(
173
- this.ip !== null,
174
- `[CLUSTER] No suitable IP address found with the provided configuration (family: ${family}, interface: ${this.config.interface}, ip: ${this.config.ip})`,
175
- );
176
-
177
- this.nodeId = null;
178
- this.heartbeatTimer = null;
179
-
180
- this.idCardHandler = new ClusterIdCardHandler(this);
181
- this.publisher = new ClusterPublisher(this);
182
- this.fullState = new ClusterState();
183
- this.command = new ClusterCommand(this);
184
- this.eventEmitter = new EventEmitter();
185
-
186
- /**
187
- * Links remote node IDs with their subscriber counterpart
188
- * @type {Map.<string, ClusterSubscriber>}
189
- */
190
- this.remoteNodes = new Map();
191
-
192
- /**
193
- * Cluster nodes activity, used to keep track of nodes being added or
194
- * removed, to give more insights to cluster statuses
195
- */
196
- this.activityMaxLength = this.config.activityDepth;
197
- this.activity = [];
198
- }
199
-
200
- get syncAddress() {
201
- return `tcp://${this.ip}:${this.config.ports.sync}`;
202
- }
203
-
204
- async init() {
205
- // The publisher needs to be created and initialized before the handshake:
206
- // other nodes we'll connect to during the handshake will start to subscribe
207
- // to this node right away
208
- await this.publisher.init();
209
-
210
- // This also needs to be started before the handshake, as this class handles
211
- // direct requests to other nodes (needed to request for the full state
212
- // and to introduce oneself to other nodes)
213
- await this.command.init();
214
-
215
- global.kuzzle.onPipe("kuzzle:shutdown", () => this.shutdown());
216
-
217
- await this.handshake();
218
-
219
- this.registerEvents();
220
- this.registerAskEvents();
221
-
222
- if (this.countActiveNodes() < this.config.minimumNodes) {
223
- this.logger.info(
224
- "[CLUSTER] Not enough nodes active. Waiting for other nodes to join the cluster...",
225
- );
226
-
227
- while (this.countActiveNodes() < this.config.minimumNodes) {
228
- await Bluebird.delay(100);
229
- }
230
- }
231
-
232
- return this.nodeId;
233
- }
234
-
235
- /**
236
- * Shutdown event: clears all timers, sends a termination status to other
237
- * nodes, and removes entries from the cache
238
- */
239
- async shutdown() {
240
- clearInterval(this.heartbeatTimer);
241
- await this.idCardHandler.dispose();
242
-
243
- for (const subscriber of this.remoteNodes.values()) {
244
- subscriber.dispose();
245
- }
246
-
247
- this.publisher.sendNodeShutdown(this.nodeId);
248
-
249
- await this.publisher.dispose();
250
- this.command.dispose();
251
- }
252
-
253
- /**
254
- * Notify other nodes to not evict this node
255
- *
256
- * @param {bool} evictionPrevented
257
- */
258
- preventEviction(evictionPrevented) {
259
- this.publisher.sendNodePreventEviction(evictionPrevented);
260
- // This node is subscribed to the other node and might not receive their heartbeat while debugging
261
- // so this node should not have the responsability of evicting others when his own eviction is prevented
262
- // when debugging.
263
- // Otherwise when recovering from a debug session, all the other nodes will be evicted.
264
- for (const subscriber of this.remoteNodes.values()) {
265
- subscriber.handleNodePreventEviction({
266
- evictionPrevented,
267
- });
268
- }
269
- }
270
-
271
- /**
272
- * Adds a new remote node, and subscribes to it.
273
- * @param {string} id - remote node ID
274
- * @param {string} ip - remote node IP address
275
- * @param {number} lastMessageId - remote node last message ID
276
- * @return {boolean} false if the node was already known, true otherwise
277
- */
278
- async addNode(id, ip, lastMessageId) {
279
- if (this.remoteNodes.has(id)) {
280
- return false;
281
- }
282
-
283
- const subscriber = new ClusterSubscriber(this, id, ip);
284
-
285
- this.remoteNodes.set(id, subscriber);
286
- await subscriber.init();
287
- await subscriber.sync(lastMessageId);
288
- await this.idCardHandler.addNode(id);
289
-
290
- this.logger.info(`[CLUSTER] Node "${id}" joined the cluster`);
291
- this.trackActivity(id, ip, nodeActivityEnum.ADDED);
292
-
293
- if (
294
- global.kuzzle.state === kuzzleStateEnum.NOT_ENOUGH_NODES &&
295
- this.countActiveNodes() >= this.config.minimumNodes
296
- ) {
297
- global.kuzzle.state = kuzzleStateEnum.RUNNING;
298
- this.logger.warn(
299
- `[CLUSTER] Minimum number of nodes reached (${this.countActiveNodes()}). This node is now accepting requests again.`,
300
- );
301
- }
302
-
303
- return true;
304
- }
305
-
306
- /**
307
- * Evicts this node from the cluster.
308
- *
309
- * @param {String} reason
310
- * @param {Error} [error]
311
- * @return {void}
312
- */
313
- async evictSelf(reason, error = null) {
314
- this.logger.error(`[CLUSTER] ${reason}`);
315
-
316
- if (error) {
317
- this.logger.error(error.stack);
318
- }
319
-
320
- this.publisher.sendNodeEvicted(this.nodeId, this.nodeId, reason);
321
- }
322
-
323
- /**
324
- * Evicts a remote from the list
325
- * @param {string} nodeId - remote node ID
326
- * @param {Object} [options]
327
- * @param {boolean} [options.broadcast] - broadcast the eviction to the cluster
328
- * @param {string} [options.reason] - reason of eviction
329
- */
330
- async evictNode(nodeId, { broadcast = false, reason = "" }) {
331
- const subscriber = this.remoteNodes.get(nodeId);
332
-
333
- if (!subscriber) {
334
- this.logger.warn(
335
- `[CLUSTER] Node "${nodeId}" with no subscriber evicted. Reason: ${reason}`,
336
- );
337
- return;
338
- }
339
-
340
- this.logger.warn(`[CLUSTER] Node "${nodeId}" evicted. Reason: ${reason}`);
341
-
342
- this.trackActivity(
343
- nodeId,
344
- subscriber.remoteNodeIP,
345
- nodeActivityEnum.EVICTED,
346
- reason,
347
- );
348
-
349
- await this.idCardHandler.removeNode(nodeId);
350
- this.remoteNodes.delete(nodeId);
351
- this.fullState.removeNode(nodeId);
352
- subscriber.dispose();
353
-
354
- if (broadcast) {
355
- this.publisher.sendNodeEvicted(this.nodeId, nodeId, reason);
356
- }
357
-
358
- if (this.countActiveNodes() < this.config.minimumNodes) {
359
- global.kuzzle.state = kuzzleStateEnum.NOT_ENOUGH_NODES;
360
- this.logger.warn(
361
- `[CLUSTER] Not enough nodes active (expected: ${
362
- this.config.minimumNodes
363
- }, active: ${this.countActiveNodes()}). Deactivating node until new ones are added.`,
364
- );
365
- }
366
- }
367
-
368
- /**
369
- * Verifies the consistency of the cluster by comparing our own known
370
- * topology with the one kept in other nodes ID cards
371
- *
372
- * /!\ Do not wait for this method: it's meant to run as a background check.
373
- * It'll never throw, and it'll never generate unhandled rejections.
374
- */
375
- async enforceClusterConsistency() {
376
- // Delay the check to 1 heartbeat round, to allow all nodes to update
377
- // their ID cards
378
- await Bluebird.delay(this.heartbeatDelay);
379
-
380
- try {
381
- const idCards = await this.idCardHandler.getRemoteIdCards();
382
- idCards.push(this.idCardHandler.idCard);
383
-
384
- let splits = [];
385
-
386
- for (const idCard of idCards) {
387
- let topology = Array.from(idCard.topology);
388
- topology.push(idCard.id);
389
-
390
- if (topology.length !== idCards.length) {
391
- topology = topology.sort();
392
- const found = splits.some((split) => {
393
- if (split.length !== topology.length) {
394
- return false;
395
- }
396
-
397
- return split.every((id, index) => id === topology[index]);
398
- });
399
-
400
- if (!found) {
401
- splits.push(topology);
402
- }
403
- }
404
- }
405
-
406
- // No split detected, the cluster is consistent
407
- if (splits.length === 0) {
408
- return;
409
- }
410
- // There is at least 1 cluster split detected.
411
- //
412
- // First we elect the smallest split possible.
413
- // If multiple splits are eligibles, we choose amongst them the split
414
- // containing the youngest isolated node (isolated = the node is in this
415
- // split alone, and in no other splits). If no split is eligible using
416
- // this method, we fall back to the smallest split containing the youngest
417
- // node (isolated or not).
418
- //
419
- // The goal of this process is to force at least 1 node to kill itself,
420
- // with all nodes concluding on their own on the same list of nodes to
421
- // shut down.
422
-
423
- // First remove every non existing node from topologies
424
- splits = splits.map((topology) =>
425
- topology.filter((nodeId) => idCards.find((card) => card.id === nodeId)),
426
- );
427
-
428
- splits = splits.sort((a, b) => a.length - b.length);
429
- const eligibleSplits = splits.filter(
430
- (split) => split.length === splits[0].length,
431
- );
432
-
433
- let candidates;
434
-
435
- if (eligibleSplits.length === 1) {
436
- candidates = eligibleSplits[0];
437
- } else {
438
- // Beware: search isolated nodes in ALL the splits, not only the
439
- // smallest ones
440
- let isolatedNodes = _.xor(...splits);
441
- const eligibleNodes = _.uniq(_.flatten(eligibleSplits));
442
-
443
- isolatedNodes = _.intersection(isolatedNodes, eligibleNodes);
444
-
445
- const isIsolated = isolatedNodes.length > 0;
446
-
447
- // safety measure: this should never happen
448
- if (isolatedNodes.length === 0) {
449
- isolatedNodes = eligibleNodes;
450
- }
451
-
452
- let youngestNode;
453
-
454
- for (let i = 0; i < isolatedNodes.length; i++) {
455
- const idCard = idCards.find((card) => card.id === isolatedNodes[i]);
456
- if (!youngestNode || idCard.birthdate > youngestNode.birthdate) {
457
- youngestNode = idCard;
458
- }
459
- }
460
-
461
- if (isIsolated) {
462
- for (let i = 0; !candidates && i < eligibleSplits.length; i++) {
463
- if (eligibleSplits[i].includes(youngestNode.id)) {
464
- candidates = _.intersection(eligibleSplits[i], isolatedNodes);
465
- }
466
- }
467
- } else {
468
- candidates = [youngestNode.id];
469
- }
470
- }
471
-
472
- if (candidates.includes(this.nodeId)) {
473
- this.logger.error(
474
- "[CLUSTER] Network split detected. This node is outside the cluster: shutting down.",
475
- );
476
- global.kuzzle.shutdown();
477
- return;
478
- }
479
- } catch (err) {
480
- this.logger.error(
481
- "[CLUSTER] Unexpected exception caught during a cluster consistency check. Shutting down...",
482
- );
483
- this.logger.error(err.stack);
484
- global.kuzzle.shutdown();
485
- }
486
- }
487
-
488
- /**
489
- * Discovers other active nodes from the cluster and, if other nodes exist,
490
- * starts a handshake procedure to sync this node and to make it able to
491
- * handle new client requests
492
- *
493
- * @return {void}
494
- */
495
- async handshake() {
496
- const handshakeTimeout = setTimeout(() => {
497
- this.logger.error(
498
- `[CLUSTER] Failed to join the cluster: timed out (joinTimeout: ${this.config.joinTimeout}ms)`,
499
- );
500
- global.kuzzle.shutdown();
501
- }, this.config.joinTimeout);
502
-
503
- const mutex = new Mutex("clusterHandshake", {
504
- timeout: this.config.joinTimeout,
505
- });
506
-
507
- try {
508
- await mutex.lock();
509
-
510
- // Create the ID Key AFTER the handshake mutex is actually locked,
511
- // to prevent race conditions (other nodes attempting to connect to this
512
- // node while it's still initializing)
513
- await this.idCardHandler.createIdCard();
514
- debug("[CLUSTER] ID Card created");
515
-
516
- this.nodeId = this.idCardHandler.nodeId;
517
-
518
- await this.startHeartbeat();
519
- debug("[CLUSTER] Start heartbeat");
520
-
521
- let retried = false;
522
- let fullState = null;
523
- let nodes;
524
-
525
- debug("[CLUSTER] Start retrieving full state..");
526
- do {
527
- nodes = await this.idCardHandler.getRemoteIdCards();
528
- debug("[CLUSTER] %s remote nodes discovered", nodes.length);
529
-
530
- // No other nodes detected = no handshake required
531
- if (nodes.length === 0) {
532
- this.trackActivity(this.nodeId, this.ip, nodeActivityEnum.ADDED);
533
- return;
534
- }
535
-
536
- // Verify that no other node share the same IP address as this one
537
- const duplicate = nodes.filter((node) => node.ip === this.ip);
538
-
539
- if (duplicate.length > 0) {
540
- this.logger.error(
541
- `[CLUSTER] Another node share the same IP address as this one (${this.ip}): ${duplicate[0].id}. Shutting down.`,
542
- );
543
- global.kuzzle.shutdown();
544
- return;
545
- }
546
-
547
- // Subscribe to remote nodes and start buffering sync messages
548
- await Bluebird.map(nodes, ({ id, ip }) => {
549
- const subscriber = new ClusterSubscriber(this, id, ip);
550
- this.remoteNodes.set(id, subscriber);
551
- return subscriber.init();
552
- });
553
- debug("[CLUSTER] Successfully subscribed to nodes");
554
-
555
- fullState = await this.command.getFullState(nodes);
556
-
557
- // Uh oh... no node was able to give us the full state.
558
- // We must retry later, to check if the redis keys have expired. If they
559
- // are still there and we still aren't able to fetch a full state, this
560
- // means we're probably facing a network split, and we must then shut
561
- // down.
562
- if (fullState === null) {
563
- if (retried) {
564
- this.logger.error(
565
- "[CLUSTER] Could not connect to discovered cluster nodes (network split detected). Shutting down.",
566
- );
567
- global.kuzzle.shutdown();
568
- return;
569
- }
570
-
571
- // Disposes all subscribers
572
- for (const subscriber of this.remoteNodes.values()) {
573
- subscriber.dispose();
574
- }
575
- this.remoteNodes.clear();
576
-
577
- // Waits for a redis heartbeat round
578
- retried = true;
579
- const retryDelay = this.heartbeatDelay * 1.5;
580
- this.logger.warn(
581
- `[CLUSTER] Unable to connect to discovered cluster nodes. Retrying in ${retryDelay}ms...`,
582
- );
583
- await Bluebird.delay(retryDelay);
584
- }
585
- } while (fullState === null);
586
- debug("[CLUSTER] Fullstate retrieved, loading into node..");
587
-
588
- await this.fullState.loadFullState(fullState);
589
- this.activity = fullState.activity ? fullState.activity : this.activity;
590
-
591
- debug("[CLUSTER] Fullstate loaded.");
592
-
593
- const handshakeResponses = await this.command.broadcastHandshake(nodes);
594
-
595
- debug("[CLUSTER] Successful handshakes with other nodes.");
596
-
597
- // Update subscribers: start synchronizing, or unsubscribes from nodes who
598
- // didn't respond
599
- for (const [nodeId, handshakeData] of Object.entries(
600
- handshakeResponses,
601
- )) {
602
- const subscriber = this.remoteNodes.get(nodeId);
603
- if (handshakeData === null) {
604
- subscriber.dispose();
605
- this.remoteNodes.delete(nodeId);
606
- } else {
607
- await this.idCardHandler.addNode(nodeId);
608
- const nodesStates = fullState.nodesState || [];
609
- const nodeStatus = nodesStates.find((node) => node.id === nodeId);
610
- subscriber.sync(
611
- nodeStatus ? nodeStatus.lastMessageId : handshakeData.lastMessageId,
612
- );
613
- this.logger.info(
614
- `[CLUSTER] Successfully completed the handshake with node ${nodeId}`,
615
- );
616
- }
617
- }
618
-
619
- this.logger.info("[CLUSTER] Successfully joined the cluster.");
620
- this.trackActivity(this.nodeId, this.ip, nodeActivityEnum.ADDED);
621
- } finally {
622
- clearTimeout(handshakeTimeout);
623
- await mutex.unlock();
624
- }
625
- }
626
-
627
- countActiveNodes() {
628
- return this.remoteNodes.size + 1;
629
- }
630
-
631
- startHeartbeat() {
632
- this.heartbeatTimer = setInterval(() => {
633
- this.publisher.sendHeartbeat(this.syncAddress);
634
- }, this.heartbeatDelay);
635
- }
636
-
637
- /**
638
- * Cluster activity tracking
639
- *
640
- * @param {string} id
641
- * @param {string} ip
642
- * @param {nodeActivityEnum} event
643
- * @param {string} [reason]
644
- */
645
- trackActivity(id, ip, event, reason) {
646
- if (this.activity.length > this.activityMaxLength) {
647
- this.activity.shift();
648
- }
649
-
650
- this.activity.push({
651
- address: ip,
652
- date: new Date().toISOString(),
653
- event,
654
- id,
655
- reason,
656
- });
657
- }
658
-
659
- /**
660
- * Returns the full status of the cluster
661
- * @return {Object}
662
- */
663
- async getStatus() {
664
- const status = {
665
- activeNodes: 0,
666
- activity: this.activity.map(({ address, date, event, id, reason }) => ({
667
- address,
668
- date,
669
- event: event === nodeActivityEnum.ADDED ? "joined" : "evicted",
670
- id,
671
- reason,
672
- })),
673
- nodes: [],
674
- };
675
- const idCards = await this.idCardHandler.getRemoteIdCards();
676
- idCards.push(this.idCardHandler.idCard);
677
-
678
- for (const idCard of idCards) {
679
- status.nodes.push({
680
- address: idCard.ip,
681
- birthdate: new Date(idCard.birthdate).toISOString(),
682
- id: idCard.id,
683
- });
684
- }
685
-
686
- status.activeNodes = status.nodes.length;
687
-
688
- return status;
689
- }
690
-
691
- /**
692
- * Registers ask events
693
- */
694
- registerAskEvents() {
695
- global.kuzzle.onAsk("cluster:node:preventEviction", (state) => {
696
- this.preventEviction(state);
697
- });
698
-
699
- /**
700
- * Removes a room from the full state, and only for this node.
701
- * Removes the room from Koncorde if, and only if, no other node uses it.
702
- *
703
- * @param {string} roomId
704
- * @return {void}
705
- */
706
- global.kuzzle.onAsk("cluster:realtime:room:remove", (roomId) =>
707
- this.removeRealtimeRoom(roomId),
708
- );
709
-
710
- /**
711
- * Returns the total number of subscribers on all nodes for the provided
712
- * room
713
- *
714
- * @param {string} roomId
715
- * @returns {Number}
716
- */
717
- global.kuzzle.onAsk("cluster:realtime:room:count", (roomId) =>
718
- this.countRealtimeSubscribers(roomId),
719
- );
720
-
721
- /**
722
- * Returns the list of existing rooms in the cluster
723
- *
724
- * @returns {Object}
725
- */
726
- global.kuzzle.onAsk("cluster:realtime:room:list", () =>
727
- this.fullState.listRealtimeRooms(),
728
- );
729
-
730
- /**
731
- * Returns the requested room. Used to create a room on the fly on this node
732
- * if it exists only on remote nodes (e.g. for the realtime:join API action)
733
- *
734
- * @param {string} roomId
735
- * @returns {NormalizedFilter}
736
- */
737
- global.kuzzle.onAsk("cluster:realtime:filters:get", (roomId) =>
738
- this.fullState.getNormalizedFilters(roomId),
739
- );
740
-
741
- /**
742
- * Broadcasts an event to other nodes
743
- *
744
- * @param {string} event name
745
- * @param {Object} payload - event payload
746
- */
747
- global.kuzzle.onAsk("cluster:event:broadcast", (event, payload) =>
748
- this.broadcast(event, payload),
749
- );
750
-
751
- /**
752
- * Listens to a cluster-wide event
753
- *
754
- * @param {string} event name
755
- * @param {Function} fn - event listener
756
- */
757
- global.kuzzle.onAsk("cluster:event:on", (event, fn) =>
758
- this.eventEmitter.on(event, fn),
759
- );
760
-
761
- /**
762
- * Listens to a cluster-wide event once.
763
- *
764
- * @param {string} event name
765
- * @param {Function} fn - event listener
766
- */
767
- global.kuzzle.onAsk("cluster:event:once", (event, fn) =>
768
- this.eventEmitter.once(event, fn),
769
- );
770
-
771
- /**
772
- * Removes a listener from an event
773
- *
774
- * @param {string} event name
775
- * @param {Function} fn - event listener
776
- */
777
- global.kuzzle.onAsk("cluster:event:off", (event, fn) =>
778
- this.eventEmitter.removeListener(event, fn),
779
- );
780
-
781
- /**
782
- * Removes all listeners from an event
783
- *
784
- * @param {string} event name
785
- */
786
- global.kuzzle.onAsk("cluster:event:removeAllListeners", (event) =>
787
- this.eventEmitter.removeAllListeners(event),
788
- );
789
-
790
- /**
791
- * Returns the full status of the cluster
792
- */
793
- global.kuzzle.onAsk("cluster:status:get", () => this.getStatus());
794
- }
795
-
796
- /**
797
- * Starts listening to events to trigger sync messages on state changes.
798
- *
799
- * @return {void}
800
- */
801
- registerEvents() {
802
- global.kuzzle.on("admin:afterRefreshIndexCache", () =>
803
- this.onIndexCacheRefreshed(),
804
- );
805
-
806
- global.kuzzle.onCall("core:realtime:room:create:after", (payload) =>
807
- this.onNewRealtimeRoom(payload),
808
- );
809
-
810
- global.kuzzle.onCall("core:realtime:subscribe:after", (roomId) =>
811
- this.onNewSubscription(roomId),
812
- );
813
-
814
- global.kuzzle.onCall("core:realtime:unsubscribe:after", (roomId) =>
815
- this.onUnsubscription(roomId),
816
- );
817
-
818
- global.kuzzle.on("core:notify:document", ({ notification, rooms }) => {
819
- this.onDocumentNotification(rooms, notification);
820
- });
821
-
822
- global.kuzzle.on("core:notify:user", ({ notification, room }) =>
823
- this.onUserNotification(room, notification),
824
- );
825
-
826
- global.kuzzle.on(
827
- "core:auth:strategyAdded",
828
- ({ name, pluginName, strategy }) => {
829
- this.onAuthStrategyAdded(name, pluginName, strategy);
830
- },
831
- );
832
-
833
- global.kuzzle.on("core:auth:strategyRemoved", ({ name, pluginName }) =>
834
- this.onAuthStrategyRemoved(name, pluginName),
835
- );
836
-
837
- global.kuzzle.on("admin:afterDump", (request) => {
838
- const suffix = request.getString("suffix", "manual-api-action");
839
-
840
- return this.onDumpRequest(suffix);
841
- });
842
-
843
- global.kuzzle.on("admin:afterResetSecurity", () => this.onSecurityReset());
844
-
845
- global.kuzzle.on("admin:afterShutdown", () => this.onShutdown());
846
-
847
- global.kuzzle.on("collection:afterDeleteSpecifications", () =>
848
- this.onValidatorsChanged(),
849
- );
850
-
851
- global.kuzzle.on("collection:afterUpdateSpecifications", () =>
852
- this.onValidatorsChanged(),
853
- );
854
-
855
- // Profile change events
856
- global.kuzzle.on("core:security:profile:create", ({ args: [profileId] }) =>
857
- this.onProfileChanged(profileId),
858
- );
859
-
860
- global.kuzzle.on(
861
- "core:security:profile:createOrReplace",
862
- ({ args: [profileId] }) => this.onProfileChanged(profileId),
863
- );
864
-
865
- global.kuzzle.on("core:security:profile:update", ({ args: [profileId] }) =>
866
- this.onProfileChanged(profileId),
867
- );
868
-
869
- global.kuzzle.on("core:security:profile:delete", ({ args: [profileId] }) =>
870
- this.onProfileChanged(profileId),
871
- );
872
-
873
- // Role change events
874
- global.kuzzle.on("core:security:role:create", ({ args: [roleId] }) =>
875
- this.onRoleChanged(roleId),
876
- );
877
-
878
- global.kuzzle.on(
879
- "core:security:role:createOrReplace",
880
- ({ args: [roleId] }) => this.onRoleChanged(roleId),
881
- );
882
-
883
- global.kuzzle.on("core:security:role:update", ({ args: [roleId] }) =>
884
- this.onRoleChanged(roleId),
885
- );
886
-
887
- global.kuzzle.on("core:security:role:delete", ({ args: [roleId] }) =>
888
- this.onRoleChanged(roleId),
889
- );
890
-
891
- // Index cache change events
892
- global.kuzzle.on("core:storage:index:create:after", ({ index, scope }) =>
893
- this.onIndexAdded(scope, index),
894
- );
895
-
896
- global.kuzzle.on("core:storage:index:delete:after", ({ index, scope }) =>
897
- this.onIndexesRemoved(scope, [index]),
898
- );
899
-
900
- global.kuzzle.on("core:storage:index:mDelete:after", ({ indexes, scope }) =>
901
- this.onIndexesRemoved(scope, indexes),
902
- );
903
-
904
- global.kuzzle.on(
905
- "core:storage:collection:create:after",
906
- ({ collection, index, scope }) => {
907
- this.onCollectionAdded(scope, index, collection);
908
- },
909
- );
910
-
911
- global.kuzzle.on(
912
- "core:storage:collection:delete:after",
913
- ({ collection, index, scope }) => {
914
- this.onCollectionRemoved(scope, index, collection);
915
- },
916
- );
917
- }
918
-
919
- /**
920
- * Triggered whenever a realtime room is created on this node
921
- *
922
- * @param {NormalizedFilter} payload
923
- * @return {void}
924
- */
925
- onNewRealtimeRoom(payload) {
926
- const roomMessageId = this.publisher.sendNewRealtimeRoom(payload);
927
-
928
- debug(
929
- "[%s] Broadcasting new realtime room %s (message: %d)",
930
- this.nodeId,
931
- payload.id,
932
- roomMessageId,
933
- );
934
-
935
- const icpair = fromKoncordeIndex(payload.index);
936
-
937
- this.fullState.addRealtimeRoom(
938
- payload.id,
939
- icpair.index,
940
- icpair.collection,
941
- payload.filter,
942
- {
943
- messageId: roomMessageId,
944
- nodeId: this.nodeId,
945
- subscribers: 0,
946
- },
947
- );
948
- }
949
-
950
- /**
951
- * Triggered on a new realtime subscription
952
- *
953
- * @param {string} roomId
954
- * @return {void}
955
- */
956
- onNewSubscription(roomId) {
957
- const subMessageId = this.publisher.sendSubscription(roomId);
958
-
959
- debug(
960
- "[%s] Broadcasting new realtime subscription on room %s (message: %d)",
961
- this.nodeId,
962
- roomId,
963
- subMessageId,
964
- );
965
-
966
- this.fullState.addRealtimeSubscription(roomId, this.nodeId, subMessageId);
967
- }
968
-
969
- /**
970
- * Triggered when a realtime room is removed from this node.
971
- *
972
- * @param {string} roomId
973
- * @return {void}
974
- */
975
- removeRealtimeRoom(roomId) {
976
- const messageId = this.publisher.sendRemoveRealtimeRoom(roomId);
977
-
978
- debug(
979
- "[%s] Broadcasted the removal of room %s (message: %d)",
980
- this.nodeId,
981
- roomId,
982
- messageId,
983
- );
984
-
985
- this.fullState.removeRealtimeRoom(roomId, this.nodeId);
986
- }
987
-
988
- /**
989
- * Broadcasts an event to other nodes
990
- *
991
- * @param {string} event name
992
- * @param {Object} payload - event payload
993
- */
994
- broadcast(event, payload) {
995
- const messageId = this.publisher.sendClusterWideEvent(event, payload);
996
-
997
- debug(
998
- '[%s] Emitted cluster-wide event "%s" (message: %d)',
999
- this.nodeId,
1000
- event,
1001
- messageId,
1002
- );
1003
- }
1004
-
1005
- /**
1006
- * Triggered when a user unsubscribes from a room
1007
- *
1008
- * @param {string} roomId
1009
- * @return {void}
1010
- */
1011
- onUnsubscription(roomId) {
1012
- const messageId = this.publisher.sendUnsubscription(roomId);
1013
-
1014
- debug(
1015
- "[%s] Broadcasting realtime unsubscription on room %s (message: %d)",
1016
- this.nodeId,
1017
- roomId,
1018
- messageId,
1019
- );
1020
-
1021
- this.fullState.removeRealtimeSubscription(roomId, this.nodeId, messageId);
1022
- }
1023
-
1024
- /**
1025
- * Triggered when a document notification must be propagated
1026
- *
1027
- * @param {Array.<string>} rooms - list of rooms to notify
1028
- * @param {DocumentNotification} notification
1029
- * @return {void}
1030
- */
1031
- onDocumentNotification(rooms, notification) {
1032
- this.publisher.sendDocumentNotification(rooms, notification);
1033
- }
1034
-
1035
- /**
1036
- * Triggered when a user notification must be propagated
1037
- *
1038
- * @param {string} room
1039
- * @param {UserNotification} notification
1040
- * @return {void}
1041
- */
1042
- onUserNotification(room, notification) {
1043
- this.publisher.sendUserNotification(room, notification);
1044
- }
1045
-
1046
- /**
1047
- * Triggered when a new authentication strategy has been dynamically added
1048
- *
1049
- * @param {string} strategyName
1050
- * @param {string} pluginName
1051
- * @param {Object} strategyObject
1052
- * @return {void}
1053
- */
1054
- onAuthStrategyAdded(strategyName, pluginName, strategyObject) {
1055
- this.publisher.sendNewAuthStrategy(
1056
- strategyName,
1057
- pluginName,
1058
- strategyObject,
1059
- );
1060
-
1061
- this.fullState.addAuthStrategy({
1062
- pluginName,
1063
- strategy: strategyObject,
1064
- strategyName,
1065
- });
1066
- }
1067
-
1068
- /**
1069
- * Triggered when an authentication strategy has been dynamically removed
1070
- *
1071
- * @param {string} strategyName
1072
- * @param {string} pluginName
1073
- * @return {void}
1074
- */
1075
- onAuthStrategyRemoved(strategyName, pluginName) {
1076
- this.publisher.sendRemoveAuthStrategy(strategyName, pluginName);
1077
-
1078
- this.fullState.removeAuthStrategy(strategyName);
1079
- }
1080
-
1081
- /**
1082
- * Triggered when a dump has been requested
1083
- *
1084
- * @param {string} suffix
1085
- * @return {void}
1086
- */
1087
- onDumpRequest(suffix) {
1088
- this.publisher.sendDumpRequest(suffix);
1089
- }
1090
-
1091
- /**
1092
- * Triggered when security rights have been reset
1093
- *
1094
- * @return {void}
1095
- */
1096
- onSecurityReset() {
1097
- this.publisher.send("ResetSecurity", {});
1098
- }
1099
-
1100
- /**
1101
- * Triggered when a document validator has changed
1102
- *
1103
- * @return {void}
1104
- */
1105
- onValidatorsChanged() {
1106
- this.publisher.send("RefreshValidators", {});
1107
- }
1108
-
1109
- /**
1110
- * Triggered when a profile has changed
1111
- *
1112
- * @param {string} profileId
1113
- * @return {void}
1114
- */
1115
- onProfileChanged(profileId) {
1116
- this.publisher.send("InvalidateProfile", { profileId });
1117
- }
1118
-
1119
- /**
1120
- * Triggered when a role has changed
1121
- *
1122
- * @param {string} roleId
1123
- * @return {void}
1124
- */
1125
- onRoleChanged(roleId) {
1126
- this.publisher.send("InvalidateRole", { roleId });
1127
- }
1128
-
1129
- /**
1130
- * Triggered when an index has been added to the index cache
1131
- *
1132
- * @param {storeScopeEnum} scope
1133
- * @param {string} index
1134
- * @return {void}
1135
- */
1136
- onIndexAdded(scope, index) {
1137
- this.publisher.sendAddIndex(scope, index);
1138
- }
1139
-
1140
- /**
1141
- * Triggered when a collection has been added to the index cache
1142
- *
1143
- * @param {storeScopeEnum} scope
1144
- * @param {string} index
1145
- * @param {string} collection
1146
- * @return {void}
1147
- */
1148
- onCollectionAdded(scope, index, collection) {
1149
- this.publisher.sendAddCollection(scope, index, collection);
1150
- }
1151
-
1152
- /**
1153
- * Triggered when index have been removed from the index cache
1154
- *
1155
- * @param {storeScopeEnum} scope
1156
- * @param {Array.<string>} indexes
1157
- * @return {void}
1158
- */
1159
- onIndexesRemoved(scope, indexes) {
1160
- this.publisher.sendRemoveIndexes(scope, indexes);
1161
- }
1162
-
1163
- /**
1164
- * Triggered when a collection has been removed from the index cache
1165
- *
1166
- * @param {storeScopeEnum} scope
1167
- * @param {string} index
1168
- * @param {string} collection
1169
- * @return {void}
1170
- */
1171
- onCollectionRemoved(scope, index, collection) {
1172
- this.publisher.sendRemoveCollection(scope, index, collection);
1173
- }
1174
-
1175
- /**
1176
- * Triggered when a cluster-wide shutdown has been initiated
1177
- *
1178
- * @return {void}
1179
- */
1180
- onShutdown() {
1181
- this.publisher.send("Shutdown", {});
1182
- }
1183
-
1184
- /**
1185
- * Triggered when the index cache has been manually refreshed
1186
- */
1187
- onIndexCacheRefreshed() {
1188
- this.publisher.send("RefreshIndexCache", {});
1189
- }
1190
-
1191
- /**
1192
- * Returns the total number of subscribers on the cluster for the provided
1193
- * room
1194
- *
1195
- * @param {string} roomId
1196
- * @return {void}
1197
- */
1198
- async countRealtimeSubscribers(roomId) {
1199
- return this.fullState.countRealtimeSubscriptions(roomId);
1200
- }
1201
- }
1202
-
1203
- module.exports = ClusterNode;