kuzzle 2.49.1 → 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,817 @@
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 assert = require("assert");
23
+ const path = require("path");
24
+ const fs = require("fs");
25
+ const Bluebird = require("bluebird");
26
+ const _ = require("lodash");
27
+ const kerror = require("../../kerror");
28
+ const didYouMean = require("../../util/didYouMean");
29
+ const { Inflector } = require("../../util/Inflector");
30
+ const debug = require("../../util/debug")("kuzzle:plugins");
31
+ const { KuzzleError } = require("../../kerror/errors");
32
+ const { has, get, isPlainObject } = require("../../util/safeObject");
33
+ const { BaseController } = require("../../api/controllers/baseController");
34
+ const Plugin = require("./plugin");
35
+ const assertionError = kerror.wrap("plugin", "assert");
36
+ const runtimeError = kerror.wrap("plugin", "runtime");
37
+ const strategyError = kerror.wrap("plugin", "strategy");
38
+ const controllerError = kerror.wrap("plugin", "controller");
39
+ // Without those plugins, Kuzzle won't start at all.
40
+ const CORE_PLUGINS = ["kuzzle-plugin-auth-passport-local"];
41
+ /**
42
+ * @class PluginsManager
43
+ * @param {Kuzzle} kuzzle
44
+ */
45
+ class PluginsManager {
46
+ constructor() {
47
+ Reflect.defineProperty(this, "kuzzle", {
48
+ value: global.kuzzle,
49
+ });
50
+ this._plugins = new Map();
51
+ // Map.<controller, BaseController instance >
52
+ this.controllers = new Map();
53
+ this.strategies = {};
54
+ this.routes = [];
55
+ this.pluginsEnabledDir = path.resolve(path.join(global.kuzzle.rootPath, "plugins", "enabled"));
56
+ this.pluginsAvailableDir = path.resolve(path.join(global.kuzzle.rootPath, "plugins", "available"));
57
+ /**
58
+ * @example
59
+ * {
60
+ * pluginName: {
61
+ * authName: <constructor>,
62
+ * authname2: <constructor>,
63
+ * ...
64
+ * },
65
+ * pluginName2: {
66
+ * ...
67
+ * }
68
+ * }
69
+ *
70
+ * This structure prevents authenticator names collisions between
71
+ * multiple auth. plugins
72
+ */
73
+ this.authenticators = {};
74
+ this.config = global.kuzzle.config.plugins;
75
+ this.logger = global.kuzzle.log.child("core:plugin:pluginsManager");
76
+ // @deprecated - Warn about the pipeTimeout configuration being obsolete
77
+ if (this.config.common.pipeTimeout) {
78
+ this.logger.warn('The configuration "plugins.common.pipeTimeout" has been deprecated and is now unused. It can be safely removed from configuration files');
79
+ }
80
+ this.loadedPlugins = [];
81
+ }
82
+ set application(plugin) {
83
+ assert(this._plugins.size === 0, "The application plugin can only be set before every other plugins are loaded");
84
+ assert(plugin.application, 'The application plugin must have the "application" property equals to true');
85
+ this._plugins.set(plugin.name, plugin);
86
+ }
87
+ get plugins() {
88
+ return Array.from(this._plugins.values()).filter((plugin) => !plugin.application);
89
+ }
90
+ get application() {
91
+ return Array.from(this._plugins.values()).find((plugin) => plugin.application);
92
+ }
93
+ /**
94
+ * Giving a controller name, tells if exists
95
+ *
96
+ * @param {string} controller
97
+ * @returns {Boolean}
98
+ */
99
+ isController(controller) {
100
+ return this.controllers.has(controller);
101
+ }
102
+ /**
103
+ * Giving a controller name and an action, tells if action exists
104
+ *
105
+ * @param {string} controller
106
+ * @param {string} action
107
+ * @returns {Boolean}
108
+ */
109
+ isAction(controller, action) {
110
+ return this.getActions(controller).includes(action);
111
+ }
112
+ /**
113
+ * Giving a controller name, returns its actions
114
+ *
115
+ * @param {string} controller
116
+ * @returns {Array}
117
+ */
118
+ getActions(controller) {
119
+ return Array.from(this.controllers.get(controller)._actions);
120
+ }
121
+ /**
122
+ * Returns an array filled with controller names
123
+ *
124
+ * @returns {Array}
125
+ */
126
+ getControllerNames() {
127
+ return Array.from(this.controllers.keys());
128
+ }
129
+ /**
130
+ * Giving a plugin name, tell if it exists
131
+ *
132
+ * @param {string} pluginName
133
+ * @returns {boolean}
134
+ */
135
+ exists(pluginName) {
136
+ return this._plugins.has(pluginName);
137
+ }
138
+ /**
139
+ * Used to dump loaded plugin feature into serverInfo route / cli
140
+ *
141
+ * @returns {object}
142
+ */
143
+ getPluginsDescription() {
144
+ const pluginsDescription = {};
145
+ for (const plugin of this.plugins) {
146
+ pluginsDescription[plugin.name] = plugin.info();
147
+ debug("[%s] reading plugin configuration: %a", plugin, pluginsDescription[plugin.name]);
148
+ }
149
+ return pluginsDescription;
150
+ }
151
+ /**
152
+ * Register plugins feature to Kuzzle
153
+ *
154
+ * @returns {Promise}
155
+ *
156
+ * @throws PluginImplementationError - Throws when an error occurs when registering a plugin
157
+ */
158
+ async init(plugins = {}) {
159
+ this._plugins = new Map([...this.loadPlugins(plugins), ...this._plugins]);
160
+ global.kuzzle.on("plugin:hook:loop-error", ({ error, pluginName }) => {
161
+ this.logger.error(`[${pluginName}] Infinite loop detected on event "hook:onError": ${error}`);
162
+ });
163
+ global.kuzzle.on("hook:onError", ({ error, event, pluginName }) => {
164
+ this.logger.error(`[${pluginName}] Error executing hook on "${event}": ${error}${error.stack}`);
165
+ });
166
+ // register regular plugins features
167
+ const loadPlugins = [];
168
+ const defaultImports = {};
169
+ for (const plugin of this._plugins.values()) {
170
+ if (this.config.common.failsafeMode &&
171
+ !CORE_PLUGINS.includes(plugin.name)) {
172
+ this.logger.info(`Failsafe mode activated, skipping plugin "${plugin.name}"`);
173
+ continue;
174
+ }
175
+ if (plugin.application) {
176
+ plugin.init(plugin.name);
177
+ }
178
+ const { initTimeout } = this.config.common;
179
+ debug('[%s] starting plugin in "%s" mode', plugin.name, plugin.config.privileged ? "privileged" : "standard");
180
+ const promise = Bluebird.resolve((async () => {
181
+ try {
182
+ await plugin.instance.init(plugin.config, plugin.context);
183
+ }
184
+ catch (error) {
185
+ throw runtimeError.get("failed_init", plugin.name, error);
186
+ }
187
+ })())
188
+ .timeout(initTimeout, `${plugin.logPrefix} Initialization timed out after ${initTimeout}ms. Try to increase the configuration "plugins.common.initTimeout".`)
189
+ .then(async () => {
190
+ plugin.initCalled = true;
191
+ if (!_.isEmpty(plugin.instance.controllers) &&
192
+ !_.isEmpty(plugin.instance.api)) {
193
+ throw assertionError.get("duplicated_api_definition");
194
+ }
195
+ if (!_.isEmpty(plugin.instance.controllers)) {
196
+ this._initControllers(plugin);
197
+ }
198
+ if (!_.isEmpty(plugin.instance.api)) {
199
+ await this._initApi(plugin);
200
+ }
201
+ if (!_.isEmpty(plugin.instance.authenticators)) {
202
+ this._initAuthenticators(plugin);
203
+ }
204
+ if (!_.isEmpty(plugin.instance.strategies)) {
205
+ this._initStrategies(plugin);
206
+ }
207
+ if (!_.isEmpty(plugin.instance.hooks)) {
208
+ this._initHooks(plugin);
209
+ }
210
+ if (!_.isEmpty(plugin.instance.pipes)) {
211
+ this._initPipes(plugin);
212
+ }
213
+ debug("[%s] plugin started", plugin.name);
214
+ if (!plugin.application) {
215
+ this.loadedPlugins.push(plugin.name);
216
+ }
217
+ if (!_.isEmpty(plugin.instance.imports)) {
218
+ _.merge(defaultImports, plugin.instance.imports);
219
+ }
220
+ return null;
221
+ });
222
+ loadPlugins.push(promise);
223
+ }
224
+ await Promise.all(loadPlugins);
225
+ this.logger.info(`[✔] Successfully loaded ${this.loadedPlugins.length} plugins: ${this.loadedPlugins.join(", ")}`);
226
+ return defaultImports;
227
+ }
228
+ /**
229
+ * @param {string} strategyName
230
+ * @returns {string[]}
231
+ */
232
+ getStrategyFields(strategyName) {
233
+ return this.strategies[strategyName].strategy.config.fields || [];
234
+ }
235
+ /**
236
+ * @param {string} strategyName
237
+ * @param {string} methodName
238
+ * @returns {boolean}
239
+ */
240
+ hasStrategyMethod(strategyName, methodName) {
241
+ const strategy = get(this.strategies, strategyName);
242
+ return strategy && has(strategy.methods, methodName);
243
+ }
244
+ /**
245
+ * @param {string} strategyName
246
+ * @param {string} methodName
247
+ * @returns {function}
248
+ */
249
+ getStrategyMethod(strategyName, methodName) {
250
+ return this.strategies[strategyName].methods[methodName];
251
+ }
252
+ /**
253
+ * Returns the list of registered passport strategies
254
+ * @returns {string[]}
255
+ */
256
+ listStrategies() {
257
+ return Object.keys(this.strategies);
258
+ }
259
+ /**
260
+ * Checks if a strategy is well-formed
261
+ *
262
+ * @param {string} pluginName
263
+ * @param {string} strategyName
264
+ * @param {object} strategy
265
+ * @throws {PluginImplementationError} If the strategy is invalid
266
+ */
267
+ validateStrategy(pluginName, strategyName, strategy) {
268
+ const errorPrefix = `[${pluginName}] Strategy ${strategyName}:`;
269
+ if (!isPlainObject(strategy)) {
270
+ throw strategyError.get("invalid_description", errorPrefix, strategy);
271
+ }
272
+ if (!isPlainObject(strategy.methods)) {
273
+ throw strategyError.get("invalid_methods", errorPrefix, strategy.methods);
274
+ }
275
+ const plugin = this._plugins.get(pluginName.toLowerCase());
276
+ // required methods check
277
+ ["exists", "create", "update", "delete", "validate", "verify"].forEach((methodName) => {
278
+ if (!_.isString(strategy.methods[methodName])) {
279
+ throw strategyError.get("invalid_method_type", errorPrefix, methodName, strategy.methods[methodName]);
280
+ }
281
+ if (!_.isFunction(plugin.instance[strategy.methods[methodName]])) {
282
+ throw strategyError.get("missing_method_function", errorPrefix, strategy.methods[methodName]);
283
+ }
284
+ });
285
+ // optional methods check
286
+ ["getInfo", "getById", "afterRegister"].forEach((name) => {
287
+ const optionalMethodName = strategy.methods[name];
288
+ if (!_.isNil(optionalMethodName)) {
289
+ if (!_.isString(optionalMethodName)) {
290
+ throw strategyError.get("invalid_method_type", errorPrefix, name, optionalMethodName);
291
+ }
292
+ if (!_.isFunction(plugin.instance[optionalMethodName])) {
293
+ throw strategyError.get("missing_method_function", errorPrefix, optionalMethodName);
294
+ }
295
+ }
296
+ });
297
+ if (!isPlainObject(strategy.config)) {
298
+ throw strategyError.get("invalid_config", errorPrefix, strategy.config);
299
+ }
300
+ if (typeof strategy.config.authenticator !== "string") {
301
+ throw strategyError.get("invalid_authenticator", errorPrefix, strategy.config.authenticator);
302
+ }
303
+ else if (!this.authenticators[pluginName] ||
304
+ !this.authenticators[pluginName][strategy.config.authenticator]) {
305
+ throw strategyError.get("unknown_authenticator", errorPrefix, strategy.config.authenticator);
306
+ }
307
+ for (const optionName of ["strategyOptions", "authenticateOptions"]) {
308
+ const options = strategy.config[optionName];
309
+ if (!_.isNil(options) && !isPlainObject(options)) {
310
+ throw strategyError.get("invalid_option", errorPrefix, optionName, options);
311
+ }
312
+ }
313
+ if (!_.isNil(strategy.config.fields) &&
314
+ !Array.isArray(strategy.config.fields)) {
315
+ throw strategyError.get("invalid_fields", errorPrefix, strategy.config.fields);
316
+ }
317
+ }
318
+ /**
319
+ * Register a pipe function on an event
320
+ *
321
+ * @param {object} plugin
322
+ * @param {number} warnDelay - delay before a warning is issued
323
+ * @param {string} event name
324
+ * @param {Function} handler - function to attach
325
+ *
326
+ * @returns {string} pipeId
327
+ */
328
+ registerPipe(plugin, event, handler) {
329
+ debug('[%s] registering pipe on event "%s"', plugin.name, event);
330
+ const warnDelay = plugin.config.pipeWarnTime !== undefined
331
+ ? plugin.config.pipeWarnTime
332
+ : this.config.common.pipeWarnTime;
333
+ const wrapper = (...data) => {
334
+ const now = warnDelay ? Date.now() : null;
335
+ const callback = data.pop();
336
+ const cb = (error, result) => {
337
+ if (warnDelay) {
338
+ const elapsed = Date.now() - now;
339
+ if (elapsed > warnDelay) {
340
+ this.logger.warn(`${plugin.logPrefix} pipe for event '${event}' is slow (${elapsed}ms)`);
341
+ }
342
+ }
343
+ callback(error, result);
344
+ };
345
+ try {
346
+ const pipeResponse = data.length === 0 ? handler(null, cb) : handler(...data, cb);
347
+ if (typeof pipeResponse === "object" &&
348
+ pipeResponse !== null &&
349
+ typeof pipeResponse.then === "function" &&
350
+ typeof pipeResponse.catch === "function") {
351
+ pipeResponse
352
+ .then((result) => {
353
+ cb(null, result);
354
+ return null; // prevents a false-positive bluebird warning
355
+ })
356
+ .catch((error) => cb(error));
357
+ }
358
+ }
359
+ catch (error) {
360
+ cb(error instanceof KuzzleError
361
+ ? error
362
+ : runtimeError.getFrom(error, "unexpected_error", error.message));
363
+ }
364
+ };
365
+ return global.kuzzle.registerPluginPipe(event, wrapper);
366
+ }
367
+ unregisterPipe(pipeId) {
368
+ global.kuzzle.unregisterPluginPipe(pipeId);
369
+ }
370
+ /**
371
+ * Registers an authentication strategy.
372
+ * If the plugin init method has not been called yet, add the strategy to
373
+ * the plugin.instance.strategies object.
374
+ *
375
+ * @param {string} pluginName - plugin name
376
+ * @param {string} strategyName - strategy name
377
+ * @param {object} strategy - strategy properties
378
+ * @throws {PluginImplementationError} If the strategy is invalid or if
379
+ * registration fails
380
+ */
381
+ registerStrategy(pluginName, strategyName, strategy) {
382
+ // prior to Kaaf, plugin names can contains upper case
383
+ const plugin = this._plugins.get(pluginName.toLowerCase());
384
+ // only add the strategy to the strategies object if the init method
385
+ // has not been called
386
+ if (!plugin.initCalled) {
387
+ plugin.instance.strategies = plugin.instance.strategies || {};
388
+ plugin.instance.strategies[strategyName] = strategy;
389
+ return;
390
+ }
391
+ this.validateStrategy(plugin.name, strategyName, strategy);
392
+ if (has(this.strategies, strategyName)) {
393
+ this.unregisterStrategy(plugin.name, strategyName);
394
+ }
395
+ const methods = {};
396
+ // wrap plugin methods to force their context and to
397
+ // convert uncaught exception into PluginImplementationError
398
+ // promise rejections
399
+ for (const methodName of Object.keys(strategy.methods).filter((name) => name !== "verify")) {
400
+ methods[methodName] = async (...args) => {
401
+ try {
402
+ const boundFunction = plugin.instance[strategy.methods[methodName]].bind(plugin.instance);
403
+ return await boundFunction(...args);
404
+ }
405
+ catch (error) {
406
+ if (error instanceof KuzzleError) {
407
+ throw error;
408
+ }
409
+ throw runtimeError.getFrom(error, "unexpected_error", error.message);
410
+ }
411
+ };
412
+ }
413
+ const opts = {
414
+ ...strategy.config.strategyOptions,
415
+ passReqToCallback: true,
416
+ };
417
+ const verifyAdapter = this.wrapStrategyVerify(plugin.logPrefix, strategyName, plugin.instance[strategy.methods.verify].bind(plugin.instance));
418
+ try {
419
+ const Ctor = this.authenticators[plugin.name][strategy.config.authenticator], instance = new Ctor(opts, verifyAdapter);
420
+ this.strategies[strategyName] = { methods, owner: plugin.name, strategy };
421
+ global.kuzzle.passport.use(strategyName, instance, strategy.config.authenticateOptions);
422
+ if (methods.afterRegister) {
423
+ methods.afterRegister(instance);
424
+ }
425
+ }
426
+ catch (e) {
427
+ throw strategyError.getFrom(e, "failed_registration", strategyName, e.message);
428
+ }
429
+ }
430
+ /**
431
+ * Unregister
432
+ * @param {string} pluginName
433
+ * @param {string} strategyName
434
+ * @throws {PluginImplementationError} If not the owner of the strategy or if strategy
435
+ * does not exist
436
+ */
437
+ unregisterStrategy(pluginName, strategyName) {
438
+ const strategy = this.strategies[strategyName];
439
+ if (strategy) {
440
+ if (strategy.owner !== pluginName) {
441
+ throw strategyError.get("unauthorized_removal", strategyName);
442
+ }
443
+ delete this.strategies[strategyName];
444
+ global.kuzzle.passport.unuse(strategyName);
445
+ }
446
+ else {
447
+ throw strategyError.get("strategy_not_found", strategyName);
448
+ }
449
+ }
450
+ /**
451
+ * @param {object} plugin
452
+ * @param {number} pipeWarnTime
453
+ */
454
+ _initPipes(plugin) {
455
+ const methodsList = getMethods(plugin.instance);
456
+ for (const [event, fn] of Object.entries(plugin.instance.pipes)) {
457
+ const list = Array.isArray(fn) ? fn : [fn];
458
+ for (const target of list) {
459
+ if (typeof target !== "function" &&
460
+ typeof plugin.instance[target] !== "function") {
461
+ const message = typeof target === "string" ? didYouMean(target, methodsList) : "";
462
+ throw assertionError.get("invalid_pipe", event, target, message);
463
+ }
464
+ let handler = target;
465
+ if (typeof target === "string") {
466
+ // @deprecated - warn about using a string representing an instance method
467
+ plugin.printDeprecation("Defining pipe handler using a string is deprecated. Pass a function instead.");
468
+ handler = plugin.instance[target].bind(plugin.instance);
469
+ }
470
+ // if the function handler is a plugin instance method,
471
+ // bound the context to the plugin instance
472
+ if (target.name && typeof plugin.instance[target.name] === "function") {
473
+ handler = target.bind(plugin.instance);
474
+ }
475
+ this.registerPipe(plugin, event, handler);
476
+ }
477
+ }
478
+ }
479
+ /**
480
+ * @param {object} plugin
481
+ */
482
+ _initHooks(plugin) {
483
+ const methodsList = getMethods(plugin.instance);
484
+ for (const [event, fn] of Object.entries(plugin.instance.hooks)) {
485
+ const list = Array.isArray(fn) ? fn : [fn];
486
+ for (const target of list) {
487
+ if (typeof target !== "function" &&
488
+ typeof plugin.instance[target] !== "function") {
489
+ const message = typeof target === "string" ? didYouMean(target, methodsList) : "";
490
+ throw assertionError.get("invalid_hook", event, target, message);
491
+ }
492
+ debug('[%s] register hook on event "%s"', plugin.name, event);
493
+ let handler = target;
494
+ // @deprecated - warn about using a string representing an instance method
495
+ if (typeof target === "string") {
496
+ plugin.printDeprecation("Defining hook handler using a string is deprecated. Pass a function instead.");
497
+ handler = plugin.instance[target].bind(plugin.instance);
498
+ }
499
+ // if the function handler is a plugin instance method,
500
+ // bound the context to the plugin instance
501
+ if (target.name && typeof plugin.instance[target.name] === "function") {
502
+ handler = target.bind(plugin.instance);
503
+ }
504
+ global.kuzzle.registerPluginHook(plugin.name, event, handler);
505
+ }
506
+ }
507
+ }
508
+ async _initApi(plugin) {
509
+ for (const [controller, definition] of Object.entries(plugin.instance.api)) {
510
+ debug("[%s][%s] starting api controller registration", plugin.name, controller);
511
+ if (await global.kuzzle.ask("kuzzle:api:funnel:controller:isNative", controller)) {
512
+ throw assertionError.get("invalid_controller_definition", controller, "Native controllers cannot be overriden");
513
+ }
514
+ Plugin.checkControllerDefinition(controller, definition);
515
+ for (const [action, actionDefinition] of Object.entries(definition.actions)) {
516
+ let apiController = this.controllers.get(controller);
517
+ if (!apiController) {
518
+ apiController = new BaseController();
519
+ this.controllers.set(controller, apiController);
520
+ }
521
+ let handler = actionDefinition.handler;
522
+ // if the function handler is a plugin instance method,
523
+ // bind the context to the plugin instance
524
+ if (handler.name &&
525
+ typeof plugin.instance[handler.name] === "function") {
526
+ handler = handler.bind(plugin.instance);
527
+ }
528
+ apiController._addAction(action, handler);
529
+ const httpRoutes = actionDefinition.http || [];
530
+ // Define default HTTP route if none have been provided
531
+ if (httpRoutes.length === 0) {
532
+ httpRoutes.push({
533
+ path: `${Inflector.kebabCase(controller)}/${Inflector.kebabCase(action)}`,
534
+ verb: "get",
535
+ });
536
+ }
537
+ for (const httpRoute of httpRoutes) {
538
+ debug('[%s] binding HTTP route "%s" to controller "%s"', plugin.name, httpRoute.path, controller);
539
+ const routePath = httpRoute.path.charAt(0) === "/"
540
+ ? httpRoute.path
541
+ : `/_/${httpRoute.path}`;
542
+ this.routes.push({
543
+ action,
544
+ controller,
545
+ openapi: httpRoute.openapi,
546
+ path: routePath,
547
+ verb: httpRoute.verb,
548
+ });
549
+ }
550
+ }
551
+ }
552
+ }
553
+ /**
554
+ * Init plugin controllers
555
+ *
556
+ * @param {object} plugin
557
+ * @returns {boolean}
558
+ */
559
+ _initControllers(plugin) {
560
+ // @deprecated - warn about using the obsolete "controllers" object
561
+ if (!_.isEmpty(plugin.instance.controllers)) {
562
+ plugin.printDeprecation('Defining controllers using the "controllers" object is deprecated. You should use the "api" object instead.');
563
+ }
564
+ for (const controller of Object.keys(plugin.instance.controllers)) {
565
+ debug("[%s][%s] starting controller registration", plugin.name, controller);
566
+ const methodsList = getMethods(plugin.instance);
567
+ const controllerName = `${plugin.name}/${controller}`;
568
+ const definition = plugin.instance.controllers[controller];
569
+ const errorControllerPrefix = `Unable to inject controller "${controller}" from plugin "${plugin.name}":`;
570
+ if (!isPlainObject(definition)) {
571
+ // @todo deprecate all those errors and use plugin.assert.invalid_controller_definition
572
+ throw controllerError.get("invalid_description", errorControllerPrefix, typeof definition);
573
+ }
574
+ for (const action of Object.keys(definition)) {
575
+ debug("[%s][%s][%s] starting action controller registration", plugin.name, controller, action);
576
+ if (typeof definition[action] !== "function" &&
577
+ typeof plugin.instance[definition[action]] !== "function") {
578
+ const suggestion = typeof definition[action] === "string"
579
+ ? didYouMean(definition[action], methodsList)
580
+ : "";
581
+ throw controllerError.get("invalid_action", errorControllerPrefix, controller, action, suggestion);
582
+ }
583
+ let apiController = this.controllers.get(controllerName);
584
+ if (!apiController) {
585
+ apiController = new BaseController();
586
+ this.controllers.set(controllerName, apiController);
587
+ }
588
+ if (typeof definition[action] === "function") {
589
+ apiController._addAction(action, definition[action]);
590
+ }
591
+ else {
592
+ apiController._addAction(action, plugin.instance[definition[action]].bind(plugin.instance));
593
+ }
594
+ }
595
+ }
596
+ const httpVerbs = [
597
+ "get",
598
+ "head",
599
+ "post",
600
+ "put",
601
+ "delete",
602
+ "patch",
603
+ "options",
604
+ ];
605
+ const routeProperties = ["verb", "url", "controller", "action", "path"];
606
+ const controllerNames = Object.keys(plugin.instance.controllers);
607
+ // @deprecated - warn about using the obsolete "routes" object
608
+ if (!_.isEmpty(plugin.instance.routes)) {
609
+ plugin.printDeprecation('Defining routes using the "routes" object is deprecated. You should use the "api" object instead.');
610
+ }
611
+ for (const route of plugin.instance.routes || []) {
612
+ const controller = `${plugin.name}/${route.controller}`;
613
+ const errorRoutePrefix = `Unable to inject API route "${JSON.stringify(route)}" from plugin "${plugin.name}":`;
614
+ for (const key of Object.keys(route)) {
615
+ if (routeProperties.indexOf(key) === -1) {
616
+ throw controllerError.get("unexpected_route_property", errorRoutePrefix, key, didYouMean(key, routeProperties));
617
+ }
618
+ if (typeof route[key] !== "string" ||
619
+ (route[key].length === 0 && key !== "url")) {
620
+ throw controllerError.get("invalid_route_property", errorRoutePrefix, key);
621
+ }
622
+ }
623
+ const apiController = this.controllers.get(controller);
624
+ if (!apiController) {
625
+ throw controllerError.get("undefined_controller", errorRoutePrefix, route.controller, didYouMean(route.controller, controllerNames));
626
+ }
627
+ if (!apiController._isAction(route.action)) {
628
+ const actionNames = Array.from(apiController._actions);
629
+ throw controllerError.get("undefined_action", errorRoutePrefix, route.action, didYouMean(route.action, actionNames));
630
+ }
631
+ if (httpVerbs.indexOf(route.verb.toLowerCase()) === -1) {
632
+ throw controllerError.get("unsupported_verb", errorRoutePrefix, httpVerbs.join(", "), didYouMean(route.verb, httpVerbs));
633
+ }
634
+ // @deprecated route.url is deprecated
635
+ if (route.url) {
636
+ plugin.printDeprecation('Usage of "url" property for routes is deprecated. Use "path" instead.');
637
+ }
638
+ route.path = route.path || route.url;
639
+ debug('[%s] binding HTTP route "%s" to controller "%s"', plugin.name, route.path, route.controller);
640
+ // @deprecated "/_plugin" prefix is deprecated for plugin routes
641
+ this.routes.push({
642
+ action: route.action,
643
+ controller,
644
+ path: `/_plugin/${plugin.name}${route.path}`,
645
+ verb: route.verb,
646
+ });
647
+ const routePath = route.path.charAt(0) === "/"
648
+ ? `/_${route.path}`
649
+ : `/_/${plugin.name}/${route.path}`;
650
+ this.routes.push({
651
+ action: route.action,
652
+ controller,
653
+ path: routePath,
654
+ verb: route.verb,
655
+ });
656
+ }
657
+ }
658
+ /**
659
+ * @param {object} plugin
660
+ * @throws {PluginImplementationError} If strategies registration fails
661
+ */
662
+ _initStrategies(plugin) {
663
+ if (!isPlainObject(plugin.instance.strategies) ||
664
+ _.isEmpty(plugin.instance.strategies)) {
665
+ throw strategyError.get("invalid_definition", plugin.logPrefix);
666
+ }
667
+ for (const name of Object.keys(plugin.instance.strategies)) {
668
+ this.registerStrategy(plugin.name, name, plugin.instance.strategies[name]);
669
+ }
670
+ }
671
+ /**
672
+ * @param {object} plugin
673
+ * @throws {PluginImplementationError} If strategies registration fails
674
+ */
675
+ _initAuthenticators(plugin) {
676
+ if (!isPlainObject(plugin.instance.authenticators)) {
677
+ throw kerror.get("plugin", "authenticators", "not_an_object", plugin.logPrefix);
678
+ }
679
+ for (const authenticator of Object.keys(plugin.instance.authenticators)) {
680
+ if (!isConstructor(plugin.instance.authenticators[authenticator])) {
681
+ throw kerror.get("plugin", "authenticators", "invalid_authenticator", plugin.logPrefix, authenticator);
682
+ }
683
+ }
684
+ this.authenticators[plugin.name] = Object.assign({}, plugin.instance.authenticators);
685
+ }
686
+ /**
687
+ * Load detected plugins in memory
688
+ *
689
+ * @returns {object} list of loaded plugin
690
+ */
691
+ loadPlugins(plugins = {}) {
692
+ const loadedPlugins = new Map();
693
+ // first load plugins from Backend.plugin.use
694
+ for (const [name, { plugin: instance, options }] of Object.entries(plugins)) {
695
+ const plugin = new Plugin(instance, { name, ...options });
696
+ // the plugin cluster can be loaded in the startup script
697
+ // and we need the manifest
698
+ plugin.manifest = plugin.manifest || options.manifest;
699
+ plugin.init(name);
700
+ if (loadedPlugins.has(plugin.name)) {
701
+ throw assertionError.get("name_already_exists", plugin.name);
702
+ }
703
+ loadedPlugins.set(plugin.name, plugin);
704
+ }
705
+ // then try to load plugins from the filesystem
706
+ if (!fs.existsSync(this.pluginsEnabledDir)) {
707
+ return loadedPlugins;
708
+ }
709
+ let pluginsPath = [];
710
+ try {
711
+ pluginsPath = fs
712
+ .readdirSync(this.pluginsEnabledDir)
713
+ .map((name) => path.join(this.pluginsEnabledDir, name))
714
+ .filter((filePath) => fs.statSync(filePath).isDirectory());
715
+ }
716
+ catch (e) {
717
+ throw assertionError.get("invalid_plugins_dir", this.pluginsEnabledDir, e.message);
718
+ }
719
+ debug("loading plugins: %a", pluginsPath);
720
+ for (const relativePluginPath of pluginsPath) {
721
+ const plugin = Plugin.loadFromDirectory(relativePluginPath);
722
+ plugin.init(plugin.manifest.raw.name);
723
+ if (loadedPlugins.has(plugin.name)) {
724
+ throw assertionError.get("name_already_exists", plugin.name);
725
+ }
726
+ loadedPlugins.set(plugin.name, plugin);
727
+ }
728
+ return loadedPlugins;
729
+ }
730
+ /**
731
+ * Wraps a strategy plugin's verify function.
732
+ *
733
+ * @param {String} pluginName
734
+ * @param {String} strategyName
735
+ * @param {Function} verifyMethod - Strategy plugin's verify method
736
+ * @returns {Function}
737
+ */
738
+ wrapStrategyVerify(pluginName, strategyName, verifyMethod) {
739
+ const prefix = `${pluginName} Strategy ${strategyName}:`;
740
+ return async (...args) => {
741
+ const callback = args[args.length - 1];
742
+ const ret = verifyMethod(...args.slice(0, -1));
743
+ // catching plugins returning non-thenable content
744
+ // @todo - with async/await we might consider allowing non-promise results
745
+ if (!ret || !_.isFunction(ret.then)) {
746
+ callback(strategyError.get("invalid_verify_return", prefix, ret));
747
+ return;
748
+ }
749
+ let result;
750
+ try {
751
+ result = await ret;
752
+ }
753
+ catch (e) {
754
+ callback(e);
755
+ return;
756
+ }
757
+ if (result === false) {
758
+ callback(null, result, { message: null });
759
+ return;
760
+ }
761
+ if (!isPlainObject(result)) {
762
+ callback(strategyError.get("invalid_verify_resolve", prefix));
763
+ return;
764
+ }
765
+ if (result.kuid !== null && result.kuid !== undefined) {
766
+ if (typeof result.kuid === "string") {
767
+ try {
768
+ const user = await global.kuzzle.ask("core:security:user:get", result.kuid);
769
+ callback(null, user);
770
+ }
771
+ catch (e) {
772
+ if (e.id === "security.user.not_found") {
773
+ callback(strategyError.get("unknown_kuid", prefix));
774
+ }
775
+ else {
776
+ callback(e);
777
+ }
778
+ }
779
+ return;
780
+ }
781
+ callback(strategyError.get("invalid_kuid", prefix, typeof result.kuid));
782
+ return;
783
+ }
784
+ let message;
785
+ if (result.message && typeof result.message === "string") {
786
+ message = result.message;
787
+ }
788
+ else {
789
+ message = `Unable to log in using the strategy "${strategyName}"`;
790
+ }
791
+ callback(null, false, { message });
792
+ };
793
+ }
794
+ }
795
+ /**
796
+ * Test if the provided argument is a constructor or not
797
+ *
798
+ * @param {*} arg
799
+ * @returns {Boolean}
800
+ */
801
+ function isConstructor(arg) {
802
+ try {
803
+ Reflect.construct(Object, [], arg);
804
+ }
805
+ catch (e) {
806
+ return false;
807
+ }
808
+ return true;
809
+ }
810
+ function getMethods(object) {
811
+ const prototype = Object.getPrototypeOf(object);
812
+ const instanceMethods = Object.getOwnPropertyNames(prototype).filter((method) => ["init", "constructor"].indexOf(method) === -1);
813
+ const objectMethods = Object.getOwnPropertyNames(object).filter((key) => typeof object[key] === "function");
814
+ return [...instanceMethods, ...objectMethods];
815
+ }
816
+ module.exports = PluginsManager;
817
+ //# sourceMappingURL=pluginsManager.js.map