kuzzle 2.49.0 → 2.50.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (592) hide show
  1. package/dist/bin/check-node-version.js +11 -0
  2. package/dist/bin/copy-protobuf.js +17 -0
  3. package/dist/lib/api/controllers/adminController.d.ts +51 -0
  4. package/dist/lib/api/controllers/adminController.js +191 -0
  5. package/{lib → dist/lib}/api/controllers/authController.d.ts +20 -40
  6. package/{lib → dist/lib}/api/controllers/authController.js +23 -24
  7. package/dist/lib/api/controllers/bulkController.d.ts +46 -0
  8. package/dist/lib/api/controllers/bulkController.js +132 -0
  9. package/dist/lib/api/controllers/clusterController.d.ts +6 -0
  10. package/{lib → dist/lib}/api/controllers/clusterController.js +7 -11
  11. package/dist/lib/api/controllers/collectionController.d.ts +136 -0
  12. package/dist/lib/api/controllers/collectionController.js +356 -0
  13. package/dist/lib/api/controllers/documentController.d.ts +181 -0
  14. package/dist/lib/api/controllers/documentController.js +768 -0
  15. package/dist/lib/api/controllers/index.d.ts +12 -0
  16. package/{lib → dist/lib}/api/controllers/index.js +13 -14
  17. package/dist/lib/api/controllers/indexController.d.ts +65 -0
  18. package/dist/lib/api/controllers/indexController.js +139 -0
  19. package/dist/lib/api/controllers/memoryStorageController.d.ts +8 -0
  20. package/dist/lib/api/controllers/memoryStorageController.js +867 -0
  21. package/dist/lib/api/controllers/realtimeController.d.ts +47 -0
  22. package/dist/lib/api/controllers/realtimeController.js +128 -0
  23. package/dist/lib/api/controllers/securityController.d.ts +423 -0
  24. package/dist/lib/api/controllers/securityController.js +1139 -0
  25. package/dist/lib/api/controllers/serverController.d.ts +82 -0
  26. package/dist/lib/api/controllers/serverController.js +321 -0
  27. package/dist/lib/api/documentExtractor.d.ts +9 -0
  28. package/dist/lib/api/documentExtractor.js +274 -0
  29. package/dist/lib/api/funnel.d.ts +183 -0
  30. package/dist/lib/api/funnel.js +821 -0
  31. package/dist/lib/api/httpRoutes.d.ts +17 -0
  32. package/dist/lib/api/httpRoutes.js +1496 -0
  33. package/dist/lib/api/rateLimiter.d.ts +18 -0
  34. package/dist/lib/api/rateLimiter.js +74 -0
  35. package/{lib → dist/lib}/api/request/kuzzleRequest.d.ts +2 -2
  36. package/{lib → dist/lib}/api/request/requestContext.d.ts +2 -1
  37. package/dist/lib/cluster/command.d.ts +73 -0
  38. package/dist/lib/cluster/command.js +236 -0
  39. package/dist/lib/cluster/index.d.ts +2 -0
  40. package/{lib → dist/lib}/cluster/index.js +1 -2
  41. package/dist/lib/cluster/node.d.ts +278 -0
  42. package/dist/lib/cluster/node.js +876 -0
  43. package/dist/lib/cluster/publisher.d.ts +188 -0
  44. package/dist/lib/cluster/publisher.js +347 -0
  45. package/dist/lib/cluster/subscriber.d.ts +269 -0
  46. package/dist/lib/cluster/subscriber.js +555 -0
  47. package/dist/lib/cluster/workers/IDCardRenewer.d.ts +13 -0
  48. package/dist/lib/cluster/workers/IDCardRenewer.js +120 -0
  49. package/{lib → dist/lib}/config/documentEventAliases.d.ts +1 -2
  50. package/dist/lib/config/index.d.ts +5 -0
  51. package/dist/lib/config/index.js +244 -0
  52. package/dist/lib/config/sdkCompatibility.json +9 -0
  53. package/dist/lib/core/auth/formatProcessing.d.ts +30 -0
  54. package/dist/lib/core/auth/formatProcessing.js +55 -0
  55. package/dist/lib/core/auth/passportResponse.d.ts +15 -0
  56. package/{lib → dist/lib}/core/auth/passportResponse.js +24 -30
  57. package/dist/lib/core/auth/passportWrapper.d.ts +28 -0
  58. package/dist/lib/core/auth/passportWrapper.js +126 -0
  59. package/{lib → dist/lib}/core/backend/backendConfig.js +2 -2
  60. package/{lib → dist/lib}/core/backend/backendErrors.js +9 -12
  61. package/dist/lib/core/cache/cacheEngine.d.ts +15 -0
  62. package/dist/lib/core/cache/cacheEngine.js +205 -0
  63. package/dist/lib/core/network/accessLogger.d.ts +29 -0
  64. package/dist/lib/core/network/accessLogger.js +250 -0
  65. package/dist/lib/core/network/clientConnection.d.ts +15 -0
  66. package/{lib → dist/lib}/core/network/clientConnection.js +17 -24
  67. package/dist/lib/core/network/context.d.ts +42 -0
  68. package/dist/lib/core/network/context.js +57 -0
  69. package/dist/lib/core/network/entryPoint.d.ts +62 -0
  70. package/dist/lib/core/network/entryPoint.js +261 -0
  71. package/dist/lib/core/network/httpRouter/index.d.ts +85 -0
  72. package/dist/lib/core/network/httpRouter/index.js +258 -0
  73. package/dist/lib/core/network/httpRouter/routeHandler.d.ts +46 -0
  74. package/dist/lib/core/network/httpRouter/routeHandler.js +101 -0
  75. package/dist/lib/core/network/httpRouter/routePart.d.ts +35 -0
  76. package/dist/lib/core/network/httpRouter/routePart.js +117 -0
  77. package/dist/lib/core/network/protocolManifest.d.ts +6 -0
  78. package/{lib → dist/lib}/core/network/protocolManifest.js +5 -9
  79. package/dist/lib/core/network/protocols/httpMessage.d.ts +22 -0
  80. package/dist/lib/core/network/protocols/httpMessage.js +62 -0
  81. package/dist/lib/core/network/protocols/httpwsProtocol.d.ts +171 -0
  82. package/dist/lib/core/network/protocols/httpwsProtocol.js +921 -0
  83. package/dist/lib/core/network/protocols/internalProtocol.d.ts +27 -0
  84. package/dist/lib/core/network/protocols/internalProtocol.js +82 -0
  85. package/dist/lib/core/network/protocols/mqttProtocol.d.ts +39 -0
  86. package/dist/lib/core/network/protocols/mqttProtocol.js +219 -0
  87. package/dist/lib/core/network/protocols/protocol.d.ts +26 -0
  88. package/dist/lib/core/network/protocols/protocol.js +74 -0
  89. package/dist/lib/core/network/router.d.ts +49 -0
  90. package/dist/lib/core/network/router.js +193 -0
  91. package/dist/lib/core/plugin/plugin.d.ts +56 -0
  92. package/dist/lib/core/plugin/plugin.js +282 -0
  93. package/{lib → dist/lib}/core/plugin/pluginContext.js +2 -2
  94. package/dist/lib/core/plugin/pluginManifest.d.ts +5 -0
  95. package/{lib → dist/lib}/core/plugin/pluginManifest.js +16 -27
  96. package/dist/lib/core/plugin/pluginRepository.d.ts +53 -0
  97. package/dist/lib/core/plugin/pluginRepository.js +112 -0
  98. package/dist/lib/core/plugin/pluginsManager.d.ts +190 -0
  99. package/dist/lib/core/plugin/pluginsManager.js +817 -0
  100. package/dist/lib/core/plugin/privilegedContext.d.ts +14 -0
  101. package/{lib → dist/lib}/core/plugin/privilegedContext.js +10 -14
  102. package/dist/lib/core/realtime/actionEnum.d.ts +25 -0
  103. package/{lib → dist/lib}/core/realtime/actionEnum.js +7 -10
  104. package/dist/lib/core/realtime/index.d.ts +8 -0
  105. package/{lib → dist/lib}/core/realtime/index.js +9 -13
  106. package/dist/lib/core/realtime/notification/document.d.ts +34 -0
  107. package/dist/lib/core/realtime/notification/document.js +98 -0
  108. package/dist/lib/core/realtime/notification/index.d.ts +3 -0
  109. package/{lib → dist/lib}/core/realtime/notification/index.js +4 -5
  110. package/dist/lib/core/realtime/notification/server.d.ts +17 -0
  111. package/{lib → dist/lib}/core/realtime/notification/server.js +8 -10
  112. package/dist/lib/core/realtime/notification/user.d.ts +29 -0
  113. package/dist/lib/core/realtime/notification/user.js +66 -0
  114. package/dist/lib/core/realtime/notifier.d.ts +171 -0
  115. package/dist/lib/core/realtime/notifier.js +405 -0
  116. package/dist/lib/core/security/index.d.ts +14 -0
  117. package/{lib → dist/lib}/core/security/index.js +15 -19
  118. package/dist/lib/core/security/roleRepository.d.ts +143 -0
  119. package/dist/lib/core/security/roleRepository.js +445 -0
  120. package/dist/lib/core/security/securityLoader.d.ts +24 -0
  121. package/dist/lib/core/security/securityLoader.js +125 -0
  122. package/{lib → dist/lib}/core/security/tokenRepository.js +1 -1
  123. package/dist/lib/core/security/userRepository.d.ts +81 -0
  124. package/dist/lib/core/security/userRepository.js +346 -0
  125. package/dist/lib/core/shared/abstractManifest.d.ts +27 -0
  126. package/dist/lib/core/shared/abstractManifest.js +85 -0
  127. package/dist/lib/core/shared/sdk/impersonatedSdk.d.ts +7 -0
  128. package/dist/lib/core/shared/sdk/impersonatedSdk.js +80 -0
  129. package/{lib → dist/lib}/core/shared/store.d.ts +2 -2
  130. package/dist/lib/core/statistics/statistics.d.ts +94 -0
  131. package/dist/lib/core/statistics/statistics.js +287 -0
  132. package/dist/lib/core/storage/clientAdapter.d.ts +62 -0
  133. package/dist/lib/core/storage/clientAdapter.js +756 -0
  134. package/dist/lib/core/storage/storageEngine.d.ts +13 -0
  135. package/dist/lib/core/storage/storageEngine.js +52 -0
  136. package/dist/lib/core/validation/baseType.d.ts +35 -0
  137. package/dist/lib/core/validation/baseType.js +70 -0
  138. package/dist/lib/core/validation/types/anything.d.ts +10 -0
  139. package/{lib → dist/lib}/core/validation/types/anything.js +7 -10
  140. package/dist/lib/core/validation/types/boolean.d.ts +16 -0
  141. package/{lib → dist/lib}/core/validation/types/boolean.js +18 -23
  142. package/dist/lib/core/validation/types/date.d.ts +17 -0
  143. package/dist/lib/core/validation/types/date.js +215 -0
  144. package/dist/lib/core/validation/types/email.d.ts +17 -0
  145. package/dist/lib/core/validation/types/email.js +80 -0
  146. package/dist/lib/core/validation/types/enum.d.ts +17 -0
  147. package/dist/lib/core/validation/types/enum.js +70 -0
  148. package/dist/lib/core/validation/types/geoPoint.d.ts +17 -0
  149. package/{lib → dist/lib}/core/validation/types/geoPoint.js +19 -24
  150. package/dist/lib/core/validation/types/geoShape.d.ts +31 -0
  151. package/dist/lib/core/validation/types/geoShape.js +280 -0
  152. package/dist/lib/core/validation/types/integer.d.ts +7 -0
  153. package/{lib → dist/lib}/core/validation/types/integer.js +21 -27
  154. package/dist/lib/core/validation/types/ipAddress.d.ts +17 -0
  155. package/dist/lib/core/validation/types/ipAddress.js +73 -0
  156. package/dist/lib/core/validation/types/numeric.d.ts +17 -0
  157. package/dist/lib/core/validation/types/numeric.js +84 -0
  158. package/dist/lib/core/validation/types/object.d.ts +24 -0
  159. package/dist/lib/core/validation/types/object.js +74 -0
  160. package/dist/lib/core/validation/types/string.d.ts +17 -0
  161. package/dist/lib/core/validation/types/string.js +85 -0
  162. package/dist/lib/core/validation/types/url.d.ts +17 -0
  163. package/dist/lib/core/validation/types/url.js +73 -0
  164. package/dist/lib/core/validation/validation.d.ts +113 -0
  165. package/dist/lib/core/validation/validation.js +692 -0
  166. package/dist/lib/kerror/codes/0-core.json +194 -0
  167. package/dist/lib/kerror/codes/1-services.json +351 -0
  168. package/dist/lib/kerror/codes/2-api.json +195 -0
  169. package/dist/lib/kerror/codes/3-network.json +151 -0
  170. package/dist/lib/kerror/codes/4-plugin.json +498 -0
  171. package/dist/lib/kerror/codes/5-validation.json +158 -0
  172. package/dist/lib/kerror/codes/6-protocol.json +28 -0
  173. package/dist/lib/kerror/codes/7-security.json +283 -0
  174. package/dist/lib/kerror/codes/8-cluster.json +16 -0
  175. package/dist/lib/kerror/codes/index.d.ts +24 -0
  176. package/dist/lib/kerror/codes/index.js +140 -0
  177. package/{lib → dist/lib}/kerror/index.d.ts +5 -5
  178. package/{lib → dist/lib}/kuzzle/Logger.d.ts +6 -0
  179. package/{lib → dist/lib}/kuzzle/Logger.js +26 -5
  180. package/dist/lib/kuzzle/dumpGenerator.d.ts +14 -0
  181. package/dist/lib/kuzzle/dumpGenerator.js +180 -0
  182. package/dist/lib/kuzzle/event/pipeRunner.d.ts +30 -0
  183. package/dist/lib/kuzzle/event/pipeRunner.js +119 -0
  184. package/dist/lib/kuzzle/event/waterfall.d.ts +2 -0
  185. package/dist/lib/kuzzle/event/waterfall.js +90 -0
  186. package/dist/lib/kuzzle/internalIndexHandler.d.ts +186 -0
  187. package/dist/lib/kuzzle/internalIndexHandler.js +174 -0
  188. package/{lib → dist/lib}/kuzzle/kuzzle.d.ts +6 -7
  189. package/{lib → dist/lib}/kuzzle/kuzzle.js +5 -2
  190. package/dist/lib/kuzzle/kuzzleStateEnum.d.ts +20 -0
  191. package/{lib → dist/lib}/kuzzle/kuzzleStateEnum.js +5 -8
  192. package/dist/lib/kuzzle/vault.d.ts +2 -0
  193. package/dist/lib/kuzzle/vault.js +63 -0
  194. package/dist/lib/model/security/rights.d.ts +8 -0
  195. package/{lib → dist/lib}/model/security/rights.js +4 -8
  196. package/{lib → dist/lib}/model/security/role.d.ts +1 -1
  197. package/{lib → dist/lib}/model/security/user.d.ts +1 -0
  198. package/dist/lib/model/storage/apiKey.d.ts +49 -0
  199. package/dist/lib/model/storage/apiKey.js +126 -0
  200. package/dist/lib/model/storage/baseModel.d.ts +100 -0
  201. package/dist/lib/model/storage/baseModel.js +211 -0
  202. package/dist/lib/service/cache/redis.d.ts +74 -0
  203. package/dist/lib/service/cache/redis.js +237 -0
  204. package/dist/lib/service/service.d.ts +30 -0
  205. package/dist/lib/service/service.js +74 -0
  206. package/{lib → dist/lib}/service/storage/7/elasticsearch.d.ts +2 -2
  207. package/{lib → dist/lib}/service/storage/7/elasticsearch.js +23 -25
  208. package/dist/lib/service/storage/7/esWrapper.d.ts +19 -0
  209. package/dist/lib/service/storage/7/esWrapper.js +245 -0
  210. package/{lib → dist/lib}/service/storage/8/elasticsearch.js +23 -25
  211. package/dist/lib/service/storage/8/esWrapper.d.ts +19 -0
  212. package/dist/lib/service/storage/8/esWrapper.js +245 -0
  213. package/{lib → dist/lib}/types/Plugin.d.ts +1 -1
  214. package/{lib/types → dist/lib/types/controllers}/Controller.d.ts +2 -2
  215. package/{lib/types → dist/lib/types/controllers}/ControllerDefinition.d.ts +1 -1
  216. package/dist/lib/types/controllers/adminControlller.type.d.ts +5 -0
  217. package/dist/lib/types/controllers/adminControlller.type.js +3 -0
  218. package/dist/lib/types/controllers/authController.type.d.ts +5 -0
  219. package/dist/lib/types/controllers/authController.type.js +3 -0
  220. package/dist/lib/types/core/auth/formatProcessing.type.d.ts +7 -0
  221. package/dist/lib/types/core/auth/formatProcessing.type.js +3 -0
  222. package/{lib → dist/lib}/types/index.d.ts +3 -3
  223. package/{lib → dist/lib}/types/index.js +3 -3
  224. package/dist/lib/util/assertType.d.ts +41 -0
  225. package/{lib → dist/lib}/util/assertType.js +38 -56
  226. package/dist/lib/util/asyncStore.d.ts +38 -0
  227. package/dist/lib/util/asyncStore.js +70 -0
  228. package/dist/lib/util/bytes.d.ts +2 -0
  229. package/dist/lib/util/bytes.js +33 -0
  230. package/dist/lib/util/debug.d.ts +2 -0
  231. package/{lib → dist/lib}/util/debug.js +15 -23
  232. package/dist/lib/util/deprecate.d.ts +1 -0
  233. package/dist/lib/util/deprecate.js +64 -0
  234. package/dist/lib/util/didYouMean.d.ts +2 -0
  235. package/{lib → dist/lib}/util/didYouMean.js +9 -15
  236. package/dist/lib/util/extractFields.d.ts +17 -0
  237. package/{lib → dist/lib}/util/extractFields.js +18 -32
  238. package/dist/lib/util/memoize.d.ts +7 -0
  239. package/{lib → dist/lib}/util/memoize.js +14 -21
  240. package/dist/lib/util/promback.d.ts +13 -0
  241. package/dist/lib/util/promback.js +60 -0
  242. package/dist/lib/util/requestAssertions.d.ts +10 -0
  243. package/dist/lib/util/requestAssertions.js +143 -0
  244. package/dist/lib/util/safeObject.d.ts +3 -0
  245. package/{lib → dist/lib}/util/safeObject.js +7 -13
  246. package/dist/lib/util/stackTrace.d.ts +19 -0
  247. package/{lib → dist/lib}/util/stackTrace.js +35 -41
  248. package/dist/lib/util/wildcard.d.ts +1 -0
  249. package/{lib → dist/lib}/util/wildcard.js +21 -30
  250. package/dist/package.json +120 -0
  251. package/package.json +45 -58
  252. package/bin/start-kuzzle-server +0 -126
  253. package/check-node-version.js +0 -17
  254. package/lib/api/controllers/adminController.js +0 -229
  255. package/lib/api/controllers/bulkController.js +0 -210
  256. package/lib/api/controllers/collectionController.js +0 -502
  257. package/lib/api/controllers/documentController.js +0 -1156
  258. package/lib/api/controllers/indexController.js +0 -179
  259. package/lib/api/controllers/memoryStorageController.js +0 -1023
  260. package/lib/api/controllers/realtimeController.js +0 -155
  261. package/lib/api/controllers/securityController.js +0 -1571
  262. package/lib/api/controllers/serverController.js +0 -381
  263. package/lib/api/documentExtractor.js +0 -309
  264. package/lib/api/funnel.js +0 -1143
  265. package/lib/api/httpRoutes.js +0 -1547
  266. package/lib/api/rateLimiter.js +0 -87
  267. package/lib/cluster/command.js +0 -284
  268. package/lib/cluster/node.js +0 -1203
  269. package/lib/cluster/publisher.js +0 -386
  270. package/lib/cluster/subscriber.js +0 -776
  271. package/lib/cluster/workers/IDCardRenewer.js +0 -144
  272. package/lib/config/index.js +0 -351
  273. package/lib/config/sdkCompatibility.json +0 -9
  274. package/lib/core/auth/formatProcessing.js +0 -66
  275. package/lib/core/auth/passportWrapper.js +0 -126
  276. package/lib/core/cache/cacheEngine.js +0 -278
  277. package/lib/core/network/accessLogger.js +0 -322
  278. package/lib/core/network/context.js +0 -80
  279. package/lib/core/network/entryPoint.js +0 -358
  280. package/lib/core/network/httpRouter/index.js +0 -316
  281. package/lib/core/network/httpRouter/routeHandler.js +0 -111
  282. package/lib/core/network/httpRouter/routePart.js +0 -147
  283. package/lib/core/network/protocols/httpMessage.js +0 -69
  284. package/lib/core/network/protocols/httpwsProtocol.js +0 -1254
  285. package/lib/core/network/protocols/internalProtocol.js +0 -109
  286. package/lib/core/network/protocols/mqttProtocol.js +0 -291
  287. package/lib/core/network/protocols/protocol.js +0 -102
  288. package/lib/core/network/router.js +0 -255
  289. package/lib/core/plugin/plugin.js +0 -436
  290. package/lib/core/plugin/pluginRepository.js +0 -132
  291. package/lib/core/plugin/pluginsManager.js +0 -1244
  292. package/lib/core/realtime/notification/document.js +0 -108
  293. package/lib/core/realtime/notification/user.js +0 -70
  294. package/lib/core/realtime/notifier.js +0 -541
  295. package/lib/core/security/README.md +0 -223
  296. package/lib/core/security/roleRepository.js +0 -569
  297. package/lib/core/security/securityLoader.js +0 -174
  298. package/lib/core/security/userRepository.js +0 -446
  299. package/lib/core/shared/README.md +0 -3
  300. package/lib/core/shared/abstractManifest.js +0 -102
  301. package/lib/core/shared/sdk/impersonatedSdk.js +0 -94
  302. package/lib/core/statistics/index.js +0 -24
  303. package/lib/core/statistics/statistics.js +0 -373
  304. package/lib/core/storage/clientAdapter.js +0 -1045
  305. package/lib/core/storage/storageEngine.js +0 -63
  306. package/lib/core/validation/baseType.js +0 -80
  307. package/lib/core/validation/index.js +0 -24
  308. package/lib/core/validation/types/date.js +0 -284
  309. package/lib/core/validation/types/email.js +0 -92
  310. package/lib/core/validation/types/enum.js +0 -100
  311. package/lib/core/validation/types/geoShape.js +0 -370
  312. package/lib/core/validation/types/ipAddress.js +0 -83
  313. package/lib/core/validation/types/numeric.js +0 -108
  314. package/lib/core/validation/types/object.js +0 -88
  315. package/lib/core/validation/types/string.js +0 -110
  316. package/lib/core/validation/types/url.js +0 -83
  317. package/lib/core/validation/validation.js +0 -1180
  318. package/lib/kerror/codes/0-core.json +0 -194
  319. package/lib/kerror/codes/1-services.json +0 -351
  320. package/lib/kerror/codes/2-api.json +0 -195
  321. package/lib/kerror/codes/3-network.json +0 -151
  322. package/lib/kerror/codes/4-plugin.json +0 -498
  323. package/lib/kerror/codes/5-validation.json +0 -158
  324. package/lib/kerror/codes/6-protocol.json +0 -28
  325. package/lib/kerror/codes/7-security.json +0 -283
  326. package/lib/kerror/codes/8-cluster.json +0 -16
  327. package/lib/kerror/codes/index.js +0 -208
  328. package/lib/kuzzle/dumpGenerator.js +0 -259
  329. package/lib/kuzzle/event/pipeRunner.js +0 -144
  330. package/lib/kuzzle/event/waterfall.js +0 -101
  331. package/lib/kuzzle/internalIndexHandler.js +0 -234
  332. package/lib/kuzzle/vault.js +0 -89
  333. package/lib/model/storage/apiKey.js +0 -158
  334. package/lib/model/storage/baseModel.js +0 -275
  335. package/lib/service/cache/redis.js +0 -282
  336. package/lib/service/service.js +0 -84
  337. package/lib/service/storage/7/esWrapper.js +0 -303
  338. package/lib/service/storage/8/esWrapper.js +0 -303
  339. package/lib/util/asyncStore.js +0 -112
  340. package/lib/util/bytes.js +0 -36
  341. package/lib/util/deprecate.js +0 -82
  342. package/lib/util/promback.js +0 -66
  343. package/lib/util/readYamlFile.d.ts +0 -2
  344. package/lib/util/readYamlFile.js +0 -10
  345. package/lib/util/requestAssertions.js +0 -157
  346. /package/{index.d.ts → dist/index.d.ts} +0 -0
  347. /package/{index.js → dist/index.js} +0 -0
  348. /package/{lib → dist/lib}/api/controllers/baseController.d.ts +0 -0
  349. /package/{lib → dist/lib}/api/controllers/baseController.js +0 -0
  350. /package/{lib → dist/lib}/api/controllers/debugController.d.ts +0 -0
  351. /package/{lib → dist/lib}/api/controllers/debugController.js +0 -0
  352. /package/{lib → dist/lib}/api/openapi/OpenApiManager.d.ts +0 -0
  353. /package/{lib → dist/lib}/api/openapi/OpenApiManager.js +0 -0
  354. /package/{lib → dist/lib}/api/openapi/index.d.ts +0 -0
  355. /package/{lib → dist/lib}/api/openapi/index.js +0 -0
  356. /package/{lib → dist/lib}/api/openapi/openApiGenerator.d.ts +0 -0
  357. /package/{lib → dist/lib}/api/openapi/openApiGenerator.js +0 -0
  358. /package/{lib → dist/lib}/api/request/index.d.ts +0 -0
  359. /package/{lib → dist/lib}/api/request/index.js +0 -0
  360. /package/{lib → dist/lib}/api/request/kuzzleRequest.js +0 -0
  361. /package/{lib → dist/lib}/api/request/requestContext.js +0 -0
  362. /package/{lib → dist/lib}/api/request/requestInput.d.ts +0 -0
  363. /package/{lib → dist/lib}/api/request/requestInput.js +0 -0
  364. /package/{lib → dist/lib}/api/request/requestResponse.d.ts +0 -0
  365. /package/{lib → dist/lib}/api/request/requestResponse.js +0 -0
  366. /package/{lib → dist/lib}/cluster/idCardHandler.d.ts +0 -0
  367. /package/{lib → dist/lib}/cluster/idCardHandler.js +0 -0
  368. /package/{lib → dist/lib}/cluster/protobuf/command.proto +0 -0
  369. /package/{lib → dist/lib}/cluster/protobuf/sync.proto +0 -0
  370. /package/{lib → dist/lib}/cluster/state.d.ts +0 -0
  371. /package/{lib → dist/lib}/cluster/state.js +0 -0
  372. /package/{lib → dist/lib}/config/default.config.d.ts +0 -0
  373. /package/{lib → dist/lib}/config/default.config.js +0 -0
  374. /package/{lib → dist/lib}/config/documentEventAliases.js +0 -0
  375. /package/{lib → dist/lib}/core/auth/tokenManager.d.ts +0 -0
  376. /package/{lib → dist/lib}/core/auth/tokenManager.js +0 -0
  377. /package/{lib → dist/lib}/core/backend/applicationManager.d.ts +0 -0
  378. /package/{lib → dist/lib}/core/backend/applicationManager.js +0 -0
  379. /package/{lib → dist/lib}/core/backend/backend.d.ts +0 -0
  380. /package/{lib → dist/lib}/core/backend/backend.js +0 -0
  381. /package/{lib → dist/lib}/core/backend/backendCluster.d.ts +0 -0
  382. /package/{lib → dist/lib}/core/backend/backendCluster.js +0 -0
  383. /package/{lib → dist/lib}/core/backend/backendConfig.d.ts +0 -0
  384. /package/{lib → dist/lib}/core/backend/backendController.d.ts +0 -0
  385. /package/{lib → dist/lib}/core/backend/backendController.js +0 -0
  386. /package/{lib → dist/lib}/core/backend/backendErrors.d.ts +0 -0
  387. /package/{lib → dist/lib}/core/backend/backendHook.d.ts +0 -0
  388. /package/{lib → dist/lib}/core/backend/backendHook.js +0 -0
  389. /package/{lib → dist/lib}/core/backend/backendImport.d.ts +0 -0
  390. /package/{lib → dist/lib}/core/backend/backendImport.js +0 -0
  391. /package/{lib → dist/lib}/core/backend/backendOpenApi.d.ts +0 -0
  392. /package/{lib → dist/lib}/core/backend/backendOpenApi.js +0 -0
  393. /package/{lib → dist/lib}/core/backend/backendPipe.d.ts +0 -0
  394. /package/{lib → dist/lib}/core/backend/backendPipe.js +0 -0
  395. /package/{lib → dist/lib}/core/backend/backendPlugin.d.ts +0 -0
  396. /package/{lib → dist/lib}/core/backend/backendPlugin.js +0 -0
  397. /package/{lib → dist/lib}/core/backend/backendStorage.d.ts +0 -0
  398. /package/{lib → dist/lib}/core/backend/backendStorage.js +0 -0
  399. /package/{lib → dist/lib}/core/backend/backendSubscription.d.ts +0 -0
  400. /package/{lib → dist/lib}/core/backend/backendSubscription.js +0 -0
  401. /package/{lib → dist/lib}/core/backend/backendVault.d.ts +0 -0
  402. /package/{lib → dist/lib}/core/backend/backendVault.js +0 -0
  403. /package/{lib → dist/lib}/core/backend/index.d.ts +0 -0
  404. /package/{lib → dist/lib}/core/backend/index.js +0 -0
  405. /package/{lib → dist/lib}/core/backend/internalLogger.d.ts +0 -0
  406. /package/{lib → dist/lib}/core/backend/internalLogger.js +0 -0
  407. /package/{lib → dist/lib}/core/cache/cacheDbEnum.d.ts +0 -0
  408. /package/{lib → dist/lib}/core/cache/cacheDbEnum.js +0 -0
  409. /package/{lib → dist/lib}/core/debug/kuzzleDebugger.d.ts +0 -0
  410. /package/{lib → dist/lib}/core/debug/kuzzleDebugger.js +0 -0
  411. /package/{lib → dist/lib}/core/plugin/pluginContext.d.ts +0 -0
  412. /package/{lib → dist/lib}/core/realtime/channel.d.ts +0 -0
  413. /package/{lib → dist/lib}/core/realtime/channel.js +0 -0
  414. /package/{lib → dist/lib}/core/realtime/connectionRooms.d.ts +0 -0
  415. /package/{lib → dist/lib}/core/realtime/connectionRooms.js +0 -0
  416. /package/{lib → dist/lib}/core/realtime/hotelClerk.d.ts +0 -0
  417. /package/{lib → dist/lib}/core/realtime/hotelClerk.js +0 -0
  418. /package/{lib → dist/lib}/core/realtime/room.d.ts +0 -0
  419. /package/{lib → dist/lib}/core/realtime/room.js +0 -0
  420. /package/{lib → dist/lib}/core/realtime/subscription.d.ts +0 -0
  421. /package/{lib → dist/lib}/core/realtime/subscription.js +0 -0
  422. /package/{lib → dist/lib}/core/security/profileRepository.d.ts +0 -0
  423. /package/{lib → dist/lib}/core/security/profileRepository.js +0 -0
  424. /package/{lib → dist/lib}/core/security/tokenRepository.d.ts +0 -0
  425. /package/{lib → dist/lib}/core/shared/KoncordeWrapper.d.ts +0 -0
  426. /package/{lib → dist/lib}/core/shared/KoncordeWrapper.js +0 -0
  427. /package/{lib → dist/lib}/core/shared/ObjectRepository.d.ts +0 -0
  428. /package/{lib → dist/lib}/core/shared/ObjectRepository.js +0 -0
  429. /package/{lib → dist/lib}/core/shared/sdk/embeddedSdk.d.ts +0 -0
  430. /package/{lib → dist/lib}/core/shared/sdk/embeddedSdk.js +0 -0
  431. /package/{lib → dist/lib}/core/shared/sdk/funnelProtocol.d.ts +0 -0
  432. /package/{lib → dist/lib}/core/shared/sdk/funnelProtocol.js +0 -0
  433. /package/{lib → dist/lib}/core/shared/store.js +0 -0
  434. /package/{lib → dist/lib}/core/storage/indexCache.d.ts +0 -0
  435. /package/{lib → dist/lib}/core/storage/indexCache.js +0 -0
  436. /package/{lib → dist/lib}/core/storage/storeScopeEnum.d.ts +0 -0
  437. /package/{lib → dist/lib}/core/storage/storeScopeEnum.js +0 -0
  438. /package/{lib → dist/lib}/kerror/errors/badRequestError.d.ts +0 -0
  439. /package/{lib → dist/lib}/kerror/errors/badRequestError.js +0 -0
  440. /package/{lib → dist/lib}/kerror/errors/externalServiceError.d.ts +0 -0
  441. /package/{lib → dist/lib}/kerror/errors/externalServiceError.js +0 -0
  442. /package/{lib → dist/lib}/kerror/errors/forbiddenError.d.ts +0 -0
  443. /package/{lib → dist/lib}/kerror/errors/forbiddenError.js +0 -0
  444. /package/{lib → dist/lib}/kerror/errors/gatewayTimeoutError.d.ts +0 -0
  445. /package/{lib → dist/lib}/kerror/errors/gatewayTimeoutError.js +0 -0
  446. /package/{lib → dist/lib}/kerror/errors/index.d.ts +0 -0
  447. /package/{lib → dist/lib}/kerror/errors/index.js +0 -0
  448. /package/{lib → dist/lib}/kerror/errors/internalError.d.ts +0 -0
  449. /package/{lib → dist/lib}/kerror/errors/internalError.js +0 -0
  450. /package/{lib → dist/lib}/kerror/errors/kuzzleError.d.ts +0 -0
  451. /package/{lib → dist/lib}/kerror/errors/kuzzleError.js +0 -0
  452. /package/{lib → dist/lib}/kerror/errors/multipleErrorsError.d.ts +0 -0
  453. /package/{lib → dist/lib}/kerror/errors/multipleErrorsError.js +0 -0
  454. /package/{lib → dist/lib}/kerror/errors/notFoundError.d.ts +0 -0
  455. /package/{lib → dist/lib}/kerror/errors/notFoundError.js +0 -0
  456. /package/{lib → dist/lib}/kerror/errors/partialError.d.ts +0 -0
  457. /package/{lib → dist/lib}/kerror/errors/partialError.js +0 -0
  458. /package/{lib → dist/lib}/kerror/errors/pluginImplementationError.d.ts +0 -0
  459. /package/{lib → dist/lib}/kerror/errors/pluginImplementationError.js +0 -0
  460. /package/{lib → dist/lib}/kerror/errors/preconditionError.d.ts +0 -0
  461. /package/{lib → dist/lib}/kerror/errors/preconditionError.js +0 -0
  462. /package/{lib → dist/lib}/kerror/errors/serviceUnavailableError.d.ts +0 -0
  463. /package/{lib → dist/lib}/kerror/errors/serviceUnavailableError.js +0 -0
  464. /package/{lib → dist/lib}/kerror/errors/sizeLimitError.d.ts +0 -0
  465. /package/{lib → dist/lib}/kerror/errors/sizeLimitError.js +0 -0
  466. /package/{lib → dist/lib}/kerror/errors/tooManyRequestsError.d.ts +0 -0
  467. /package/{lib → dist/lib}/kerror/errors/tooManyRequestsError.js +0 -0
  468. /package/{lib → dist/lib}/kerror/errors/unauthorizedError.d.ts +0 -0
  469. /package/{lib → dist/lib}/kerror/errors/unauthorizedError.js +0 -0
  470. /package/{lib → dist/lib}/kerror/index.js +0 -0
  471. /package/{lib → dist/lib}/kuzzle/event/KuzzleEventEmitter.d.ts +0 -0
  472. /package/{lib → dist/lib}/kuzzle/event/KuzzleEventEmitter.js +0 -0
  473. /package/{lib → dist/lib}/kuzzle/index.d.ts +0 -0
  474. /package/{lib → dist/lib}/kuzzle/index.js +0 -0
  475. /package/{lib → dist/lib}/model/security/profile.d.ts +0 -0
  476. /package/{lib → dist/lib}/model/security/profile.js +0 -0
  477. /package/{lib → dist/lib}/model/security/role.js +0 -0
  478. /package/{lib → dist/lib}/model/security/token.d.ts +0 -0
  479. /package/{lib → dist/lib}/model/security/token.js +0 -0
  480. /package/{lib → dist/lib}/model/security/user.js +0 -0
  481. /package/{lib → dist/lib}/service/storage/8/elasticsearch.d.ts +0 -0
  482. /package/{lib → dist/lib}/service/storage/Elasticsearch.d.ts +0 -0
  483. /package/{lib → dist/lib}/service/storage/Elasticsearch.js +0 -0
  484. /package/{lib → dist/lib}/service/storage/commons/queryTranslator.d.ts +0 -0
  485. /package/{lib → dist/lib}/service/storage/commons/queryTranslator.js +0 -0
  486. /package/{lib → dist/lib}/types/ClientConnection.d.ts +0 -0
  487. /package/{lib → dist/lib}/types/ClientConnection.js +0 -0
  488. /package/{lib → dist/lib}/types/Deprecation.d.ts +0 -0
  489. /package/{lib → dist/lib}/types/Deprecation.js +0 -0
  490. /package/{lib → dist/lib}/types/EventHandler.d.ts +0 -0
  491. /package/{lib → dist/lib}/types/EventHandler.js +0 -0
  492. /package/{lib → dist/lib}/types/Global.d.ts +0 -0
  493. /package/{lib → dist/lib}/types/Global.js +0 -0
  494. /package/{lib → dist/lib}/types/HttpMessage.d.ts +0 -0
  495. /package/{lib → dist/lib}/types/HttpMessage.js +0 -0
  496. /package/{lib → dist/lib}/types/HttpStream.d.ts +0 -0
  497. /package/{lib → dist/lib}/types/HttpStream.js +0 -0
  498. /package/{lib → dist/lib}/types/Kuzzle.d.ts +0 -0
  499. /package/{lib → dist/lib}/types/Kuzzle.js +0 -0
  500. /package/{lib → dist/lib}/types/KuzzleDocument.d.ts +0 -0
  501. /package/{lib → dist/lib}/types/KuzzleDocument.js +0 -0
  502. /package/{lib → dist/lib}/types/OpenApiDefinition.d.ts +0 -0
  503. /package/{lib → dist/lib}/types/OpenApiDefinition.js +0 -0
  504. /package/{lib → dist/lib}/types/PasswordPolicy.d.ts +0 -0
  505. /package/{lib → dist/lib}/types/PasswordPolicy.js +0 -0
  506. /package/{lib → dist/lib}/types/Plugin.js +0 -0
  507. /package/{lib → dist/lib}/types/PluginManifest.d.ts +0 -0
  508. /package/{lib → dist/lib}/types/PluginManifest.js +0 -0
  509. /package/{lib → dist/lib}/types/Policy.d.ts +0 -0
  510. /package/{lib → dist/lib}/types/Policy.js +0 -0
  511. /package/{lib → dist/lib}/types/PolicyRestrictions.d.ts +0 -0
  512. /package/{lib → dist/lib}/types/PolicyRestrictions.js +0 -0
  513. /package/{lib → dist/lib}/types/ProfileDefinition.d.ts +0 -0
  514. /package/{lib → dist/lib}/types/ProfileDefinition.js +0 -0
  515. /package/{lib → dist/lib}/types/RoleDefinition.d.ts +0 -0
  516. /package/{lib → dist/lib}/types/RoleDefinition.js +0 -0
  517. /package/{lib → dist/lib}/types/StrategyDefinition.d.ts +0 -0
  518. /package/{lib → dist/lib}/types/StrategyDefinition.js +0 -0
  519. /package/{lib → dist/lib}/types/Target.d.ts +0 -0
  520. /package/{lib → dist/lib}/types/Target.js +0 -0
  521. /package/{lib → dist/lib}/types/Token.d.ts +0 -0
  522. /package/{lib → dist/lib}/types/Token.js +0 -0
  523. /package/{lib → dist/lib}/types/User.d.ts +0 -0
  524. /package/{lib → dist/lib}/types/User.js +0 -0
  525. /package/{lib → dist/lib}/types/config/DumpConfiguration.d.ts +0 -0
  526. /package/{lib → dist/lib}/types/config/DumpConfiguration.js +0 -0
  527. /package/{lib → dist/lib}/types/config/HttpConfiguration.d.ts +0 -0
  528. /package/{lib → dist/lib}/types/config/HttpConfiguration.js +0 -0
  529. /package/{lib → dist/lib}/types/config/KuzzleConfiguration.d.ts +0 -0
  530. /package/{lib → dist/lib}/types/config/KuzzleConfiguration.js +0 -0
  531. /package/{lib → dist/lib}/types/config/LimitsConfiguration.d.ts +0 -0
  532. /package/{lib → dist/lib}/types/config/LimitsConfiguration.js +0 -0
  533. /package/{lib → dist/lib}/types/config/PluginsConfiguration.d.ts +0 -0
  534. /package/{lib → dist/lib}/types/config/PluginsConfiguration.js +0 -0
  535. /package/{lib → dist/lib}/types/config/SecurityConfiguration.d.ts +0 -0
  536. /package/{lib → dist/lib}/types/config/SecurityConfiguration.js +0 -0
  537. /package/{lib → dist/lib}/types/config/ServerConfiguration.d.ts +0 -0
  538. /package/{lib → dist/lib}/types/config/ServerConfiguration.js +0 -0
  539. /package/{lib → dist/lib}/types/config/ServicesConfiguration.d.ts +0 -0
  540. /package/{lib → dist/lib}/types/config/ServicesConfiguration.js +0 -0
  541. /package/{lib → dist/lib}/types/config/internalCache/InternalCacheRedisConfiguration.d.ts +0 -0
  542. /package/{lib → dist/lib}/types/config/internalCache/InternalCacheRedisConfiguration.js +0 -0
  543. /package/{lib → dist/lib}/types/config/publicCache/PublicCacheRedisConfiguration.d.ts +0 -0
  544. /package/{lib → dist/lib}/types/config/publicCache/PublicCacheRedisConfiguration.js +0 -0
  545. /package/{lib → dist/lib}/types/config/storageEngine/StorageEngineElasticsearchConfiguration.d.ts +0 -0
  546. /package/{lib → dist/lib}/types/config/storageEngine/StorageEngineElasticsearchConfiguration.js +0 -0
  547. /package/{lib/types → dist/lib/types/controllers}/Controller.js +0 -0
  548. /package/{lib/types → dist/lib/types/controllers}/ControllerDefinition.js +0 -0
  549. /package/{lib/types → dist/lib/types/controllers}/ControllerRights.d.ts +0 -0
  550. /package/{lib/types → dist/lib/types/controllers}/ControllerRights.js +0 -0
  551. /package/{lib → dist/lib}/types/errors/ErrorDefinition.d.ts +0 -0
  552. /package/{lib → dist/lib}/types/errors/ErrorDefinition.js +0 -0
  553. /package/{lib → dist/lib}/types/errors/ErrorDomains.d.ts +0 -0
  554. /package/{lib → dist/lib}/types/errors/ErrorDomains.js +0 -0
  555. /package/{lib → dist/lib}/types/events/EventGenericDocument.d.ts +0 -0
  556. /package/{lib → dist/lib}/types/events/EventGenericDocument.js +0 -0
  557. /package/{lib → dist/lib}/types/events/EventProtocol.d.ts +0 -0
  558. /package/{lib → dist/lib}/types/events/EventProtocol.js +0 -0
  559. /package/{lib → dist/lib}/types/realtime/RealtimeScope.d.ts +0 -0
  560. /package/{lib → dist/lib}/types/realtime/RealtimeScope.js +0 -0
  561. /package/{lib → dist/lib}/types/realtime/RealtimeUsers.d.ts +0 -0
  562. /package/{lib → dist/lib}/types/realtime/RealtimeUsers.js +0 -0
  563. /package/{lib → dist/lib}/types/realtime/RoomList.d.ts +0 -0
  564. /package/{lib → dist/lib}/types/realtime/RoomList.js +0 -0
  565. /package/{lib → dist/lib}/types/shared/StoreCollectionsDefinition.d.ts +0 -0
  566. /package/{lib → dist/lib}/types/shared/StoreCollectionsDefinition.js +0 -0
  567. /package/{lib → dist/lib}/types/storage/7/Elasticsearch.d.ts +0 -0
  568. /package/{lib → dist/lib}/types/storage/7/Elasticsearch.js +0 -0
  569. /package/{lib → dist/lib}/types/storage/8/Elasticsearch.d.ts +0 -0
  570. /package/{lib → dist/lib}/types/storage/8/Elasticsearch.js +0 -0
  571. /package/{lib → dist/lib}/util/Inflector.d.ts +0 -0
  572. /package/{lib → dist/lib}/util/Inflector.js +0 -0
  573. /package/{lib → dist/lib}/util/array.d.ts +0 -0
  574. /package/{lib → dist/lib}/util/array.js +0 -0
  575. /package/{lib → dist/lib}/util/async.d.ts +0 -0
  576. /package/{lib → dist/lib}/util/async.js +0 -0
  577. /package/{lib → dist/lib}/util/bufferedPassThrough.d.ts +0 -0
  578. /package/{lib → dist/lib}/util/bufferedPassThrough.js +0 -0
  579. /package/{lib → dist/lib}/util/crypto.d.ts +0 -0
  580. /package/{lib → dist/lib}/util/crypto.js +0 -0
  581. /package/{lib → dist/lib}/util/dump-collection.d.ts +0 -0
  582. /package/{lib → dist/lib}/util/dump-collection.js +0 -0
  583. /package/{lib → dist/lib}/util/esRequest.d.ts +0 -0
  584. /package/{lib → dist/lib}/util/esRequest.js +0 -0
  585. /package/{lib → dist/lib}/util/koncordeCompat.d.ts +0 -0
  586. /package/{lib → dist/lib}/util/koncordeCompat.js +0 -0
  587. /package/{lib → dist/lib}/util/mutex.d.ts +0 -0
  588. /package/{lib → dist/lib}/util/mutex.js +0 -0
  589. /package/{lib → dist/lib}/util/name-generator.d.ts +0 -0
  590. /package/{lib → dist/lib}/util/name-generator.js +0 -0
  591. /package/{lib → dist/lib}/util/time.d.ts +0 -0
  592. /package/{lib → dist/lib}/util/time.js +0 -0
