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,13 +1,22 @@
1
1
  import EventEmitter from "eventemitter3";
2
- import { AskEventDefinition, AskEventHandler, CallEventHandler, EventDefinition, HookEventHandler, PipeEventHandler } from "../../types/EventHandler";
2
+ import type { AskEventDefinition, AskEventHandler, CallEventHandler, EventDefinition, HookEventHandler, PipeEventHandler, RegisteredPipeHandler } from "../../types/EventHandler";
3
3
  declare class KuzzleEventEmitter extends EventEmitter {
4
- private coreAnswerers;
4
+ /**
5
+ * The ask answerers, whatever event each was registered for.
6
+ *
7
+ * `onAsk` is generic over its event, and a handler's parameters are
8
+ * contravariant: a handler for one event is not assignable to the handler
9
+ * type of another, so the only thing the map can say about all of them
10
+ * together is that they are callable. `ask()` dispatches through
11
+ * `Reflect.apply`, which is what that costs.
12
+ */
13
+ private readonly coreAnswerers;
5
14
  private coreSyncedAnswerers;
6
- private corePipes;
7
- private pipeRunner;
8
- private pluginPipes;
9
- private pluginPipeDefinitions;
10
- private superEmit;
15
+ private readonly corePipes;
16
+ private readonly pipeRunner;
17
+ private readonly pluginPipes;
18
+ private readonly pluginPipeDefinitions;
19
+ private readonly superEmit;
11
20
  constructor(maxConcurrentPipes: number, pipesBufferSize: number);
12
21
  /**
13
22
  * Registers a core method on a pipe
@@ -59,8 +68,8 @@ declare class KuzzleEventEmitter extends EventEmitter {
59
68
  * Registers a plugin hook.
60
69
  * Catch any error in the handler and emit the hook:onError event.
61
70
  */
62
- registerPluginHook<TEventDefinition extends EventDefinition = EventDefinition>(pluginName: string, event: TEventDefinition["name"], fn: HookEventHandler<TEventDefinition>): void;
63
- registerPluginPipe<TEventDefinition extends EventDefinition = EventDefinition>(event: TEventDefinition["name"], handler: PipeEventHandler<TEventDefinition>): string;
71
+ registerPluginHook<TEventDefinition extends EventDefinition = EventDefinition>(pluginName: string, event: TEventDefinition["name"], fn: HookEventHandler<TEventDefinition> | ((...args: unknown[]) => unknown)): void;
72
+ registerPluginPipe<TEventDefinition extends EventDefinition = EventDefinition>(event: TEventDefinition["name"], handler: RegisteredPipeHandler<TEventDefinition>): string;
64
73
  unregisterPluginPipe(pipeId: string): void;
65
74
  /**
66
75
  * Checks if an ask event has an answerer
@@ -89,10 +89,9 @@ class KuzzleEventEmitter extends eventemitter3_1.default {
89
89
  */
90
90
  onPipe(event, fn) {
91
91
  (0, assert_1.default)(typeof fn === "function", `Cannot listen to pipe event ${event}: "${fn}" is not a function`);
92
- if (!this.corePipes.has(event)) {
93
- this.corePipes.set(event, []);
94
- }
95
- this.corePipes.get(event).push(fn);
92
+ const registered = this.corePipes.get(event) ?? [];
93
+ registered.push(fn);
94
+ this.corePipes.set(event, registered);
96
95
  }
97
96
  /**
98
97
  * Registers a core 'ask' event answerer
@@ -101,6 +100,9 @@ class KuzzleEventEmitter extends eventemitter3_1.default {
101
100
  onAsk(event, fn) {
102
101
  (0, assert_1.default)(typeof fn === "function", `Cannot listen to ask event "${event}": "${fn}" is not a function`);
103
102
  (0, assert_1.default)(!this.coreAnswerers.has(event), `Cannot add a listener to the ask event "${event}": event has already an answerer`);
103
+ // The map holds the un-parameterised handler: `onAsk` is generic over the
104
+ // event it registers, and what the map can say about all of them together
105
+ // is the base signature.
104
106
  this.coreAnswerers.set(event, fn);
105
107
  }
106
108
  /**
@@ -152,7 +154,10 @@ class KuzzleEventEmitter extends eventemitter3_1.default {
152
154
  typeof payload[payload.length - 1] === "function") {
153
155
  callback = payload.pop();
154
156
  }
155
- const events = getWildcardEvents(event);
157
+ // Named once: the event is the pipe's target and the seed of its
158
+ // wildcard list, and the callback context carries it too.
159
+ const eventName = event;
160
+ const events = getWildcardEvents(eventName);
156
161
  const funcs = [];
157
162
  for (const element of events) {
158
163
  const targets = this.pluginPipes.get(element);
@@ -164,11 +169,18 @@ class KuzzleEventEmitter extends eventemitter3_1.default {
164
169
  }
165
170
  // Create a context for the emitPluginPipe callback
166
171
  const promback = new promback_1.default(callback);
172
+ // What the callback needs, rather than the whole emitter: it is invoked
173
+ // with this object as its receiver, from `pipeRunner`, and reaching back
174
+ // into two private members through it was the only thing that asked for
175
+ // `instance`.
167
176
  const callbackContext = {
177
+ corePipes: this.corePipes,
168
178
  events,
169
- instance: this,
170
179
  promback,
171
- targetEvent: event,
180
+ superEmit: (ev, ...a) => {
181
+ this.superEmit(ev, ...a);
182
+ },
183
+ targetEvent: eventName,
172
184
  };
173
185
  if (funcs.length === 0) {
174
186
  pipeCallback.call(callbackContext, null, ...payload);
@@ -187,7 +199,10 @@ class KuzzleEventEmitter extends eventemitter3_1.default {
187
199
  if (!fn) {
188
200
  throw kerror.get("core", "fatal", "assertion_failed", `the requested ask event '${event}' doesn't have an answerer`);
189
201
  }
190
- const response = await fn(...args);
202
+ // `undefined` as the receiver, which is what `fn(...args)` passed: an
203
+ // answerer is registered as a bound function or an arrow, and handing it
204
+ // the emitter would be a new claim rather than a preserved one.
205
+ const response = await Reflect.apply(fn, undefined, args);
191
206
  for (const ev of getWildcardEvents(event)) {
192
207
  super.emit(ev, {
193
208
  args,
@@ -218,11 +233,17 @@ class KuzzleEventEmitter extends eventemitter3_1.default {
218
233
  * Registers a plugin hook.
219
234
  * Catch any error in the handler and emit the hook:onError event.
220
235
  */
221
- registerPluginHook(pluginName, event, fn) {
236
+ registerPluginHook(pluginName, event,
237
+ // Same as `registerPluginPipe`: a hook resolved from a plugin member is a
238
+ // function of unknown return, not necessarily `void | Promise<void>`.
239
+ fn) {
222
240
  this.on(event, (...args) => {
223
241
  try {
224
242
  const ret = fn(...args, event);
225
- if (typeof ret === "object" && typeof ret.catch === "function") {
243
+ if (typeof ret === "object" &&
244
+ ret !== null &&
245
+ "catch" in ret &&
246
+ typeof ret.catch === "function") {
226
247
  ret.catch((error) => {
227
248
  if (event !== "hook:onError") {
228
249
  this.emit("hook:onError", { error, event, pluginName });
@@ -243,11 +264,14 @@ class KuzzleEventEmitter extends eventemitter3_1.default {
243
264
  }
244
265
  });
245
266
  }
246
- registerPluginPipe(event, handler) {
247
- if (!this.pluginPipes.has(event)) {
248
- this.pluginPipes.set(event, []);
249
- }
250
- this.pluginPipes.get(event).push(handler);
267
+ registerPluginPipe(event,
268
+ // A plugin pipe may answer a promise OR take a trailing callback — the
269
+ // runner supports both, and `PluginsManager.registerPipe` hands it the
270
+ // callback form. The promise-only type described half of what is accepted.
271
+ handler) {
272
+ const registered = this.pluginPipes.get(event) ?? [];
273
+ registered.push(handler);
274
+ this.pluginPipes.set(event, registered);
251
275
  const definition = new PluginPipeDefinition(event, handler);
252
276
  this.pluginPipeDefinitions.set(definition.pipeId, definition);
253
277
  return definition.pipeId;
@@ -257,7 +281,7 @@ class KuzzleEventEmitter extends eventemitter3_1.default {
257
281
  if (!definition) {
258
282
  throw kerror.get("plugin", "runtime", "unknown_pipe", pipeId);
259
283
  }
260
- const handlers = this.pluginPipes.get(definition.event);
284
+ const handlers = this.pluginPipes.get(definition.event) ?? [];
261
285
  handlers.splice(handlers.indexOf(definition.handler), 1);
262
286
  if (handlers.length > 0) {
263
287
  this.pluginPipes.set(definition.event, handlers);
@@ -281,6 +305,9 @@ class KuzzleEventEmitter extends eventemitter3_1.default {
281
305
  * The context of this callback must be bound to this following object:
282
306
  * { instance: (kuzzle instance), promback, events }
283
307
  *
308
+ * Declared as `this`, rather than left implicit: the function is never called
309
+ * as a method, so the compiler has nothing else to read the receiver from.
310
+ *
284
311
  * @warning Critical section of code
285
312
  */
286
313
  async function pipeCallback(error, ...updated) {
@@ -289,12 +316,12 @@ async function pipeCallback(error, ...updated) {
289
316
  this.promback.reject(error);
290
317
  return;
291
318
  }
292
- const corePipes = this.instance.corePipes.get(this.targetEvent);
319
+ const corePipes = this.corePipes.get(this.targetEvent);
293
320
  if (corePipes) {
294
321
  await bluebird_1.default.map(corePipes, (fn) => fn(...updated));
295
322
  }
296
323
  for (const element of this.events) {
297
- this.instance.superEmit(element, ...updated);
324
+ this.superEmit(element, ...updated);
298
325
  }
299
326
  this.promback.resolve(updated[0]);
300
327
  /* eslint-enable no-invalid-this */
@@ -1,30 +1,51 @@
1
- export = PipeRunner;
1
+ import Denque from "denque";
2
+ /** A pipe in a chain: the payload, then the callback the pipe must call. */
3
+ type Pipe = (...args: unknown[]) => void;
4
+ /**
5
+ * How a pipe chain reports back to whoever asked for it to be run.
6
+ *
7
+ * The error is `unknown` for the same reason it is in `waterfall`: a pipe is
8
+ * plugin code and can call its callback with anything.
9
+ */
10
+ type PipeCallback = (error?: unknown, ...results: unknown[]) => void;
11
+ /**
12
+ * @private
13
+ */
14
+ declare class PipeChain {
15
+ readonly chain: Pipe[];
16
+ readonly args: unknown[];
17
+ readonly callback: PipeCallback;
18
+ readonly callbackContext: unknown;
19
+ constructor(chain: Pipe[], args: unknown[], callback: PipeCallback, callbackContext: unknown);
20
+ }
2
21
  /**
3
- * @class PipeRunner
4
22
  * Runs pipe chains if the number of already running concurrent pipes allows it.
5
23
  * Otherwise, delays the pipe chain until a slot is freed. If the storage
6
24
  * buffer is full, rejects the provided callback and discard the pipe chain.
7
- *
8
- * @param {Number} concurrent - max number of concurrent pipes
9
- * @param {Number} bufferSize - max number of delayed pipe chains
10
25
  */
11
26
  declare class PipeRunner {
12
- constructor(concurrent: any, bufferSize: any);
13
- maxConcurrent: number;
27
+ readonly maxConcurrent: number;
28
+ readonly maxBufferSize: number;
29
+ readonly buffer: Denque<PipeChain>;
30
+ /** Read and written by `waterfallCallback`, which runs outside the class. */
14
31
  running: number;
15
- maxBufferSize: number;
16
- buffer: Denque<any>;
17
- _boundRunNext: any;
32
+ /** Same: `waterfallCallback` schedules it, so it cannot be private. */
33
+ readonly _boundRunNext: () => void;
34
+ /**
35
+ * @param concurrent - max number of concurrent pipes
36
+ * @param bufferSize - max number of delayed pipe chains
37
+ */
38
+ constructor(concurrent: number, bufferSize: number);
18
39
  /**
19
40
  * @warning Critical code section
20
41
  *
21
42
  * Pipes can be run thousands of times per seconds
22
- * @param {Array} chain - functions chain
23
- * @param {Array} args - functions arguments
24
- * @param {Function} callback - end-of-chain callback
25
- * @param {Object} callbackContext - functions/callback context
43
+ * @param chain - functions chain
44
+ * @param args - functions arguments
45
+ * @param callback - end-of-chain callback
46
+ * @param callbackContext - functions/callback context
26
47
  */
27
- run(chain: any[], args: any[], callback: Function, callbackContext: any): void;
48
+ run(chain: Pipe[], args: unknown[], callback: PipeCallback, callbackContext: unknown): void;
28
49
  _runNext(): void;
29
50
  }
30
- import Denque = require("denque");
51
+ export = PipeRunner;
@@ -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,18 +19,48 @@
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 assert = require("assert");
23
- const Denque = require("denque");
24
- const { KuzzleError } = require("../../kerror/errors");
25
- const waterfall = require("./waterfall");
26
- const kerror = require("../../kerror").wrap("plugin", "runtime");
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 node_assert_1 = __importDefault(require("node:assert"));
49
+ const denque_1 = __importDefault(require("denque"));
50
+ const kerrorLib = __importStar(require("../../kerror"));
51
+ const errors_1 = require("../../kerror/errors");
52
+ const thrown_1 = require("../../util/thrown");
53
+ const waterfall_1 = __importDefault(require("./waterfall"));
54
+ const kerror = kerrorLib.wrap("plugin", "runtime");
27
55
  /**
28
56
  * We declare the callback used by waterfall one time instead
29
57
  * of redeclaring a closure each time we want to run the pipes.
30
58
  *
31
- * This callback must be called with the following object as context:
32
- * { instance: (pipeRunner instance), callback: (callback after pipes execution) }
59
+ * The declared `this` is what makes the accesses below check: the context is
60
+ * the object `run` builds.
61
+ *
62
+ * The suppression stays because it is ESLint's *core* `no-invalid-this`, which
63
+ * predates `this` parameters and cannot see the declaration.
33
64
  */
34
65
  /* eslint-disable no-invalid-this */
35
66
  function waterfallCallback(error, ...result) {
@@ -38,19 +69,28 @@ function waterfallCallback(error, ...result) {
38
69
  setImmediate(this.instance._boundRunNext);
39
70
  }
40
71
  if (error) {
41
- const cbError = error instanceof KuzzleError
42
- ? error
43
- : kerror.getFrom(error, "unexpected_error", error.message);
44
- this.callback.call(this.callbackContext, cbError);
72
+ this.callback.call(this.callbackContext, toKuzzleError(error));
45
73
  }
46
74
  else {
47
75
  this.callback.call(this.callbackContext, null, ...result);
48
76
  }
49
77
  }
50
78
  /* eslint-enable no-invalid-this */
79
+ /**
80
+ * Wraps whatever a pipe rejected with into a `KuzzleError`.
81
+ *
82
+ * The message is the rejected value's own `message`, as the JavaScript read
83
+ * it: a plugin rejecting with `{ message: "oops" }` says "oops", and one
84
+ * calling `cb("oops")` still says "undefined".
85
+ */
86
+ function toKuzzleError(error) {
87
+ if (error instanceof errors_1.KuzzleError) {
88
+ return error;
89
+ }
90
+ return kerror.getFrom(error, "unexpected_error", (0, thrown_1.causeOf)(error).message);
91
+ }
51
92
  /**
52
93
  * @private
53
- * @class PipeChain
54
94
  */
55
95
  class PipeChain {
56
96
  constructor(chain, args, callback, callbackContext) {
@@ -61,32 +101,32 @@ class PipeChain {
61
101
  }
62
102
  }
63
103
  /**
64
- * @class PipeRunner
65
104
  * Runs pipe chains if the number of already running concurrent pipes allows it.
66
105
  * Otherwise, delays the pipe chain until a slot is freed. If the storage
67
106
  * buffer is full, rejects the provided callback and discard the pipe chain.
68
- *
69
- * @param {Number} concurrent - max number of concurrent pipes
70
- * @param {Number} bufferSize - max number of delayed pipe chains
71
107
  */
72
108
  class PipeRunner {
109
+ /**
110
+ * @param concurrent - max number of concurrent pipes
111
+ * @param bufferSize - max number of delayed pipe chains
112
+ */
73
113
  constructor(concurrent, bufferSize) {
74
- assert(typeof concurrent === "number" && concurrent > 0, "Cannot instantiate pipes executor: invalid maxConcurrentPipes parameter value");
75
- assert(typeof bufferSize === "number" && bufferSize > 0, "Cannot instantiate pipes executor: invalid pipesBufferSize parameter value");
114
+ (0, node_assert_1.default)(typeof concurrent === "number" && concurrent > 0, "Cannot instantiate pipes executor: invalid maxConcurrentPipes parameter value");
115
+ (0, node_assert_1.default)(typeof bufferSize === "number" && bufferSize > 0, "Cannot instantiate pipes executor: invalid pipesBufferSize parameter value");
76
116
  this.maxConcurrent = concurrent;
77
117
  this.running = 0;
78
118
  this.maxBufferSize = bufferSize;
79
- this.buffer = new Denque();
119
+ this.buffer = new denque_1.default();
80
120
  this._boundRunNext = this._runNext.bind(this);
81
121
  }
82
122
  /**
83
123
  * @warning Critical code section
84
124
  *
85
125
  * Pipes can be run thousands of times per seconds
86
- * @param {Array} chain - functions chain
87
- * @param {Array} args - functions arguments
88
- * @param {Function} callback - end-of-chain callback
89
- * @param {Object} callbackContext - functions/callback context
126
+ * @param chain - functions chain
127
+ * @param args - functions arguments
128
+ * @param callback - end-of-chain callback
129
+ * @param callbackContext - functions/callback context
90
130
  */
91
131
  run(chain, args, callback, callbackContext) {
92
132
  if (this.running >= this.maxConcurrent) {
@@ -105,13 +145,20 @@ class PipeRunner {
105
145
  callbackContext,
106
146
  instance: this,
107
147
  };
108
- waterfall(chain, args, waterfallCallback, waterfallCallbackCtx);
148
+ (0, waterfall_1.default)(chain, args, waterfallCallback, waterfallCallbackCtx);
109
149
  }
110
150
  _runNext() {
111
- if (this.buffer.isEmpty() || this.running >= this.maxConcurrent) {
151
+ if (this.running >= this.maxConcurrent) {
112
152
  return;
113
153
  }
154
+ // One lookup rather than `isEmpty()` and then `shift()`: `shift()` on an
155
+ // empty Denque returns `undefined` and mutates nothing, so the two forms
156
+ // agree, and this one leaves no invariant for the compiler to take on
157
+ // trust.
114
158
  const pipe = this.buffer.shift();
159
+ if (!pipe) {
160
+ return;
161
+ }
115
162
  this.run(pipe.chain, pipe.args, pipe.callback, pipe.callbackContext);
116
163
  }
117
164
  }
@@ -1,2 +1,12 @@
1
+ /** A step in the chain: the payload, then the callback the step must call. */
2
+ type WaterfallStep = (...args: unknown[]) => void;
3
+ /**
4
+ * How a step — and the waterfall itself — reports back.
5
+ *
6
+ * The error is `unknown`, not `Error`: a step is arbitrary plugin code and can
7
+ * call its callback with anything at all. `pipeRunner` is what turns whatever
8
+ * arrives into a `KuzzleError`.
9
+ */
10
+ type WaterfallCallback = (error?: unknown, ...results: unknown[]) => void;
11
+ declare function waterfall(chain: WaterfallStep[], args: unknown[], cb: WaterfallCallback, context?: unknown): void;
1
12
  export = waterfall;
2
- declare function waterfall(chain: any, args: any, cb: any, context: any): void;
@@ -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,13 +19,12 @@
18
19
  * See the License for the specific language governing permissions and
19
20
  * limitations under the License.
20
21
  */
21
- "use strict";
22
22
  class WaterfallContext {
23
23
  /**
24
- * @param {Array} chain - list of functions to call
25
- * @param {Array} args - function arguments
26
- * @param {Function} cb - end of waterfall callback
27
- * @param {Object} cbCtx - functions context
24
+ * @param chain - list of functions to call
25
+ * @param args - function arguments
26
+ * @param cb - end of waterfall callback
27
+ * @param cbCtx - functions context
28
28
  */
29
29
  constructor(chain, args, cb, cbCtx) {
30
30
  this.chain = chain;
@@ -37,9 +37,6 @@ class WaterfallContext {
37
37
  // sure that all pipe methods receive the same payload
38
38
  this.args = args.length ? args : [null];
39
39
  }
40
- hasNext() {
41
- return this.index < this.chain.length;
42
- }
43
40
  /**
44
41
  * Each function in the waterfall chain returns a result. This result should
45
42
  * always be the 1st payload argument (updated or left intact, it matters not)
@@ -47,9 +44,30 @@ class WaterfallContext {
47
44
  set result(result) {
48
45
  this.args[0] = result;
49
46
  }
50
- next(cb) {
51
- this.index++;
52
- this.chain[this.index - 1](...this.args, cb);
47
+ /** Whether every step of the chain has been run. */
48
+ get exhausted() {
49
+ return this.index >= this.chain.length;
50
+ }
51
+ /**
52
+ * Runs the next step against the current payload and advances.
53
+ *
54
+ * The two questions this file asks are about different things: `exhausted`
55
+ * is about the *chain*, this is about the *value*. Collapsing them into one
56
+ * truthiness test — which is what the first conversion did — resolves the
57
+ * waterfall early on a chain entry that is not callable, silently skipping
58
+ * every remaining step (TD-55, #2758). A pipe chain is where a plugin denies
59
+ * a request, so the one outcome it must not have is a silent success.
60
+ *
61
+ * The JavaScript called `undefined(...)` and let the `TypeError` reach
62
+ * `waterfallNext`'s `try`. The throw below is that, spelled, because
63
+ * `noUncheckedIndexedAccess` does not let the call be written directly.
64
+ */
65
+ invokeNext(cb) {
66
+ const step = this.chain[this.index++];
67
+ if (step === undefined) {
68
+ throw new TypeError(`waterfall: chain step ${this.index - 1} is not a function`);
69
+ }
70
+ step(...this.args, cb);
53
71
  }
54
72
  reject(error) {
55
73
  this.cb.call(this.cbCtx, error);
@@ -59,6 +77,13 @@ class WaterfallContext {
59
77
  this.cb.call(this.cbCtx, null, ...this.args);
60
78
  }
61
79
  }
80
+ /**
81
+ * The declared `this` is what makes the accesses below check: the context is
82
+ * always the `WaterfallContext` bound at the call site.
83
+ *
84
+ * The suppression stays because it is ESLint's *core* `no-invalid-this`, which
85
+ * predates `this` parameters and cannot see the declaration.
86
+ */
62
87
  /* eslint-disable no-invalid-this */
63
88
  function waterfallCB(err, res) {
64
89
  if (err) {
@@ -71,12 +96,12 @@ function waterfallCB(err, res) {
71
96
  }
72
97
  /* eslint-enable no-invalid-this */
73
98
  function waterfallNext(ctx) {
74
- if (!ctx.hasNext()) {
99
+ if (ctx.exhausted) {
75
100
  ctx.resolve();
76
101
  return;
77
102
  }
78
103
  try {
79
- ctx.next(waterfallCB.bind(ctx));
104
+ ctx.invokeNext(waterfallCB.bind(ctx));
80
105
  }
81
106
  catch (error) {
82
107
  ctx.reject(error);