kuzzle 2.56.0 → 2.57.0-beta.2

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 (408) hide show
  1. package/dist/bin/copy-binaries.js +71 -4
  2. package/dist/bin/start-kuzzle-server +191 -97
  3. package/dist/index.d.ts +31 -1
  4. package/dist/index.js +45 -2
  5. package/dist/lib/api/controllers/adminController.d.ts +4 -3
  6. package/dist/lib/api/controllers/adminController.js +1 -2
  7. package/dist/lib/api/controllers/authController.d.ts +37 -16
  8. package/dist/lib/api/controllers/authController.js +88 -39
  9. package/dist/lib/api/controllers/baseController.d.ts +10 -5
  10. package/dist/lib/api/controllers/baseController.js +36 -15
  11. package/dist/lib/api/controllers/bulkController.d.ts +11 -7
  12. package/dist/lib/api/controllers/bulkController.js +28 -5
  13. package/dist/lib/api/controllers/clusterController.d.ts +2 -2
  14. package/dist/lib/api/controllers/clusterController.js +3 -3
  15. package/dist/lib/api/controllers/collectionController.d.ts +57 -21
  16. package/dist/lib/api/controllers/collectionController.js +40 -11
  17. package/dist/lib/api/controllers/debugController.d.ts +1 -1
  18. package/dist/lib/api/controllers/documentController.d.ts +137 -28
  19. package/dist/lib/api/controllers/documentController.js +156 -125
  20. package/dist/lib/api/controllers/index.d.ts +27 -12
  21. package/dist/lib/api/controllers/index.js +28 -13
  22. package/dist/lib/api/controllers/indexController.d.ts +17 -10
  23. package/dist/lib/api/controllers/indexController.js +13 -11
  24. package/dist/lib/api/controllers/memoryStorageController.d.ts +2 -5
  25. package/dist/lib/api/controllers/memoryStorageController.js +199 -127
  26. package/dist/lib/api/controllers/realtimeController.d.ts +19 -9
  27. package/dist/lib/api/controllers/realtimeController.js +8 -4
  28. package/dist/lib/api/controllers/securityController.d.ts +42 -29
  29. package/dist/lib/api/controllers/securityController.js +35 -19
  30. package/dist/lib/api/controllers/serverController.d.ts +114 -19
  31. package/dist/lib/api/controllers/serverController.js +69 -29
  32. package/dist/lib/api/documentExtractor.d.ts +9 -7
  33. package/dist/lib/api/documentExtractor.js +105 -41
  34. package/dist/lib/api/funnel.d.ts +131 -29
  35. package/dist/lib/api/funnel.js +436 -225
  36. package/dist/lib/api/httpRoutes.d.ts +16 -11
  37. package/dist/lib/api/httpRoutes.js +272 -2
  38. package/dist/lib/api/openapi/OpenApiManager.d.ts +1 -1
  39. package/dist/lib/api/openapi/openApiGenerator.d.ts +1 -1
  40. package/dist/lib/api/rateLimiter.d.ts +15 -5
  41. package/dist/lib/api/rateLimiter.js +42 -14
  42. package/dist/lib/api/request/kuzzleRequest.d.ts +83 -12
  43. package/dist/lib/api/request/kuzzleRequest.js +88 -23
  44. package/dist/lib/api/request/requestContext.d.ts +20 -5
  45. package/dist/lib/api/request/requestContext.js +14 -4
  46. package/dist/lib/api/request/requestInput.d.ts +37 -6
  47. package/dist/lib/api/request/requestInput.js +22 -9
  48. package/dist/lib/api/request/requestResponse.d.ts +45 -9
  49. package/dist/lib/api/request/requestResponse.js +34 -3
  50. package/dist/lib/cluster/command.d.ts +131 -37
  51. package/dist/lib/cluster/command.js +243 -71
  52. package/dist/lib/cluster/idCardHandler.d.ts +18 -5
  53. package/dist/lib/cluster/idCardHandler.js +52 -19
  54. package/dist/lib/cluster/index.d.ts +8 -2
  55. package/dist/lib/cluster/index.js +6 -2
  56. package/dist/lib/cluster/node.d.ts +127 -49
  57. package/dist/lib/cluster/node.js +412 -179
  58. package/dist/lib/cluster/protobuf/command.proto +18 -0
  59. package/dist/lib/cluster/protobuf/commandMessages.d.ts +104 -0
  60. package/dist/lib/cluster/protobuf/commandMessages.js +30 -0
  61. package/dist/lib/cluster/protobuf/syncMessages.d.ts +184 -0
  62. package/dist/lib/cluster/protobuf/syncMessages.js +23 -0
  63. package/dist/lib/cluster/publisher.d.ts +118 -78
  64. package/dist/lib/cluster/publisher.js +174 -72
  65. package/dist/lib/cluster/state.d.ts +15 -9
  66. package/dist/lib/cluster/state.js +12 -8
  67. package/dist/lib/cluster/subscriber.d.ts +185 -131
  68. package/dist/lib/cluster/subscriber.js +357 -95
  69. package/dist/lib/cluster/workers/IDCardRenewer.d.ts +39 -8
  70. package/dist/lib/cluster/workers/IDCardRenewer.js +88 -23
  71. package/dist/lib/config/default.config.d.ts +2 -2
  72. package/dist/lib/config/default.config.js +10 -3
  73. package/dist/lib/config/documentEventAliases.d.ts +1 -1
  74. package/dist/lib/config/index.d.ts +2 -5
  75. package/dist/lib/config/index.js +30 -17
  76. package/dist/lib/core/auth/formatProcessing.d.ts +3 -3
  77. package/dist/lib/core/auth/passportResponse.d.ts +1 -1
  78. package/dist/lib/core/auth/passportWrapper.d.ts +1 -1
  79. package/dist/lib/core/auth/passportWrapper.js +14 -13
  80. package/dist/lib/core/auth/tokenManager.d.ts +24 -3
  81. package/dist/lib/core/auth/tokenManager.js +47 -19
  82. package/dist/lib/core/backend/applicationManager.d.ts +2 -2
  83. package/dist/lib/core/backend/backend.d.ts +16 -5
  84. package/dist/lib/core/backend/backend.js +14 -6
  85. package/dist/lib/core/backend/backendCluster.d.ts +1 -1
  86. package/dist/lib/core/backend/backendConfig.d.ts +17 -5
  87. package/dist/lib/core/backend/backendConfig.js +1 -0
  88. package/dist/lib/core/backend/backendController.d.ts +1 -1
  89. package/dist/lib/core/backend/backendController.js +8 -1
  90. package/dist/lib/core/backend/backendErrors.d.ts +15 -8
  91. package/dist/lib/core/backend/backendErrors.js +5 -0
  92. package/dist/lib/core/backend/backendHook.d.ts +1 -1
  93. package/dist/lib/core/backend/backendImport.d.ts +1 -1
  94. package/dist/lib/core/backend/backendOpenApi.d.ts +3 -2
  95. package/dist/lib/core/backend/backendPipe.d.ts +1 -1
  96. package/dist/lib/core/backend/backendPipe.js +9 -1
  97. package/dist/lib/core/backend/backendPlugin.d.ts +2 -2
  98. package/dist/lib/core/backend/backendSubscription.d.ts +2 -2
  99. package/dist/lib/core/backend/backendVault.d.ts +1 -1
  100. package/dist/lib/core/backend/backendVault.js +8 -1
  101. package/dist/lib/core/cache/cacheEngine.d.ts +7 -4
  102. package/dist/lib/core/cache/cacheEngine.js +25 -8
  103. package/dist/lib/core/debug/kuzzleDebugger.d.ts +2 -1
  104. package/dist/lib/core/debug/kuzzleDebugger.js +31 -17
  105. package/dist/lib/core/network/accessLogger.d.ts +33 -18
  106. package/dist/lib/core/network/accessLogger.js +135 -73
  107. package/dist/lib/core/network/clientConnection.d.ts +13 -11
  108. package/dist/lib/core/network/clientConnection.js +33 -9
  109. package/dist/lib/core/network/context.d.ts +17 -22
  110. package/dist/lib/core/network/context.js +43 -26
  111. package/dist/lib/core/network/entryPoint.d.ts +38 -16
  112. package/dist/lib/core/network/entryPoint.js +119 -48
  113. package/dist/lib/core/network/httpRouter/index.d.ts +20 -50
  114. package/dist/lib/core/network/httpRouter/index.js +61 -75
  115. package/dist/lib/core/network/httpRouter/routeHandler.d.ts +17 -32
  116. package/dist/lib/core/network/httpRouter/routeHandler.js +26 -36
  117. package/dist/lib/core/network/httpRouter/routePart.d.ts +9 -18
  118. package/dist/lib/core/network/httpRouter/routePart.js +61 -43
  119. package/dist/lib/core/network/httpRouter/routeTypes.d.ts +3 -0
  120. package/dist/lib/core/network/httpRouter/routeTypes.js +23 -0
  121. package/dist/lib/core/network/networkEntryPoint.d.ts +20 -0
  122. package/dist/lib/core/network/networkEntryPoint.js +23 -0
  123. package/dist/lib/core/network/protocolManifest.d.ts +5 -4
  124. package/dist/lib/core/network/protocolManifest.js +6 -3
  125. package/dist/lib/core/network/protocols/httpMessage.d.ts +25 -18
  126. package/dist/lib/core/network/protocols/httpMessage.js +14 -11
  127. package/dist/lib/core/network/protocols/httpwsProtocol.d.ts +84 -93
  128. package/dist/lib/core/network/protocols/httpwsProtocol.js +284 -129
  129. package/dist/lib/core/network/protocols/internalProtocol.d.ts +26 -15
  130. package/dist/lib/core/network/protocols/internalProtocol.js +17 -16
  131. package/dist/lib/core/network/protocols/mqttProtocol.d.ts +56 -32
  132. package/dist/lib/core/network/protocols/mqttProtocol.js +91 -44
  133. package/dist/lib/core/network/protocols/protocol.d.ts +85 -21
  134. package/dist/lib/core/network/protocols/protocol.js +83 -27
  135. package/dist/lib/core/network/router.d.ts +13 -22
  136. package/dist/lib/core/network/router.js +59 -46
  137. package/dist/lib/core/plugin/plugin.d.ts +57 -51
  138. package/dist/lib/core/plugin/plugin.js +218 -103
  139. package/dist/lib/core/plugin/pluginContext.d.ts +54 -11
  140. package/dist/lib/core/plugin/pluginContext.js +99 -58
  141. package/dist/lib/core/plugin/pluginManifest.d.ts +6 -2
  142. package/dist/lib/core/plugin/pluginManifest.js +18 -11
  143. package/dist/lib/core/plugin/pluginRepository.d.ts +35 -44
  144. package/dist/lib/core/plugin/pluginRepository.js +35 -50
  145. package/dist/lib/core/plugin/pluginsManager.d.ts +128 -46
  146. package/dist/lib/core/plugin/pluginsManager.js +468 -231
  147. package/dist/lib/core/plugin/privilegedContext.d.ts +4 -9
  148. package/dist/lib/core/plugin/privilegedContext.js +5 -10
  149. package/dist/lib/core/realtime/actionEnum.d.ts +12 -21
  150. package/dist/lib/core/realtime/actionEnum.js +6 -7
  151. package/dist/lib/core/realtime/channel.d.ts +11 -5
  152. package/dist/lib/core/realtime/channel.js +17 -2
  153. package/dist/lib/core/realtime/connectionRooms.d.ts +2 -2
  154. package/dist/lib/core/realtime/hotelClerk.d.ts +12 -6
  155. package/dist/lib/core/realtime/hotelClerk.js +29 -11
  156. package/dist/lib/core/realtime/index.d.ts +8 -3
  157. package/dist/lib/core/realtime/index.js +12 -5
  158. package/dist/lib/core/realtime/notification/document.d.ts +54 -25
  159. package/dist/lib/core/realtime/notification/document.js +10 -13
  160. package/dist/lib/core/realtime/notification/index.d.ts +9 -3
  161. package/dist/lib/core/realtime/notification/index.js +10 -4
  162. package/dist/lib/core/realtime/notification/server.d.ts +7 -10
  163. package/dist/lib/core/realtime/notification/server.js +4 -7
  164. package/dist/lib/core/realtime/notification/user.d.ts +45 -21
  165. package/dist/lib/core/realtime/notification/user.js +8 -9
  166. package/dist/lib/core/realtime/notifier.d.ts +52 -40
  167. package/dist/lib/core/realtime/notifier.js +60 -25
  168. package/dist/lib/core/realtime/room.d.ts +1 -1
  169. package/dist/lib/core/realtime/subscription.d.ts +11 -6
  170. package/dist/lib/core/realtime/subscription.js +5 -1
  171. package/dist/lib/core/security/index.d.ts +14 -6
  172. package/dist/lib/core/security/index.js +27 -13
  173. package/dist/lib/core/security/profileRepository.d.ts +24 -19
  174. package/dist/lib/core/security/profileRepository.js +23 -10
  175. package/dist/lib/core/security/roleRepository.d.ts +60 -23
  176. package/dist/lib/core/security/roleRepository.js +122 -53
  177. package/dist/lib/core/security/securityLoader.d.ts +33 -18
  178. package/dist/lib/core/security/securityLoader.js +43 -16
  179. package/dist/lib/core/security/tokenRepository.d.ts +21 -7
  180. package/dist/lib/core/security/tokenRepository.js +50 -23
  181. package/dist/lib/core/security/userRepository.d.ts +44 -21
  182. package/dist/lib/core/security/userRepository.js +59 -19
  183. package/dist/lib/core/shared/KoncordeWrapper.d.ts +1 -1
  184. package/dist/lib/core/shared/ObjectRepository.d.ts +80 -18
  185. package/dist/lib/core/shared/ObjectRepository.js +57 -29
  186. package/dist/lib/core/shared/abstractManifest.d.ts +21 -8
  187. package/dist/lib/core/shared/abstractManifest.js +57 -17
  188. package/dist/lib/core/shared/sdk/embeddedSdk.d.ts +3 -1
  189. package/dist/lib/core/shared/sdk/embeddedSdk.js +8 -7
  190. package/dist/lib/core/shared/sdk/funnelProtocol.d.ts +2 -1
  191. package/dist/lib/core/shared/sdk/funnelProtocol.js +12 -3
  192. package/dist/lib/core/shared/sdk/impersonatedSdk.d.ts +11 -5
  193. package/dist/lib/core/shared/sdk/impersonatedSdk.js +22 -9
  194. package/dist/lib/core/shared/store.d.ts +45 -29
  195. package/dist/lib/core/shared/store.js +48 -27
  196. package/dist/lib/core/statistics/statistics.d.ts +1 -1
  197. package/dist/lib/core/storage/clientAdapter.d.ts +39 -21
  198. package/dist/lib/core/storage/clientAdapter.js +88 -48
  199. package/dist/lib/core/storage/indexCache.d.ts +8 -0
  200. package/dist/lib/core/storage/indexCache.js +16 -7
  201. package/dist/lib/core/storage/storageEngine.d.ts +7 -6
  202. package/dist/lib/core/storage/storageEngine.js +11 -8
  203. package/dist/lib/core/validation/baseType.d.ts +22 -22
  204. package/dist/lib/core/validation/baseType.js +11 -26
  205. package/dist/lib/core/validation/specification.d.ts +148 -0
  206. package/dist/lib/core/validation/specification.js +34 -0
  207. package/dist/lib/core/validation/typeOptions.d.ts +62 -0
  208. package/dist/lib/core/validation/typeOptions.js +23 -0
  209. package/dist/lib/core/validation/types/anything.d.ts +3 -6
  210. package/dist/lib/core/validation/types/anything.js +7 -7
  211. package/dist/lib/core/validation/types/boolean.d.ts +5 -12
  212. package/dist/lib/core/validation/types/boolean.js +7 -12
  213. package/dist/lib/core/validation/types/date.d.ts +19 -11
  214. package/dist/lib/core/validation/types/date.js +212 -161
  215. package/dist/lib/core/validation/types/email.d.ts +7 -11
  216. package/dist/lib/core/validation/types/email.js +13 -17
  217. package/dist/lib/core/validation/types/enum.d.ts +7 -11
  218. package/dist/lib/core/validation/types/enum.js +39 -20
  219. package/dist/lib/core/validation/types/geoPoint.d.ts +5 -13
  220. package/dist/lib/core/validation/types/geoPoint.js +10 -15
  221. package/dist/lib/core/validation/types/geoShape.d.ts +22 -21
  222. package/dist/lib/core/validation/types/geoShape.js +113 -129
  223. package/dist/lib/core/validation/types/geoShapeUtils.d.ts +15 -0
  224. package/dist/lib/core/validation/types/geoShapeUtils.js +75 -0
  225. package/dist/lib/core/validation/types/integer.d.ts +7 -5
  226. package/dist/lib/core/validation/types/integer.js +7 -13
  227. package/dist/lib/core/validation/types/ipAddress.d.ts +7 -11
  228. package/dist/lib/core/validation/types/ipAddress.js +13 -17
  229. package/dist/lib/core/validation/types/numeric.d.ts +7 -11
  230. package/dist/lib/core/validation/types/numeric.js +22 -29
  231. package/dist/lib/core/validation/types/object.d.ts +8 -15
  232. package/dist/lib/core/validation/types/object.js +12 -21
  233. package/dist/lib/core/validation/types/string.d.ts +7 -11
  234. package/dist/lib/core/validation/types/string.js +22 -29
  235. package/dist/lib/core/validation/types/url.d.ts +7 -11
  236. package/dist/lib/core/validation/types/url.js +14 -18
  237. package/dist/lib/core/validation/validation.d.ts +119 -80
  238. package/dist/lib/core/validation/validation.js +470 -412
  239. package/dist/lib/core/validation/validationUtils.d.ts +31 -0
  240. package/dist/lib/core/validation/validationUtils.js +190 -0
  241. package/dist/lib/kerror/codes/4-plugin.json +0 -12
  242. package/dist/lib/kerror/codes/index.d.ts +12 -2
  243. package/dist/lib/kerror/codes/index.js +5 -4
  244. package/dist/lib/kerror/errors/badRequestError.d.ts +1 -1
  245. package/dist/lib/kerror/errors/badRequestError.js +1 -1
  246. package/dist/lib/kerror/errors/externalServiceError.d.ts +1 -1
  247. package/dist/lib/kerror/errors/externalServiceError.js +1 -1
  248. package/dist/lib/kerror/errors/forbiddenError.d.ts +1 -1
  249. package/dist/lib/kerror/errors/forbiddenError.js +1 -1
  250. package/dist/lib/kerror/errors/gatewayTimeoutError.d.ts +1 -1
  251. package/dist/lib/kerror/errors/gatewayTimeoutError.js +1 -1
  252. package/dist/lib/kerror/errors/internalError.d.ts +1 -1
  253. package/dist/lib/kerror/errors/internalError.js +1 -1
  254. package/dist/lib/kerror/errors/kuzzleError.d.ts +32 -3
  255. package/dist/lib/kerror/errors/kuzzleError.js +21 -7
  256. package/dist/lib/kerror/errors/multipleErrorsError.d.ts +2 -2
  257. package/dist/lib/kerror/errors/multipleErrorsError.js +2 -2
  258. package/dist/lib/kerror/errors/notFoundError.d.ts +1 -1
  259. package/dist/lib/kerror/errors/notFoundError.js +1 -1
  260. package/dist/lib/kerror/errors/partialError.d.ts +8 -2
  261. package/dist/lib/kerror/errors/partialError.js +22 -9
  262. package/dist/lib/kerror/errors/pluginImplementationError.d.ts +9 -1
  263. package/dist/lib/kerror/errors/pluginImplementationError.js +9 -3
  264. package/dist/lib/kerror/errors/preconditionError.d.ts +1 -1
  265. package/dist/lib/kerror/errors/preconditionError.js +1 -1
  266. package/dist/lib/kerror/errors/serviceUnavailableError.d.ts +1 -1
  267. package/dist/lib/kerror/errors/serviceUnavailableError.js +1 -1
  268. package/dist/lib/kerror/errors/sizeLimitError.d.ts +1 -1
  269. package/dist/lib/kerror/errors/sizeLimitError.js +1 -1
  270. package/dist/lib/kerror/errors/tooManyRequestsError.d.ts +1 -1
  271. package/dist/lib/kerror/errors/tooManyRequestsError.js +1 -1
  272. package/dist/lib/kerror/errors/unauthorizedError.d.ts +1 -1
  273. package/dist/lib/kerror/errors/unauthorizedError.js +1 -1
  274. package/dist/lib/kerror/index.d.ts +19 -13
  275. package/dist/lib/kerror/index.js +60 -19
  276. package/dist/lib/kuzzle/Logger.d.ts +2 -2
  277. package/dist/lib/kuzzle/dumpGenerator.d.ts +12 -8
  278. package/dist/lib/kuzzle/dumpGenerator.js +130 -62
  279. package/dist/lib/kuzzle/event/KuzzleEventEmitter.d.ts +18 -9
  280. package/dist/lib/kuzzle/event/KuzzleEventEmitter.js +45 -18
  281. package/dist/lib/kuzzle/event/pipeRunner.d.ts +37 -16
  282. package/dist/lib/kuzzle/event/pipeRunner.js +73 -26
  283. package/dist/lib/kuzzle/event/waterfall.d.ts +11 -1
  284. package/dist/lib/kuzzle/event/waterfall.js +38 -13
  285. package/dist/lib/kuzzle/internalIndexHandler.d.ts +11 -174
  286. package/dist/lib/kuzzle/internalIndexHandler.js +58 -29
  287. package/dist/lib/kuzzle/kuzzle.d.ts +25 -10
  288. package/dist/lib/kuzzle/kuzzle.js +74 -17
  289. package/dist/lib/kuzzle/kuzzleStateEnum.d.ts +16 -12
  290. package/dist/lib/kuzzle/kuzzleStateEnum.js +5 -7
  291. package/dist/lib/kuzzle/vault.d.ts +5 -1
  292. package/dist/lib/kuzzle/vault.js +29 -17
  293. package/dist/lib/model/security/profile.d.ts +34 -5
  294. package/dist/lib/model/security/profile.js +6 -5
  295. package/dist/lib/model/security/rights.d.ts +12 -4
  296. package/dist/lib/model/security/rights.js +7 -6
  297. package/dist/lib/model/security/role.d.ts +8 -4
  298. package/dist/lib/model/security/role.js +12 -6
  299. package/dist/lib/model/security/token.d.ts +8 -0
  300. package/dist/lib/model/security/user.d.ts +8 -2
  301. package/dist/lib/model/security/user.js +7 -4
  302. package/dist/lib/model/storage/apiKey.d.ts +55 -26
  303. package/dist/lib/model/storage/apiKey.js +97 -24
  304. package/dist/lib/model/storage/baseModel.d.ts +77 -66
  305. package/dist/lib/model/storage/baseModel.js +21 -34
  306. package/dist/lib/service/cache/redis.d.ts +53 -36
  307. package/dist/lib/service/cache/redis.js +148 -71
  308. package/dist/lib/service/service.d.ts +14 -19
  309. package/dist/lib/service/service.js +41 -22
  310. package/dist/lib/service/storage/7/elasticsearch.d.ts +136 -93
  311. package/dist/lib/service/storage/7/elasticsearch.js +218 -165
  312. package/dist/lib/service/storage/7/esWrapper.d.ts +30 -13
  313. package/dist/lib/service/storage/7/esWrapper.js +58 -37
  314. package/dist/lib/service/storage/8/elasticsearch.d.ts +153 -119
  315. package/dist/lib/service/storage/8/elasticsearch.js +286 -213
  316. package/dist/lib/service/storage/8/esWrapper.d.ts +30 -13
  317. package/dist/lib/service/storage/8/esWrapper.js +59 -38
  318. package/dist/lib/service/storage/commons/queryTranslator.d.ts +3 -3
  319. package/dist/lib/service/storage/commons/queryTranslator.js +71 -35
  320. package/dist/lib/types/ApiRoute.d.ts +12 -0
  321. package/dist/lib/types/ApiRoute.js +23 -0
  322. package/dist/lib/types/ClientConnection.d.ts +1 -1
  323. package/dist/lib/types/EventHandler.d.ts +10 -0
  324. package/dist/lib/types/Global.d.ts +8 -3
  325. package/dist/lib/types/HttpMessage.d.ts +2 -2
  326. package/dist/lib/types/HttpStream.d.ts +1 -1
  327. package/dist/lib/types/HttpStream.js +3 -1
  328. package/dist/lib/types/JSONObject.d.ts +9 -0
  329. package/dist/lib/types/JSONObject.js +23 -0
  330. package/dist/lib/types/Kuzzle.d.ts +5 -3
  331. package/dist/lib/types/KuzzleDocument.d.ts +1 -1
  332. package/dist/lib/types/KuzzleWebSocket.d.ts +24 -0
  333. package/dist/lib/types/KuzzleWebSocket.js +23 -0
  334. package/dist/lib/types/OpenApiDefinition.d.ts +1 -1
  335. package/dist/lib/types/Plugin.d.ts +33 -8
  336. package/dist/lib/types/PluginInstance.d.ts +67 -0
  337. package/dist/lib/types/PluginInstance.js +23 -0
  338. package/dist/lib/types/Policy.d.ts +1 -1
  339. package/dist/lib/types/Target.d.ts +8 -0
  340. package/dist/lib/types/Token.d.ts +14 -2
  341. package/dist/lib/types/config/HttpConfiguration.d.ts +5 -0
  342. package/dist/lib/types/config/KuzzleConfiguration.d.ts +102 -1
  343. package/dist/lib/types/config/PluginsConfiguration.d.ts +3 -2
  344. package/dist/lib/types/config/SecurityConfiguration.d.ts +6 -2
  345. package/dist/lib/types/config/ServerConfiguration.d.ts +2 -2
  346. package/dist/lib/types/config/ServicesConfiguration.d.ts +1 -1
  347. package/dist/lib/types/config/cache/BaseCacheRedisConfiguration.d.ts +131 -0
  348. package/dist/lib/types/config/cache/BaseCacheRedisConfiguration.js +3 -0
  349. package/dist/lib/types/config/internalCache/InternalCacheRedisConfiguration.d.ts +2 -106
  350. package/dist/lib/types/config/publicCache/PublicCacheRedisConfiguration.d.ts +2 -26
  351. package/dist/lib/types/config/storageEngine/StorageEngineElasticsearchConfiguration.d.ts +3 -0
  352. package/dist/lib/types/controllers/Controller.d.ts +12 -3
  353. package/dist/lib/types/controllers/ControllerDefinition.d.ts +2 -2
  354. package/dist/lib/types/controllers/{adminControlller.type.js → adminController.type.js} +1 -1
  355. package/dist/lib/types/controllers/authController.type.d.ts +2 -2
  356. package/dist/lib/types/core/auth/formatProcessing.type.d.ts +7 -1
  357. package/dist/lib/types/errors/ErrorDomains.d.ts +1 -1
  358. package/dist/lib/types/events/EventGenericDocument.d.ts +10 -9
  359. package/dist/lib/types/events/EventProtocol.d.ts +4 -4
  360. package/dist/lib/types/index.d.ts +7 -0
  361. package/dist/lib/types/index.js +7 -0
  362. package/dist/lib/types/shared/StoreCollectionsDefinition.d.ts +1 -1
  363. package/dist/lib/types/storage/7/Elasticsearch.d.ts +62 -13
  364. package/dist/lib/types/storage/8/Elasticsearch.d.ts +62 -13
  365. package/dist/lib/util/Inflector.d.ts +4 -1
  366. package/dist/lib/util/Inflector.js +0 -3
  367. package/dist/lib/util/assertType.d.ts +24 -27
  368. package/dist/lib/util/assertType.js +28 -39
  369. package/dist/lib/util/async.js +19 -6
  370. package/dist/lib/util/asyncStore.js +1 -1
  371. package/dist/lib/util/bufferedPassThrough.d.ts +9 -0
  372. package/dist/lib/util/bufferedPassThrough.js +27 -13
  373. package/dist/lib/util/bytes.d.ts +1 -1
  374. package/dist/lib/util/bytes.js +6 -2
  375. package/dist/lib/util/debug.d.ts +3 -1
  376. package/dist/lib/util/debug.js +42 -10
  377. package/dist/lib/util/deprecate.d.ts +9 -1
  378. package/dist/lib/util/deprecate.js +10 -6
  379. package/dist/lib/util/didYouMean.d.ts +2 -1
  380. package/dist/lib/util/didYouMean.js +8 -4
  381. package/dist/lib/util/distributedLock.d.ts +56 -0
  382. package/dist/lib/util/distributedLock.js +166 -0
  383. package/dist/lib/util/dump-collection.d.ts +1 -1
  384. package/dist/lib/util/dump-collection.js +4 -5
  385. package/dist/lib/util/extractFields.d.ts +15 -11
  386. package/dist/lib/util/extractFields.js +8 -9
  387. package/dist/lib/util/koncordeCompat.d.ts +2 -2
  388. package/dist/lib/util/koncordeCompat.js +33 -0
  389. package/dist/lib/util/memoize.d.ts +7 -6
  390. package/dist/lib/util/memoize.js +3 -3
  391. package/dist/lib/util/mutex.d.ts +22 -2
  392. package/dist/lib/util/mutex.js +39 -1
  393. package/dist/lib/util/name-generator.js +14 -2
  394. package/dist/lib/util/promback.d.ts +20 -11
  395. package/dist/lib/util/promback.js +14 -7
  396. package/dist/lib/util/requestAssertions.d.ts +30 -10
  397. package/dist/lib/util/requestAssertions.js +125 -121
  398. package/dist/lib/util/safeObject.d.ts +3 -3
  399. package/dist/lib/util/safeObject.js +7 -3
  400. package/dist/lib/util/stackTrace.d.ts +13 -5
  401. package/dist/lib/util/stackTrace.js +17 -12
  402. package/dist/lib/util/thrown.d.ts +13 -0
  403. package/dist/lib/util/thrown.js +46 -0
  404. package/dist/package.json +26 -19
  405. package/package.json +26 -19
  406. package/dist/lib/util/wildcard.d.ts +0 -1
  407. package/dist/lib/util/wildcard.js +0 -46
  408. /package/dist/lib/types/controllers/{adminControlller.type.d.ts → adminController.type.d.ts} +0 -0