@@ -0,0 +1,821 @@
1
+ /*
2
+ * Kuzzle, a backend software, self-hostable and ready to use
3
+ * to power modern apps
4
+ *
5
+ * Copyright 2015-2022 Kuzzle
6
+ * mailto: support AT kuzzle.io
7
+ * website: http://kuzzle.io
8
+ *
9
+ * Licensed under the Apache License, Version 2.0 (the "License");
10
+ * you may not use this file except in compliance with the License.
11
+ * You may obtain a copy of the License at
12
+ *
13
+ * https://www.apache.org/licenses/LICENSE-2.0
14
+ *
15
+ * Unless required by applicable law or agreed to in writing, software
16
+ * distributed under the License is distributed on an "AS IS" BASIS,
17
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ * See the License for the specific language governing permissions and
19
+ * limitations under the License.
20
+ */
21
+ "use strict";
22
+ const Bluebird = require("bluebird");
23
+ const Deque = require("denque");
24
+ const Cookie = require("cookie");
25
+ const kuzzleStateEnum = require("../kuzzle/kuzzleStateEnum");
26
+ const { KuzzleError } = require("../kerror/errors");
27
+ const { AdminController, AuthController, BulkController, ClusterController, CollectionController, DebugController, DocumentController, IndexController, MemoryStorageController, RealtimeController, SecurityController, ServerController, } = require("./controllers");
28
+ const { documentEventAliases } = require("../config/documentEventAliases");
29
+ const DocumentExtractor = require("./documentExtractor");
30
+ const sdkCompatibility = require("../config/sdkCompatibility");
31
+ const RateLimiter = require("./rateLimiter");
32
+ const kerror = require("../kerror");
33
+ const debug = require("../util/debug")("kuzzle:funnel");
34
+ const processError = kerror.wrap("api", "process");
35
+ const { has } = require("../util/safeObject");
36
+ const { HttpStream } = require("../types");
37
+ const get = require("lodash/get");
38
+ // Actions of the auth controller that does not necessite to verify the token
39
+ // when cookie auth is active
40
+ const SKIP_TOKEN_VERIF_ACTIONS = ["login", "checkToken", "logout"];
41
+ /**
42
+ * @class PendingRequest
43
+ * @param {Request} request
44
+ * @param {Function} fn
45
+ * @param {Object} context
46
+ */
47
+ class PendingRequest {
48
+ constructor(request, fn, context) {
49
+ this.request = request;
50
+ this.fn = fn;
51
+ this.context = context;
52
+ }
53
+ }
54
+ /**
55
+ * @class Funnel
56
+ */
57
+ class Funnel {
58
+ constructor() {
59
+ this.overloaded = false;
60
+ this.concurrentRequests = 0;
61
+ this.controllers = new Map();
62
+ this.pendingRequestsQueue = new Deque();
63
+ this.pendingRequestsById = new Map();
64
+ this.lastOverloadTime = 0;
65
+ this.overloadWarned = false;
66
+ this.lastWarningTime = 0;
67
+ this.rateLimiter = new RateLimiter();
68
+ this.lastDumpedErrors = {};
69
+ this.loadDocumentEventAliases();
70
+ this.sdkCompatibility = sdkCompatibility;
71
+ this.logger = global.kuzzle.log.child("api:funnel");
72
+ }
73
+ init() {
74
+ /**
75
+ * Returns true if the controller is one of Kuzzle native's one
76
+ *
77
+ * @param {String} name
78
+ *
79
+ * @returns {Boolean}
80
+ */
81
+ global.kuzzle.onAsk("kuzzle:api:funnel:controller:isNative", (name) => this.isNativeController(name));
82
+ /**
83
+ * Returns inner metrics from the Funnel
84
+ * @returns {Object}
85
+ */
86
+ global.kuzzle.onAsk("kuzzle:api:funnel:metrics", () => this.metrics());
87
+ this.rateLimiter.init();
88
+ this.controllers.set("auth", new AuthController.default());
89
+ this.controllers.set("bulk", new BulkController());
90
+ this.controllers.set("cluster", new ClusterController());
91
+ this.controllers.set("collection", new CollectionController());
92
+ this.controllers.set("debug", new DebugController());
93
+ this.controllers.set("document", new DocumentController());
94
+ this.controllers.set("index", new IndexController());
95
+ this.controllers.set("realtime", new RealtimeController());
96
+ this.controllers.set("security", new SecurityController.default());
97
+ this.controllers.set("server", new ServerController());
98
+ this.controllers.set("admin", new AdminController.default());
99
+ const msController = new MemoryStorageController();
100
+ this.controllers.set("memoryStorage", msController);
101
+ this.controllers.set("ms", msController);
102
+ const initPromises = Array.from(this.controllers.keys()).map((ctrl) => this.controllers.get(ctrl).init());
103
+ return Bluebird.all(initPromises);
104
+ }
105
+ loadDocumentEventAliases() {
106
+ this.documentEventAliases = documentEventAliases;
107
+ this.documentEventAliases.mirrorList = {};
108
+ Object.keys(documentEventAliases.list).forEach((alias) => {
109
+ documentEventAliases.list[alias].forEach((aliasOf) => {
110
+ this.documentEventAliases.mirrorList[aliasOf] = alias;
111
+ });
112
+ });
113
+ }
114
+ /**
115
+ * Asks the overload-protection system for an execution slot.
116
+ *
117
+ * Returns immediately true if the request can be
118
+ * executed.
119
+ *
120
+ * Otherwise, false is returned, and the caller MUST
121
+ * stop the request execution.
122
+ * In this case:
123
+ * - if it can be bufferized, then the request is left untouched
124
+ * and the executor function will be called later when a slot
125
+ * becomes available
126
+ * - if the buffer limit has been reached, a ServiceUnavailable error
127
+ * is set to the request. In that case, the executor is free to
128
+ * retry submitting the request later, or to abort it and return
129
+ * the request as it is
130
+ *
131
+ * @param {Function} fn - The function to be executed as soon as the slot is
132
+ * available.
133
+ * @param {Object} context - The execution context of the `fn` param.
134
+ * @param {String} request - The request object that will be passed as
135
+ * argument to `fn`.
136
+ * @returns {Boolean} - A boolean telling whether the request has been
137
+ * immediately executed or not.
138
+ */
139
+ throttle(fn, context, request) {
140
+ if (global.kuzzle.state === kuzzleStateEnum.SHUTTING_DOWN) {
141
+ throw processError.get("shutting_down");
142
+ }
143
+ if (global.kuzzle.state === kuzzleStateEnum.NOT_ENOUGH_NODES) {
144
+ throw processError.get("not_enough_nodes");
145
+ }
146
+ const isRequestFromDebugSession = get(request, "context.connection.misc.internal.debugSession", false);
147
+ if (this.overloaded) {
148
+ const now = Date.now();
149
+ if (this.pendingRequestsQueue.length >
150
+ global.kuzzle.config.limits.requestsBufferWarningThreshold &&
151
+ (this.lastWarningTime === 0 || this.lastWarningTime < now - 500)) {
152
+ const overloadPercentage = Math.round((10000 * this.pendingRequestsQueue.length) /
153
+ global.kuzzle.config.limits.requestsBufferSize) / 100;
154
+ global.kuzzle.emit("core:overload", overloadPercentage);
155
+ this.logger.warn(`[!WARNING!] Kuzzle overloaded: ${overloadPercentage}%. Delaying requests...`);
156
+ this.overloadWarned = true;
157
+ this.lastWarningTime = now;
158
+ }
159
+ }
160
+ if (this.concurrentRequests < global.kuzzle.config.limits.concurrentRequests) {
161
+ if (this.pendingRequestsById.has(request.internalId)) {
162
+ this.pendingRequestsById.delete(request.internalId);
163
+ }
164
+ // Execute fn immediately, since the slot is available
165
+ fn.call(context, request);
166
+ return true;
167
+ }
168
+ /*
169
+ If kuzzle is overloaded, check the requests cache.
170
+ There are two possibilities:
171
+
172
+ 1- the cache limit has not been reached: the request is cached
173
+ and will be played as soon as the config.limits.concurrentRequests
174
+ property allows it
175
+
176
+ 2- the number of cached requests is equal to the requestsBufferSize property.
177
+ The request is then discarded and an error is returned to the sender
178
+ */
179
+ if (this.pendingRequestsQueue.length >=
180
+ global.kuzzle.config.limits.requestsBufferSize &&
181
+ !isRequestFromDebugSession) {
182
+ const error = processError.get("overloaded");
183
+ global.kuzzle.emit("log:error", error);
184
+ this.logger.error(error);
185
+ throw error;
186
+ }
187
+ if (!this.pendingRequestsById.has(request.internalId)) {
188
+ this.pendingRequestsById.set(request.internalId, new PendingRequest(request, fn, context));
189
+ if (isRequestFromDebugSession) {
190
+ // Push at the front to prioritize debug requests
191
+ this.pendingRequestsQueue.unshift(request.internalId);
192
+ }
193
+ else {
194
+ this.pendingRequestsQueue.push(request.internalId);
195
+ }
196
+ if (!this.overloaded) {
197
+ this.overloaded = true;
198
+ /*
199
+ /!\ Invoking this function here with setTimeout() leads to V8 deoptimizing
200
+ the entire getRequestSlot method (as of node.js 6.9.1),
201
+ because of an "out of bounds" heuristic error (caused by node's
202
+ setTimeout code written in JS? this needs further investigations)
203
+
204
+ We get better performances by keeping this method optimized by crankshaft
205
+ even if this means executing this function once for nothing each
206
+ time we start overload mode.
207
+ */
208
+ this._playPendingRequests();
209
+ }
210
+ }
211
+ return false;
212
+ }
213
+ /**
214
+ * Execute the API request by
215
+ * 1/ check domain from origin header
216
+ * 2/ asking for a request slot,
217
+ * 3/ verify that the user is still connected
218
+ * 4/ checking if the requesting user has the right credentials
219
+ * 5/ send the request itself to the corresponding controller+action
220
+ *
221
+ * @param {Request} request
222
+ * @param {Function} callback
223
+ * @returns {Number} -1: request delayed, 0: request processing, 1: error
224
+ */
225
+ execute(request, callback) {
226
+ if (!request.input.controller || !request.input.controller.length) {
227
+ callback(kerror.get("api", "assert", "missing_argument", "controller"), request);
228
+ return 1;
229
+ }
230
+ if (!request.input.action || !request.input.action.length) {
231
+ callback(kerror.get("api", "assert", "missing_argument", "action"), request);
232
+ return 1;
233
+ }
234
+ // If there is a body, retrieve the targets if any
235
+ const targets = request.getArray("targets", []);
236
+ /**
237
+ * Only index and collection as a pair or the targets parameter is allowed at the same time
238
+ * otherwise we throw an error because we don't know which one to use to verify the rights
239
+ */
240
+ if (targets.length > 0 &&
241
+ (request.input.args.index || request.input.args.collection)) {
242
+ callback(kerror.get("api", "assert", "mutually_exclusive", "index, collection", "targets"), request);
243
+ return 1;
244
+ }
245
+ if (request.input.headers &&
246
+ has(request.input.headers, "origin") &&
247
+ !this._isOriginAuthorized(request.input.headers.origin)) {
248
+ debug("Reject request, unauthorized origin %s", request.input.headers.origin);
249
+ return this._executeError(kerror.get("api", "process", "unauthorized_origin", request.input.headers.origin), request, true, callback);
250
+ }
251
+ try {
252
+ const executing = this.throttle((req) => {
253
+ // if the connection is closed there is no need to execute the request
254
+ // => discarding it
255
+ if (!global.kuzzle.router.isConnectionAlive(req.context)) {
256
+ debug("Client connection dead: dropping request: %a", req.input);
257
+ callback(processError.get("connection_dropped"), req);
258
+ return;
259
+ }
260
+ debug("Starting request %s:%s [%s]: %j", req.input.controller, req.input.action, req.id, req.input);
261
+ global.kuzzle.asyncStore.run(() => {
262
+ global.kuzzle.asyncStore.set("REQUEST", req);
263
+ global.kuzzle
264
+ .pipe("request:beforeExecution", req)
265
+ .then((modifiedRequest) => {
266
+ let _request;
267
+ return this.checkRights(modifiedRequest)
268
+ .then((newModifiedRequest) => {
269
+ _request = newModifiedRequest;
270
+ return this.rateLimiter.isAllowed(_request);
271
+ })
272
+ .then((allowed) => {
273
+ if (!allowed) {
274
+ if (request.input.controller === "auth" &&
275
+ request.input.action === "login") {
276
+ throw processError.get("too_many_logins_requests");
277
+ }
278
+ throw processError.get("too_many_requests");
279
+ }
280
+ return this.processRequest(_request);
281
+ })
282
+ .then((processResult) => {
283
+ debug("Request %s successfully executed. Result: %a", modifiedRequest.id, processResult);
284
+ return global.kuzzle
285
+ .pipe("request:afterExecution", {
286
+ request: _request,
287
+ result: processResult,
288
+ success: true,
289
+ })
290
+ .then((pipeEvent) => {
291
+ callback(null, pipeEvent.result);
292
+ // disables a bluebird warning in dev. mode triggered when
293
+ // a promise is created and not returned
294
+ return null;
295
+ });
296
+ })
297
+ .catch((err) => {
298
+ debug("Error processing request %s: %a", modifiedRequest.id, err);
299
+ return global.kuzzle
300
+ .pipe("request:afterExecution", {
301
+ error: err,
302
+ request: modifiedRequest,
303
+ success: false,
304
+ })
305
+ .then((pipeEvent) => this._executeError(pipeEvent.error, pipeEvent.request, true, callback));
306
+ });
307
+ })
308
+ .catch((err) => {
309
+ debug("Error processing request %s: %a", req.id, err);
310
+ return global.kuzzle
311
+ .pipe("request:afterExecution", {
312
+ error: err,
313
+ request: req,
314
+ success: false,
315
+ })
316
+ .then((pipeEvent) => this._executeError(pipeEvent.error, pipeEvent.request, true, callback));
317
+ });
318
+ });
319
+ }, this, request);
320
+ return executing ? 0 : -1;
321
+ }
322
+ catch (error) {
323
+ request.setError(error);
324
+ callback(error, request);
325
+ return 1;
326
+ }
327
+ }
328
+ /**
329
+ * Checks if an error is worth dumping Kuzzle. If so,
330
+ * creates a dump.
331
+ *
332
+ * @param {KuzzleError|*} err
333
+ */
334
+ handleErrorDump(err) {
335
+ const handledErrors = global.kuzzle.config.dump.handledErrors;
336
+ if (global.kuzzle.config.dump.enabled && handledErrors.enabled) {
337
+ setImmediate(() => {
338
+ const errorType = typeof err === "object" && err.name ? err.name : typeof err;
339
+ if (handledErrors.whitelist.indexOf(errorType) > -1) {
340
+ const now = Date.now();
341
+ // JSON.stringify(new NativeError()) === '{}'
342
+ // i.e. Error, SyntaxError, TypeError, ReferenceError, etc.
343
+ this.logger.error(err instanceof Error && !(err instanceof KuzzleError)
344
+ ? `${err.message}\n${err.stack}`
345
+ : err);
346
+ if (!this.lastDumpedErrors[errorType] ||
347
+ this.lastDumpedErrors[errorType] < now - handledErrors.minInterval) {
348
+ // simplify error message to use it in folder dump name
349
+ let errorMessage = err.message;
350
+ if (errorMessage.indexOf("\n") > -1) {
351
+ errorMessage = errorMessage.split("\n")[0];
352
+ }
353
+ errorMessage = errorMessage
354
+ .toLowerCase()
355
+ .replace(/[^a-zA-Z0-9-_]/g, "-")
356
+ .split("-")
357
+ .filter((value) => value !== "")
358
+ .join("-");
359
+ global.kuzzle.dump(`handled-${errorType.toLocaleLowerCase()}-${errorMessage}`);
360
+ }
361
+ this.lastDumpedErrors[errorType] = now;
362
+ }
363
+ });
364
+ }
365
+ }
366
+ /**
367
+ * Checks if a user has the necessary rights to execute the action
368
+ *
369
+ * @param {Request} request
370
+ * @returns {Promise<Request>}
371
+ */
372
+ async checkRights(request) {
373
+ if (!global.kuzzle.config.http.cookieAuthentication &&
374
+ request.getBoolean("cookieAuth")) {
375
+ throw kerror.get("security", "cookie", "unsupported");
376
+ }
377
+ let skipTokenVerification = false;
378
+ // When the Support of Cookie as Authentication Token is enabled we check if an auth token cookie is present
379
+ // When a request is made with cookieAuth set to true
380
+ // We try to use the auth token cookie if present as auth token
381
+ // otherwise check for auth token as input
382
+ if (request.input.headers && has(request.input.headers, "cookie")) {
383
+ let cookie;
384
+ try {
385
+ cookie = Cookie.parse(request.input.headers.cookie);
386
+ }
387
+ catch (error) {
388
+ throw kerror.get("security", "cookie", "invalid");
389
+ }
390
+ // if cookie is present and not null, and a token is present we should throw because we don't know which one to use
391
+ if (cookie.authToken && cookie.authToken !== "null") {
392
+ if (!global.kuzzle.config.http.cookieAuthentication) {
393
+ throw kerror.get("security", "cookie", "unsupported");
394
+ }
395
+ if (request.input.jwt) {
396
+ throw kerror.get("security", "token", "verification_error", "Both token and cookie are present, could not decide which one to use");
397
+ }
398
+ request.input.jwt = cookie.authToken;
399
+ skipTokenVerification =
400
+ request.getBoolean("cookieAuth") &&
401
+ request.input.controller === "auth" &&
402
+ SKIP_TOKEN_VERIF_ACTIONS.includes(request.input.action);
403
+ }
404
+ }
405
+ try {
406
+ // If the verification should be skipped, we pass a null token,
407
+ // this way the verification will be made as anonymous
408
+ const token = skipTokenVerification ? null : request.input.jwt;
409
+ request.context.token = await global.kuzzle.ask("core:security:token:verify", token);
410
+ }
411
+ catch (error) {
412
+ await global.kuzzle.pipe("request:onUnauthorized", request);
413
+ throw error;
414
+ }
415
+ const userId = request.context.token.userId;
416
+ request.context.user = await global.kuzzle.ask("core:security:user:get", userId);
417
+ // If we have a token, link the connection with the token,
418
+ // this way the connection can be notified when the token has expired.
419
+ if (global.kuzzle.config.internal.notifiableProtocols.includes(request.context.connection.protocol)) {
420
+ global.kuzzle.tokenManager.link(request.context.token, request.context.connection.id);
421
+ }
422
+ if (!(await request.context.user.isActionAllowed(request))) {
423
+ // anonymous user => 401 (Unauthorized) error
424
+ // logged-in user with insufficient permissions => 403 (Forbidden) error
425
+ const error = kerror.get("security", "rights", userId === "-1" ? "unauthorized" : "forbidden", request.input.controller, request.input.action, request.context.user._id);
426
+ request.setError(error);
427
+ await global.kuzzle.pipe("request:onUnauthorized", request);
428
+ throw error;
429
+ }
430
+ if (global.kuzzle.config.plugins.common.failsafeMode &&
431
+ !this._isLogin(request) &&
432
+ !request.context.user.profileIds.includes("admin")) {
433
+ await global.kuzzle.pipe("request:onUnauthorized", request);
434
+ throw kerror.get("security", "rights", "failsafe_mode_admin_only");
435
+ }
436
+ return global.kuzzle.pipe("request:onAuthorized", request);
437
+ }
438
+ _isLogin(request) {
439
+ return (request.input.controller === "auth" && request.input.action === "login");
440
+ }
441
+ /**
442
+ * Executes the request immediately.
443
+ * /!\ To be used only by methods having already passed the overload check.
444
+ *
445
+ * @param {KuzzleRequest} request
446
+ * @returns {Promise}
447
+ */
448
+ async processRequest(request) {
449
+ const controller = this.getController(request);
450
+ global.kuzzle.statistics.startRequest(request);
451
+ this.concurrentRequests++;
452
+ let _request = request;
453
+ try {
454
+ await this._checkSdkVersion(_request);
455
+ _request = await global.kuzzle.pipe("request:onExecution", _request);
456
+ _request = await this.performDocumentAlias(_request, "before");
457
+ _request = await global.kuzzle.pipe(this.getEventName(_request, "before"), _request);
458
+ const responseData = await doAction(controller, _request);
459
+ _request.setResult(responseData, {
460
+ status: _request.status === 102 ? 200 : _request.status,
461
+ });
462
+ if (!this.isNativeController(_request.input.controller) &&
463
+ !_request.response.raw) {
464
+ // check if the plugin response can be serialized
465
+ try {
466
+ if (!(responseData instanceof HttpStream)) {
467
+ JSON.stringify(responseData);
468
+ }
469
+ }
470
+ catch (e) {
471
+ _request.setResult(null);
472
+ throw kerror.get("plugin", "controller", "unserializable_response");
473
+ }
474
+ }
475
+ _request = await global.kuzzle.pipe(this.getEventName(_request, "after"), _request);
476
+ _request = await this.performDocumentAlias(_request, "after");
477
+ _request = await global.kuzzle.pipe("request:onSuccess", _request);
478
+ global.kuzzle.statistics.completedRequest(_request);
479
+ }
480
+ catch (error) {
481
+ return this.handleProcessRequestError(_request, _request, error);
482
+ }
483
+ finally {
484
+ this.concurrentRequests--;
485
+ }
486
+ return _request;
487
+ }
488
+ /**
489
+ * Triggers generic:document:* events
490
+ *
491
+ * @warning Critical code section
492
+ *
493
+ * @param {KuzzleRequest} request
494
+ * @param {String} prefix
495
+ *
496
+ * @returns {Promise<KuzzleRequest>}
497
+ */
498
+ async performDocumentAlias(request, prefix) {
499
+ const { controller, action } = request.input;
500
+ const mustTrigger = controller === "document" &&
501
+ this.documentEventAliases.mirrorList[action] &&
502
+ (prefix !== "before" ||
503
+ !this.documentEventAliases.notBefore.includes(action));
504
+ if (!mustTrigger) {
505
+ return request;
506
+ }
507
+ const alias = this.documentEventAliases.mirrorList[action];
508
+ const event = `${this.documentEventAliases.namespace}:${prefix}${capitalize(alias)}`;
509
+ const extractor = new DocumentExtractor(request);
510
+ const documents = await global.kuzzle.pipe(event, extractor.extract(), request);
511
+ return extractor.insert(documents);
512
+ }
513
+ /**
514
+ * Exposes API requests execution to plugins
515
+ *
516
+ * Similar to execute, except that:
517
+ * - plugin requests do not trigger API events
518
+ * - plugin requests are not counted towards requests statistics
519
+ * - the overload protection mechanism is disabled
520
+ *
521
+ * @param {KuzzleRequest} request
522
+ * @returns {Promise}
523
+ */
524
+ async executePluginRequest(request) {
525
+ if (request.input.triggerEvents) {
526
+ let error;
527
+ let res;
528
+ try {
529
+ const { result } = await this.processRequest(request);
530
+ debug("Request %s successfully executed. Result: %a", request.id, result);
531
+ res = result;
532
+ return { ...result };
533
+ }
534
+ catch (e) {
535
+ error = e;
536
+ debug("Error processing request %s: %a", request.id, error);
537
+ }
538
+ finally {
539
+ global.kuzzle.pipe("request:afterExecution", {
540
+ error: error,
541
+ request: request,
542
+ result: res,
543
+ success: error === undefined ? true : false,
544
+ });
545
+ }
546
+ }
547
+ try {
548
+ return await doAction(this.getController(request), request);
549
+ }
550
+ catch (e) {
551
+ this.handleErrorDump(e);
552
+ throw e;
553
+ }
554
+ }
555
+ async handleProcessRequestError(modifiedRequest, request, error) {
556
+ let _error = this._wrapError(request, error);
557
+ modifiedRequest.setError(_error);
558
+ try {
559
+ const updated = await global.kuzzle.pipe(this.getEventName(modifiedRequest, "error"), modifiedRequest);
560
+ // If there is no pipe attached on this event, the same request is
561
+ // passed in resolve and we should reject it
562
+ if (updated.error !== null) {
563
+ throw updated.error;
564
+ }
565
+ // Pipe recovered from the error: returned the new result
566
+ return updated;
567
+ }
568
+ catch (err) {
569
+ _error = this._wrapError(request, err);
570
+ }
571
+ // Handling the error thrown by the error pipe
572
+ modifiedRequest.setError(_error);
573
+ global.kuzzle.statistics.failedRequest(request);
574
+ try {
575
+ const updated = await global.kuzzle.pipe("request:onError", modifiedRequest);
576
+ if (updated === modifiedRequest) {
577
+ throw modifiedRequest.error;
578
+ }
579
+ return updated;
580
+ }
581
+ catch (err) {
582
+ throw this._wrapError(request, err);
583
+ }
584
+ }
585
+ /**
586
+ * Helper function meant to normalize event names
587
+ * by retrieving controller aliases' original names.
588
+ *
589
+ * @param {Request} Executed request
590
+ * @param {string} prefix - event prefix
591
+ * @returns {string} event name
592
+ */
593
+ getEventName(request, prefix) {
594
+ const event = request.input.controller === "memoryStorage"
595
+ ? "ms"
596
+ : request.input.controller;
597
+ return `${event}:${prefix}${capitalize(request.input.action)}`;
598
+ }
599
+ /**
600
+ * Returns the number of remaining requests
601
+ *
602
+ * @returns {number}
603
+ */
604
+ get remainingRequests() {
605
+ return this.concurrentRequests + this.pendingRequestsQueue.length;
606
+ }
607
+ /**
608
+ * Return the controller corresponding to the action asked by the request
609
+ *
610
+ * @param {Request} request
611
+ * @returns {Object} controller object
612
+ * @throws {BadRequestError} If the asked controller or action is unknown
613
+ */
614
+ getController(request) {
615
+ for (const controllers of [
616
+ this.controllers,
617
+ global.kuzzle.pluginsManager.controllers,
618
+ ]) {
619
+ const controller = controllers.get(request.input.controller);
620
+ if (controller) {
621
+ if (controller._isAction(request.input.action)) {
622
+ return controller;
623
+ }
624
+ throw processError.get("action_not_found", request.input.controller, request.input.action);
625
+ }
626
+ }
627
+ throw processError.get("controller_not_found", request.input.controller);
628
+ }
629
+ /**
630
+ * Tell if the controller is a native controller or not
631
+ * @param {String} controller
632
+ * @returns {Boolean}
633
+ */
634
+ isNativeController(controller) {
635
+ return this.controllers.has(controller);
636
+ }
637
+ /**
638
+ * Returns inner metrics from the Funnel
639
+ * @returns {Object}
640
+ */
641
+ metrics() {
642
+ return {
643
+ concurrentRequests: this.concurrentRequests,
644
+ pendingRequests: this.pendingRequestsQueue.length,
645
+ };
646
+ }
647
+ /**
648
+ * If the request is coming from an official SDK,
649
+ * then checks the compatibility of the SDK against current Kuzzle version.
650
+ *
651
+ * @param {Request} request
652
+ *
653
+ * @throws
654
+ */
655
+ _checkSdkVersion(request) {
656
+ if (!global.kuzzle.config.server.strictSdkVersion) {
657
+ return;
658
+ }
659
+ const sdkVersion = request.input.volatile && request.input.volatile.sdkVersion;
660
+ const sdkName = request.input.volatile && request.input.volatile.sdkName;
661
+ // sdkVersion property is only used by Kuzzle v1 SDKs
662
+ if (sdkVersion) {
663
+ throw processError.get("incompatible_sdk_version", sdkVersion, "Kuzzle v2");
664
+ }
665
+ if (!sdkName || typeof sdkName !== "string") {
666
+ return;
667
+ }
668
+ const separatorIdx = sdkName.indexOf("@"), name = sdkName.substr(0, separatorIdx), version = sdkName.substr(separatorIdx + 1);
669
+ if (name.length === 0 || version.length === 0) {
670
+ return;
671
+ }
672
+ const requirements = this.sdkCompatibility[name];
673
+ if (!requirements) {
674
+ return;
675
+ }
676
+ if (!satisfiesMajor(version, requirements)) {
677
+ const hint = `min: ${requirements.min || "none"}, max: ${requirements.max || "none"}`;
678
+ throw processError.get("incompatible_sdk_version", version, hint);
679
+ }
680
+ }
681
+ /**
682
+ * Populates the given request with the error and calls the callback
683
+ *
684
+ * @param {Error} error
685
+ * @param {Request} request
686
+ * @param {boolean} asError - if set to true, calls the callback with its first argument as error
687
+ * @param {Function} callback
688
+ * @returns {null}
689
+ * @private
690
+ */
691
+ _executeError(error, request, asError, callback) {
692
+ request.setError(error);
693
+ if (asError) {
694
+ callback(error, request);
695
+ this.handleErrorDump(error);
696
+ }
697
+ else {
698
+ callback(null, request);
699
+ }
700
+ return null;
701
+ }
702
+ /**
703
+ * Background task. Checks if there are any requests in cache, and replay them
704
+ * if Kuzzle is not overloaded anymore,
705
+ */
706
+ _playPendingRequests() {
707
+ // If there is room to play bufferized requests, do it now. If not, retry later
708
+ const quantityToInject = Math.min(this.pendingRequestsQueue.length, global.kuzzle.config.limits.concurrentRequests - this.concurrentRequests);
709
+ if (quantityToInject > 0) {
710
+ for (let i = 0; i < quantityToInject; i++) {
711
+ const pendingItem = this.pendingRequestsById.get(this.pendingRequestsQueue.peekFront());
712
+ try {
713
+ if (this.throttle(pendingItem.fn, pendingItem.context, pendingItem.request)) {
714
+ this.pendingRequestsQueue.shift();
715
+ }
716
+ else {
717
+ break;
718
+ }
719
+ }
720
+ catch (error) {
721
+ break;
722
+ }
723
+ }
724
+ }
725
+ if (this.pendingRequestsQueue.length > 0) {
726
+ setTimeout(() => this._playPendingRequests(), 0);
727
+ }
728
+ else {
729
+ const now = Date.now();
730
+ // No request remaining in cache => stop the background task and return to normal behavior
731
+ this.overloaded = false;
732
+ if (this.overloadWarned &&
733
+ (this.lastOverloadTime === 0 || this.lastOverloadTime < now - 500)) {
734
+ this.overloadWarned = false;
735
+ this.logger.info("End of overloaded state. Resuming normal activity.");
736
+ this.lastOverloadTime = now;
737
+ }
738
+ }
739
+ }
740
+ /**
741
+ * Eventually wrap an error into a PluginImplementationError
742
+ * @param {Request} request
743
+ * @param {Error} error
744
+ * @returns {KuzzleError}
745
+ */
746
+ _wrapError(request, error) {
747
+ if (!this.isNativeController(request) && !(error instanceof KuzzleError)) {
748
+ return kerror.getFrom(error, "plugin", "runtime", "unexpected_error", error.message);
749
+ }
750
+ return error;
751
+ }
752
+ /**
753
+ * Verifies if requests sent from a specific origin are allowed
754
+ * @param {string} origin
755
+ * @returns
756
+ */
757
+ _isOriginAuthorized(origin) {
758
+ const httpConfig = global.kuzzle.config.http;
759
+ if (!origin) {
760
+ return true;
761
+ }
762
+ if (global.kuzzle.config.internal.allowAllOrigins) {
763
+ return true;
764
+ }
765
+ if (httpConfig.accessControlAllowOriginUseRegExp) {
766
+ for (const re of httpConfig.accessControlAllowOrigin) {
767
+ if (re.test(origin)) {
768
+ return true;
769
+ }
770
+ }
771
+ return false;
772
+ }
773
+ return httpConfig.accessControlAllowOrigin.includes(origin);
774
+ }
775
+ }
776
+ /**
777
+ * @param {string} string
778
+ * @returns {string}
779
+ */
780
+ function capitalize(string) {
781
+ return string.charAt(0).toUpperCase() + string.slice(1);
782
+ }
783
+ /**
784
+ * Execute a controller action, checking that its return
785
+ * value is a Promise. If not, wraps the returned value
786
+ * in a rejected Promise and returns it.
787
+ *
788
+ * Used to make Kuzzle safe from badly implemented plugins
789
+ *
790
+ * @param {Object} controller
791
+ * @param {Request} request
792
+ * @returns {Promise}
793
+ */
794
+ function doAction(controller, request) {
795
+ const ret = controller[request.input.action](request);
796
+ if (!ret || typeof ret.then !== "function") {
797
+ return kerror.reject("plugin", "controller", "invalid_action_response", request.input.controller, request.input.action);
798
+ }
799
+ return ret;
800
+ }
801
+ /**
802
+ * Very straightforward function to check only if the version satisfies
803
+ * the major version requirements
804
+ *
805
+ * @param {String} version
806
+ * @param {Object} requirements
807
+ *
808
+ * @returns {Boolean}
809
+ */
810
+ function satisfiesMajor(version, requirements) {
811
+ let maxRequirement = true, minRequirement = true;
812
+ if (requirements.min) {
813
+ minRequirement = version[0] >= requirements.min.toString();
814
+ }
815
+ if (requirements.max) {
816
+ maxRequirement = version[0] <= requirements.max.toString();
817
+ }
818
+ return maxRequirement && minRequirement;
819
+ }
820
+ module.exports = Funnel;
821
+ //# sourceMappingURL=funnel.js.map