@@ -1,12 +1,27 @@
1
- import { JSONObject } from "kuzzle-sdk";
1
+ import type { JSONObject } from "../../types/JSONObject";
2
2
  import { Profile } from "../../model/security/profile";
3
3
  import { ObjectRepository } from "../shared/ObjectRepository";
4
4
  /** @internal */
5
+ /**
6
+ * The two sibling repositories this one reaches through, the same shape
7
+ * `UserRepository` declares for its own side of the module.
8
+ */
9
+ interface SecurityModule {
10
+ role: {
11
+ loadRoles(ids: string[]): Promise<unknown[]>;
12
+ };
13
+ user: {
14
+ scroll(scrollId: string, ttl?: string): Promise<JSONObject>;
15
+ search(query: JSONObject, options?: JSONObject): Promise<JSONObject>;
16
+ update(id: string | null, profileIds: string[], content: JSONObject, options: JSONObject): Promise<unknown>;
17
+ };
18
+ }
19
+ /** @internal */
5
20
  type CreateOrReplaceOptions = {
6
21
  method?: string;
7
22
  refresh?: string;
8
23
  strict?: boolean;
9
- userId?: string;
24
+ userId?: string | null;
10
25
  };
11
26
  /** @internal */
12
27
  type ValidateAndSaveProfileOptions = {
@@ -27,11 +42,11 @@ type UpdateOptions = {
27
42
  * @extends ObjectRepository
28
43
  */
29
44
  export declare class ProfileRepository extends ObjectRepository<Profile> {
30
- private module;
45
+ private readonly module;
31
46
  /**
32
47
  * @constructor
33
48
  */
34
- constructor(securityModule: any);
49
+ constructor(securityModule: SecurityModule);
35
50
  init(): void;
36
51
  /**
37
52
  * Loads a Profile
@@ -109,9 +124,9 @@ export declare class ProfileRepository extends ObjectRepository<Profile> {
109
124
  * @override
110
125
  */
111
126
  delete(profile: Profile, { refresh, onAssignedUsers, userId }?: {
112
- refresh?: string;
113
- onAssignedUsers?: string;
114
- userId?: string;
127
+ refresh?: string | undefined;
128
+ onAssignedUsers?: string | undefined;
129
+ userId?: string | undefined;
115
130
  }): Promise<void>;
116
131
  /**
117
132
  * From a Profile object, returns a serialized object ready to be persisted
@@ -160,17 +175,7 @@ export declare class ProfileRepository extends ObjectRepository<Profile> {
160
175
  private optimizePolicy;
161
176
  toDTO(dto: Profile): JSONObject;
162
177
  deleteFromDatabase(id: string, options: JSONObject): any;
163
- search(searchBody: JSONObject, options: JSONObject): Promise<{
164
- aggregations: any;
165
- hits: any[];
166
- scrollId: any;
167
- total: any;
168
- }>;
169
- scroll(id: string, ttl: number): Promise<{
170
- aggregations: any;
171
- hits: any[];
172
- scrollId: any;
173
- total: any;
174
- }>;
178
+ search(searchBody: JSONObject, options: JSONObject): Promise<import("../shared/ObjectRepository").ObjectRepositorySearchAnswer>;
179
+ scroll(id: string, ttl: number): Promise<import("../shared/ObjectRepository").ObjectRepositorySearchAnswer>;
175
180
  }
176
181
  export {};
@@ -195,10 +195,16 @@ class ProfileRepository extends ObjectRepository_1.ObjectRepository {
195
195
  */
196
196
  async loadOneFromDatabase(id) {
197
197
  try {
198
- return await super.loadOneFromDatabase(id);
198
+ const profile = await super.loadOneFromDatabase(id);
199
+ // The base resolves `null` for a document with no `_id`; for a profile
200
+ // that is the same "not found" as a 404.
201
+ if (profile === null) {
202
+ throw kerror.get("security", "profile", "not_found", id);
203
+ }
204
+ return profile;
199
205
  }
200
206
  catch (err) {
201
- if (err.status === 404) {
207
+ if (err instanceof Error && "status" in err && err.status === 404) {
202
208
  throw kerror.get("security", "profile", "not_found", id);
203
209
  }
204
210
  throw err;
@@ -297,7 +303,7 @@ class ProfileRepository extends ObjectRepository_1.ObjectRepository {
297
303
  * @override
298
304
  */
299
305
  async delete(profile, { refresh = "false", onAssignedUsers = "fail", userId = "-1" } = {}) {
300
- if (["admin", "default", "anonymous"].includes(profile._id)) {
306
+ if (["admin", "default", "anonymous"].includes(this.idOf(profile))) {
301
307
  throw kerror.get("security", "profile", "cannot_delete");
302
308
  }
303
309
  const query = {
@@ -334,8 +340,9 @@ class ProfileRepository extends ObjectRepository_1.ObjectRepository {
334
340
  throw kerror.get("security", "profile", "in_use");
335
341
  }
336
342
  }
337
- await this.deleteFromDatabase(profile._id, { refresh });
338
- await this.deleteFromCache(profile._id);
343
+ const profileId = this.idOf(profile);
344
+ await this.deleteFromDatabase(profileId, { refresh });
345
+ await this.deleteFromCache(profileId);
339
346
  }
340
347
  /**
341
348
  * From a Profile object, returns a serialized object ready to be persisted
@@ -370,13 +377,15 @@ class ProfileRepository extends ObjectRepository_1.ObjectRepository {
370
377
  policiesRoles.indexOf("anonymous") === -1) {
371
378
  throw kerror.get("security", "profile", "missing_anonymous_role");
372
379
  }
373
- profile.optimizedPolicies = undefined; // Remove optimized policies
380
+ // Remove optimized policies. `undefined!`: declared as always present,
381
+ // see Profile.optimizedPolicies.
382
+ profile.optimizedPolicies = undefined;
374
383
  await super.persistToDatabase(profile, {
375
384
  method,
376
385
  refresh,
377
386
  retryOnConflict,
378
387
  });
379
- const updatedProfile = await this.loadOneFromDatabase(profile._id);
388
+ const updatedProfile = await this.loadOneFromDatabase(this.idOf(profile));
380
389
  await this.persistToCache(updatedProfile);
381
390
  // Recompute optimized policies based on new policies
382
391
  updatedProfile.optimizedPolicies = this.optimizePolicies(updatedProfile.policies);
@@ -392,13 +401,17 @@ class ProfileRepository extends ObjectRepository_1.ObjectRepository {
392
401
  if (!profile.policies || profile.policies.length === 0) {
393
402
  profile.policies = [{ roleId: "default" }];
394
403
  }
395
- if (profile.constructor._hash("") === false) {
396
- profile.constructor._hash = (obj) => global.kuzzle.hash(obj);
404
+ // `Profile._hash` ships as a stub returning `false`; that return value is
405
+ // the probe for "not patched yet". Typed through `typeof Profile` rather
406
+ // than `any`, which is what the overload declared on the stub is for.
407
+ const profileClass = profile.constructor;
408
+ if (profileClass._hash("") === false) {
409
+ profileClass._hash = (obj) => global.kuzzle.hash(obj);
397
410
  }
398
411
  const policiesRoles = profile.policies.map((p) => p.roleId);
399
412
  const roles = await this.module.role.loadRoles(policiesRoles);
400
413
  // Fail if not all roles are found
401
- if (roles.some((r) => r === null)) {
414
+ if (roles.some((role) => !role)) {
402
415
  throw kerror.get("security", "profile", "cannot_hydrate");
403
416
  }
404
417
  return profile;
@@ -1,18 +1,40 @@
1
- export = RoleRepository;
1
+ import { Role } from "../../model/security/role";
2
+ import { ObjectRepository } from "../shared/ObjectRepository";
3
+ import type { JSONObject } from "../../types/JSONObject";
4
+ import type { Logger } from "../../kuzzle/Logger";
5
+ import "../../types/Global";
6
+ import type { ProfileRepository } from "./profileRepository";
7
+ interface SecurityModule {
8
+ profile: ProfileRepository;
9
+ }
10
+ /**
11
+ * Who is performing the write, and how eagerly the change must be visible.
12
+ */
13
+ interface WriteOptions {
14
+ force?: boolean;
15
+ method?: string;
16
+ refresh?: string;
17
+ retryOnConflict?: number;
18
+ userId?: string | null;
19
+ }
2
20
  /**
3
21
  * @class RoleRepository
4
22
  * @extends ObjectRepository
5
23
  */
6
- declare class RoleRepository extends ObjectRepository<any> {
24
+ declare class RoleRepository extends ObjectRepository<Role> {
25
+ protected module: SecurityModule;
26
+ /**
27
+ * Role cache. It holds an in-flight `Promise<Role>` while a role is being
28
+ * loaded (see `loadRoles`), which is what de-duplicates concurrent loads —
29
+ * hence the union rather than plain `Role`.
30
+ */
31
+ roles: Map<string, Role | Promise<Role>>;
32
+ logger: Logger;
7
33
  /**
8
34
  * @constructor
9
35
  * @param {SecurityModule} securityModule
10
36
  */
11
37
  constructor(securityModule: SecurityModule);
12
- module: SecurityModule;
13
- ObjectConstructor: typeof Role;
14
- roles: Map<any, any>;
15
- logger: import("../../kuzzle/Logger").Logger;
16
38
  init(): void;
17
39
  /**
18
40
  * From a list of role ids, retrieves the matching Role objects.
@@ -21,7 +43,7 @@ declare class RoleRepository extends ObjectRepository<any> {
21
43
  * @param {Object} options - resetCache (false)
22
44
  * @returns {Promise.<Array.<Role>>}
23
45
  */
24
- loadRoles(ids: any[]): Promise<Array<Role>>;
46
+ loadRoles(ids: string[]): Promise<Role[]>;
25
47
  /**
26
48
  * Creates a new role, or create/replace a role
27
49
  *
@@ -30,7 +52,7 @@ declare class RoleRepository extends ObjectRepository<any> {
30
52
  * @param {Object} [opts]
31
53
  * @returns {Role}
32
54
  */
33
- _createOrReplace(id: string, content: any, { force, method, refresh, userId }?: any): Role;
55
+ _createOrReplace(id: string, content: JSONObject, { force, method, refresh, userId, }?: WriteOptions): Promise<Role>;
34
56
  /**
35
57
  * Creates a new role
36
58
  *
@@ -39,7 +61,7 @@ declare class RoleRepository extends ObjectRepository<any> {
39
61
  * @param {Object} [opts]
40
62
  * @returns {Role}
41
63
  */
42
- create(id: string, content: any, opts?: any): Role;
64
+ create(id: string, content: JSONObject, opts?: WriteOptions): Promise<Role>;
43
65
  /**
44
66
  * Creates or replaces a role
45
67
  *
@@ -48,7 +70,7 @@ declare class RoleRepository extends ObjectRepository<any> {
48
70
  * @param {Object} [opts]
49
71
  * @returns {Role}
50
72
  */
51
- createOrReplace(id: string, content: any, opts?: any): Role;
73
+ createOrReplace(id: string, content: JSONObject, opts?: WriteOptions): Promise<Role>;
52
74
  /**
53
75
  * Updates a role (replaces the entire content)
54
76
  *
@@ -60,7 +82,7 @@ declare class RoleRepository extends ObjectRepository<any> {
60
82
  * @param {Object} [opts]
61
83
  * @returns {Promise}
62
84
  */
63
- update(id: string, content: any, { force, refresh, retryOnConflict, userId }?: any): Promise<any>;
85
+ update(id: string, content: JSONObject, { force, refresh, retryOnConflict, userId }?: WriteOptions): Promise<Role>;
64
86
  /**
65
87
  * Get from database the document that represent the role given in parameter
66
88
  *
@@ -72,12 +94,15 @@ declare class RoleRepository extends ObjectRepository<any> {
72
94
  /**
73
95
  * @override
74
96
  */
75
- override loadOneFromDatabase(id: any): Promise<any>;
97
+ loadOneFromDatabase(id: string): Promise<Role>;
76
98
  /**
77
99
  * @param {Object} body Search body containing either "query" or "controllers"
78
100
  * @param {Object} options
79
101
  */
80
- searchRole(body: any, { from, size }?: any): Promise<{
102
+ searchRole(body: JSONObject, { from, size }?: {
103
+ from?: number;
104
+ size?: number;
105
+ }): Promise<{
81
106
  hits: any[];
82
107
  total: any;
83
108
  }>;
@@ -88,7 +113,7 @@ declare class RoleRepository extends ObjectRepository<any> {
88
113
  * @param {object} [options] The persistence options
89
114
  * @returns Promise
90
115
  */
91
- validateAndSaveRole(role: Role, options?: object): Promise<any>;
116
+ validateAndSaveRole(role: Role, options?: WriteOptions): Promise<Role>;
92
117
  /**
93
118
  * Given a Role object, checks if its controllers and actions exist.
94
119
  *
@@ -101,7 +126,22 @@ declare class RoleRepository extends ObjectRepository<any> {
101
126
  * @param {Role} role
102
127
  * @param {Force} force
103
128
  */
104
- checkRolePluginsRights(role: Role, { force, forceWarn }?: Force): void;
129
+ checkRolePluginsRights(role: Role, { force, forceWarn, }?: {
130
+ force?: boolean;
131
+ forceWarn?: boolean;
132
+ }): void;
133
+ /**
134
+ * Verifies that a plugin controller referenced by a role exists. Extracted
135
+ * from `checkRolePluginsRights` verbatim.
136
+ *
137
+ * @returns whether the caller should keep inspecting that controller
138
+ */
139
+ private _checkPluginController;
140
+ /**
141
+ * Verifies every action a role grants on a plugin controller. Extracted from
142
+ * `checkRolePluginsRights` verbatim.
143
+ */
144
+ private _checkPluginActions;
105
145
  /**
106
146
  * Fetching roles and check for each of them for invalid plugin rights.
107
147
  * If there are some, Kuzzle will log a warning.
@@ -114,24 +154,22 @@ declare class RoleRepository extends ObjectRepository<any> {
114
154
  * @param {object} [options]
115
155
  * @returns Promise
116
156
  */
117
- deleteById(id: string, options?: object): Promise<void>;
157
+ deleteById(id: string, options?: JSONObject): Promise<void>;
118
158
  /**
119
159
  * @override
120
160
  */
121
- override delete(role: any, { refresh }?: {
122
- refresh?: string;
123
- }): Promise<void>;
161
+ delete(role: Role, { refresh }?: WriteOptions): Promise<void>;
124
162
  /**
125
163
  * From a Role object, returns an object ready to be persisted
126
164
  *
127
165
  * @param {Role} role
128
166
  * @returns {object}
129
167
  */
130
- serializeToDatabase(role: Role): object;
168
+ serializeToDatabase(role: Role): JSONObject;
131
169
  /**
132
170
  * @override
133
171
  */
134
- override truncate(opts: any): Promise<void>;
172
+ truncate(opts: JSONObject): Promise<number>;
135
173
  /**
136
174
  * Invalidate the cache entries for the given role. If none is provided,
137
175
  * the entire cache is emptied.
@@ -139,5 +177,4 @@ declare class RoleRepository extends ObjectRepository<any> {
139
177
  */
140
178
  invalidate(roleId?: string): void;
141
179
  }
142
- import { ObjectRepository } from "../shared/ObjectRepository";
143
- import { Role } from "../../model/security/role";
180
+ export = RoleRepository;
@@ -1,3 +1,4 @@
1
+ "use strict";
1
2
  /*
2
3
  * Kuzzle, a backend software, self-hostable and ready to use
3
4
  * to power modern apps
@@ -18,32 +19,58 @@
18
19
  * See the License for the specific language governing permissions and
19
20
  * limitations under the License.
20
21
  */
21
- "use strict";
22
- const Bluebird = require("bluebird");
23
- const kuzzleStateEnum = require("../../kuzzle/kuzzleStateEnum");
24
- const { Role } = require("../../model/security/role");
25
- const { ObjectRepository } = require("../shared/ObjectRepository");
26
- const kerror = require("../../kerror");
27
- const didYouMean = require("../../util/didYouMean");
28
- const { cacheDbEnum } = require("../cache/cacheDbEnum");
22
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
23
+ if (k2 === undefined) k2 = k;
24
+ var desc = Object.getOwnPropertyDescriptor(m, k);
25
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
26
+ desc = { enumerable: true, get: function() { return m[k]; } };
27
+ }
28
+ Object.defineProperty(o, k2, desc);
29
+ }) : (function(o, m, k, k2) {
30
+ if (k2 === undefined) k2 = k;
31
+ o[k2] = m[k];
32
+ }));
33
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
34
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
35
+ }) : function(o, v) {
36
+ o["default"] = v;
37
+ });
38
+ var __importStar = (this && this.__importStar) || function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ var __importDefault = (this && this.__importDefault) || function (mod) {
46
+ return (mod && mod.__esModule) ? mod : { "default": mod };
47
+ };
48
+ const bluebird_1 = __importDefault(require("bluebird"));
49
+ const kuzzleStateEnum_1 = __importDefault(require("../../kuzzle/kuzzleStateEnum"));
50
+ const role_1 = require("../../model/security/role");
51
+ const ObjectRepository_1 = require("../shared/ObjectRepository");
52
+ const kerror = __importStar(require("../../kerror"));
53
+ const didYouMean_1 = __importDefault(require("../../util/didYouMean"));
54
+ const cacheDbEnum_1 = require("../cache/cacheDbEnum");
55
+ require("../../types/Global");
29
56
  const roleRightsError = kerror.wrap("security", "role");
30
57
  /**
31
58
  * @class RoleRepository
32
59
  * @extends ObjectRepository
33
60
  */
34
- class RoleRepository extends ObjectRepository {
61
+ class RoleRepository extends ObjectRepository_1.ObjectRepository {
35
62
  /**
36
63
  * @constructor
37
64
  * @param {SecurityModule} securityModule
38
65
  */
39
66
  constructor(securityModule) {
40
67
  super({
41
- cache: cacheDbEnum.INTERNAL,
68
+ cache: cacheDbEnum_1.cacheDbEnum.INTERNAL,
42
69
  store: global.kuzzle.internalIndex,
43
70
  });
44
71
  this.module = securityModule;
45
72
  this.collection = "roles";
46
- this.ObjectConstructor = Role;
73
+ this.ObjectConstructor = role_1.Role;
47
74
  this.roles = new Map();
48
75
  this.logger = global.kuzzle.log.child("core:security:roleRepository");
49
76
  }
@@ -142,7 +169,7 @@ class RoleRepository extends ObjectRepository {
142
169
  }
143
170
  roles.push(role);
144
171
  }
145
- return Bluebird.all(roles);
172
+ return bluebird_1.default.all(roles);
146
173
  }
147
174
  /**
148
175
  * Creates a new role, or create/replace a role
@@ -152,7 +179,7 @@ class RoleRepository extends ObjectRepository {
152
179
  * @param {Object} [opts]
153
180
  * @returns {Role}
154
181
  */
155
- async _createOrReplace(id, content, { force = false, method, refresh = "false", userId = null } = {}) {
182
+ async _createOrReplace(id, content, { force = false, method, refresh = "false", userId = null, } = {}) {
156
183
  const dto = {
157
184
  ...content,
158
185
  // Always last, in case content contains these keys
@@ -232,11 +259,12 @@ class RoleRepository extends ObjectRepository {
232
259
  * @throws {NotFoundError} If the corresponding role doesn't exist
233
260
  */
234
261
  async load(id) {
235
- if (this.roles.has(id)) {
236
- return this.roles.get(id);
262
+ const cached = this.roles.get(id);
263
+ if (cached !== undefined) {
264
+ return cached;
237
265
  }
238
266
  const role = await this.loadOneFromDatabase(id);
239
- await this.roles.set(role._id, role);
267
+ this.roles.set(role._id, role);
240
268
  return role;
241
269
  }
242
270
  /**
@@ -244,10 +272,16 @@ class RoleRepository extends ObjectRepository {
244
272
  */
245
273
  async loadOneFromDatabase(id) {
246
274
  try {
247
- return await super.loadOneFromDatabase(id);
275
+ const role = await super.loadOneFromDatabase(id);
276
+ // The base resolves `null` for a document with no `_id`; a role always
277
+ // has one, and its absence is the same "not found" as a 404.
278
+ if (role === null) {
279
+ throw kerror.get("security", "role", "not_found", id);
280
+ }
281
+ return role;
248
282
  }
249
283
  catch (err) {
250
- if (err.status === 404) {
284
+ if (err instanceof Error && "status" in err && err.status === 404) {
251
285
  throw kerror.get("security", "role", "not_found", id);
252
286
  }
253
287
  throw err;
@@ -289,7 +323,7 @@ class RoleRepository extends ObjectRepository {
289
323
  this.checkRolePluginsRights(role, options);
290
324
  await this.persistToDatabase(role, options);
291
325
  const updatedRole = await this.loadOneFromDatabase(role._id);
292
- await this.roles.set(role._id, updatedRole);
326
+ this.roles.set(role._id, updatedRole);
293
327
  return updatedRole;
294
328
  }
295
329
  /**
@@ -303,8 +337,12 @@ class RoleRepository extends ObjectRepository {
303
337
  !global.kuzzle.funnel.isNativeController(roleController)) {
304
338
  return;
305
339
  }
340
+ const roleControllerRights = role.controllers[roleController];
341
+ if (roleControllerRights === undefined) {
342
+ return;
343
+ }
306
344
  if (roleController === "*") {
307
- Object.keys(role.controllers["*"].actions).forEach((action) => {
345
+ Object.keys(roleControllerRights.actions ?? {}).forEach((action) => {
308
346
  if (action !== "*") {
309
347
  throw roleRightsError.get("unknown_action", role._id, action, "*");
310
348
  }
@@ -312,10 +350,16 @@ class RoleRepository extends ObjectRepository {
312
350
  }
313
351
  else {
314
352
  const controller = global.kuzzle.funnel.controllers.get(roleController);
315
- const actions = Object.keys(role.controllers[roleController].actions);
353
+ const actions = Object.keys(roleControllerRights.actions ?? {});
316
354
  actions.forEach((action) => {
317
- if (action !== "*" && !controller._isAction(action)) {
318
- throw roleRightsError.get("unknown_action", role._id, action, roleController, didYouMean(action, controller.__actions));
355
+ if (action !== "*" &&
356
+ controller !== undefined &&
357
+ !controller._isAction(action)) {
358
+ throw roleRightsError.get("unknown_action", role._id, action, roleController,
359
+ // `_actions` is a Set. didyoumean@1.2.1 walks `list.length`,
360
+ // which a Set does not have, so this suggestion had always been
361
+ // empty — the new declaration for the module is what said so.
362
+ (0, didYouMean_1.default)(action, Array.from(controller?._actions ?? [])));
319
363
  }
320
364
  });
321
365
  }
@@ -327,38 +371,59 @@ class RoleRepository extends ObjectRepository {
327
371
  * @param {Role} role
328
372
  * @param {Force} force
329
373
  */
330
- checkRolePluginsRights(role, { force = false, forceWarn = false } = {}) {
331
- const plugins = global.kuzzle.pluginsManager;
374
+ checkRolePluginsRights(role, { force = false, forceWarn = false, } = {}) {
332
375
  for (const roleController of Object.keys(role.controllers)) {
333
376
  if (roleController === "*" ||
334
377
  global.kuzzle.funnel.isNativeController(roleController)) {
335
378
  return;
336
379
  }
337
- if (!plugins.isController(roleController)) {
338
- if (!force) {
339
- throw roleRightsError.get("unknown_controller", role._id, roleController, didYouMean(roleController, plugins.getControllerNames()));
340
- }
341
- // Do not print any warning if Kuzzle is not started or if warn is not forced.
342
- // We need this to load rights without displaying warning at startup
343
- // because plugins controllers are loaded after default roles
344
- // then we need to display non-existing controllers with the sanity check
345
- // made after plugins controllers loading.
346
- if (global.kuzzle.state === kuzzleStateEnum.RUNNING || forceWarn) {
347
- this.logger.warn(`The role "${role._id}" gives access to the non-existing controller "${roleController}".`);
348
- }
380
+ if (!this._checkPluginController(role, roleController, { force, forceWarn })) {
349
381
  return;
350
382
  }
351
- const roleActions = Object.keys(role.controllers[roleController].actions);
352
- for (const action of roleActions) {
353
- if (action !== "*" && !plugins.isAction(roleController, action)) {
354
- if (!force) {
355
- throw roleRightsError.get("unknown_action", role._id, action, roleController, didYouMean(action, plugins.getActions(roleController)));
356
- }
357
- // see the other comment
358
- if (global.kuzzle.state === kuzzleStateEnum.RUNNING || forceWarn) {
359
- this.logger.warn(`The role "${role._id}" gives access to the non-existing action "${action}" for the controller "${roleController}".`);
360
- }
361
- }
383
+ this._checkPluginActions(role, roleController, { force, forceWarn });
384
+ }
385
+ }
386
+ /**
387
+ * Verifies that a plugin controller referenced by a role exists. Extracted
388
+ * from `checkRolePluginsRights` verbatim.
389
+ *
390
+ * @returns whether the caller should keep inspecting that controller
391
+ */
392
+ _checkPluginController(role, roleController, { force, forceWarn }) {
393
+ const plugins = global.kuzzle.pluginsManager;
394
+ if (plugins.isController(roleController)) {
395
+ return true;
396
+ }
397
+ if (!force) {
398
+ throw roleRightsError.get("unknown_controller", role._id, roleController, (0, didYouMean_1.default)(roleController, plugins.getControllerNames()));
399
+ }
400
+ // Do not print any warning if Kuzzle is not started or if warn is not forced.
401
+ // We need this to load rights without displaying warning at startup
402
+ // because plugins controllers are loaded after default roles
403
+ // then we need to display non-existing controllers with the sanity check
404
+ // made after plugins controllers loading.
405
+ if (global.kuzzle.state === kuzzleStateEnum_1.default.RUNNING || forceWarn) {
406
+ this.logger.warn(`The role "${role._id}" gives access to the non-existing controller "${roleController}".`);
407
+ }
408
+ return false;
409
+ }
410
+ /**
411
+ * Verifies every action a role grants on a plugin controller. Extracted from
412
+ * `checkRolePluginsRights` verbatim.
413
+ */
414
+ _checkPluginActions(role, roleController, { force, forceWarn }) {
415
+ const plugins = global.kuzzle.pluginsManager;
416
+ const roleActions = Object.keys(role.controllers[roleController]?.actions ?? {});
417
+ for (const action of roleActions) {
418
+ if (action === "*" || plugins.isAction(roleController, action)) {
419
+ continue;
420
+ }
421
+ if (!force) {
422
+ throw roleRightsError.get("unknown_action", role._id, action, roleController, (0, didYouMean_1.default)(action, plugins.getActions(roleController)));
423
+ }
424
+ // see the other comment
425
+ if (global.kuzzle.state === kuzzleStateEnum_1.default.RUNNING || forceWarn) {
426
+ this.logger.warn(`The role "${role._id}" gives access to the non-existing action "${action}" for the controller "${roleController}".`);
362
427
  }
363
428
  }
364
429
  }
@@ -387,7 +452,7 @@ class RoleRepository extends ObjectRepository {
387
452
  * @override
388
453
  */
389
454
  async delete(role, { refresh = "false" } = {}) {
390
- if (["admin", "default", "anonymous"].indexOf(role._id) > -1) {
455
+ if (["admin", "default", "anonymous"].includes(role._id)) {
391
456
  throw kerror.get("security", "role", "cannot_delete");
392
457
  }
393
458
  const query = { term: { "policies.roleId": role._id } };
@@ -409,11 +474,11 @@ class RoleRepository extends ObjectRepository {
409
474
  */
410
475
  serializeToDatabase(role) {
411
476
  const serializedRole = {};
412
- Object.keys(role).forEach((key) => {
477
+ for (const [key, value] of Object.entries(role)) {
413
478
  if (key !== "_id" && key !== "restrictedTo") {
414
- serializedRole[key] = role[key];
479
+ serializedRole[key] = value;
415
480
  }
416
- });
481
+ }
417
482
  return serializedRole;
418
483
  }
419
484
  /**
@@ -421,7 +486,11 @@ class RoleRepository extends ObjectRepository {
421
486
  */
422
487
  async truncate(opts) {
423
488
  try {
424
- await super.truncate(opts);
489
+ // `return await`, not `await` then fall through: the base answers the
490
+ // number of deleted roles and this override used to drop it, which is
491
+ // why `admin:resetSecurity` reported `deletedRoles: undefined` next to
492
+ // two real counts.
493
+ return await super.truncate(opts);
425
494
  }
426
495
  finally {
427
496
  this.invalidate();