kuzzle 2.49.1 → 2.50.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (591) hide show
  1. package/dist/bin/copy-protobuf.js +17 -0
  2. package/dist/lib/api/controllers/adminController.d.ts +51 -0
  3. package/dist/lib/api/controllers/adminController.js +191 -0
  4. package/{lib → dist/lib}/api/controllers/authController.d.ts +20 -40
  5. package/{lib → dist/lib}/api/controllers/authController.js +23 -24
  6. package/dist/lib/api/controllers/bulkController.d.ts +46 -0
  7. package/dist/lib/api/controllers/bulkController.js +132 -0
  8. package/dist/lib/api/controllers/clusterController.d.ts +6 -0
  9. package/{lib → dist/lib}/api/controllers/clusterController.js +7 -11
  10. package/dist/lib/api/controllers/collectionController.d.ts +136 -0
  11. package/dist/lib/api/controllers/collectionController.js +356 -0
  12. package/dist/lib/api/controllers/documentController.d.ts +181 -0
  13. package/dist/lib/api/controllers/documentController.js +768 -0
  14. package/dist/lib/api/controllers/index.d.ts +12 -0
  15. package/{lib → dist/lib}/api/controllers/index.js +13 -14
  16. package/dist/lib/api/controllers/indexController.d.ts +65 -0
  17. package/dist/lib/api/controllers/indexController.js +139 -0
  18. package/dist/lib/api/controllers/memoryStorageController.d.ts +8 -0
  19. package/dist/lib/api/controllers/memoryStorageController.js +867 -0
  20. package/dist/lib/api/controllers/realtimeController.d.ts +47 -0
  21. package/dist/lib/api/controllers/realtimeController.js +128 -0
  22. package/dist/lib/api/controllers/securityController.d.ts +423 -0
  23. package/dist/lib/api/controllers/securityController.js +1139 -0
  24. package/dist/lib/api/controllers/serverController.d.ts +82 -0
  25. package/dist/lib/api/controllers/serverController.js +321 -0
  26. package/dist/lib/api/documentExtractor.d.ts +9 -0
  27. package/dist/lib/api/documentExtractor.js +274 -0
  28. package/dist/lib/api/funnel.d.ts +183 -0
  29. package/dist/lib/api/funnel.js +821 -0
  30. package/dist/lib/api/httpRoutes.d.ts +17 -0
  31. package/dist/lib/api/httpRoutes.js +1496 -0
  32. package/dist/lib/api/rateLimiter.d.ts +18 -0
  33. package/dist/lib/api/rateLimiter.js +74 -0
  34. package/{lib → dist/lib}/api/request/kuzzleRequest.d.ts +2 -2
  35. package/{lib → dist/lib}/api/request/requestContext.d.ts +2 -1
  36. package/dist/lib/cluster/command.d.ts +73 -0
  37. package/dist/lib/cluster/command.js +236 -0
  38. package/dist/lib/cluster/index.d.ts +2 -0
  39. package/{lib → dist/lib}/cluster/index.js +1 -2
  40. package/dist/lib/cluster/node.d.ts +278 -0
  41. package/dist/lib/cluster/node.js +876 -0
  42. package/dist/lib/cluster/publisher.d.ts +188 -0
  43. package/dist/lib/cluster/publisher.js +347 -0
  44. package/dist/lib/cluster/subscriber.d.ts +269 -0
  45. package/dist/lib/cluster/subscriber.js +555 -0
  46. package/dist/lib/cluster/workers/IDCardRenewer.d.ts +13 -0
  47. package/dist/lib/cluster/workers/IDCardRenewer.js +120 -0
  48. package/{lib → dist/lib}/config/documentEventAliases.d.ts +1 -2
  49. package/dist/lib/config/index.d.ts +5 -0
  50. package/dist/lib/config/index.js +244 -0
  51. package/dist/lib/config/sdkCompatibility.json +9 -0
  52. package/dist/lib/core/auth/formatProcessing.d.ts +30 -0
  53. package/dist/lib/core/auth/formatProcessing.js +55 -0
  54. package/dist/lib/core/auth/passportResponse.d.ts +15 -0
  55. package/{lib → dist/lib}/core/auth/passportResponse.js +24 -30
  56. package/dist/lib/core/auth/passportWrapper.d.ts +28 -0
  57. package/dist/lib/core/auth/passportWrapper.js +126 -0
  58. package/{lib → dist/lib}/core/backend/backendConfig.js +2 -2
  59. package/{lib → dist/lib}/core/backend/backendErrors.js +9 -12
  60. package/dist/lib/core/cache/cacheEngine.d.ts +15 -0
  61. package/dist/lib/core/cache/cacheEngine.js +205 -0
  62. package/dist/lib/core/network/accessLogger.d.ts +29 -0
  63. package/dist/lib/core/network/accessLogger.js +250 -0
  64. package/dist/lib/core/network/clientConnection.d.ts +15 -0
  65. package/{lib → dist/lib}/core/network/clientConnection.js +17 -24
  66. package/dist/lib/core/network/context.d.ts +42 -0
  67. package/dist/lib/core/network/context.js +57 -0
  68. package/dist/lib/core/network/entryPoint.d.ts +62 -0
  69. package/dist/lib/core/network/entryPoint.js +261 -0
  70. package/dist/lib/core/network/httpRouter/index.d.ts +85 -0
  71. package/dist/lib/core/network/httpRouter/index.js +258 -0
  72. package/dist/lib/core/network/httpRouter/routeHandler.d.ts +46 -0
  73. package/dist/lib/core/network/httpRouter/routeHandler.js +101 -0
  74. package/dist/lib/core/network/httpRouter/routePart.d.ts +35 -0
  75. package/dist/lib/core/network/httpRouter/routePart.js +117 -0
  76. package/dist/lib/core/network/protocolManifest.d.ts +6 -0
  77. package/{lib → dist/lib}/core/network/protocolManifest.js +5 -9
  78. package/dist/lib/core/network/protocols/httpMessage.d.ts +22 -0
  79. package/dist/lib/core/network/protocols/httpMessage.js +62 -0
  80. package/dist/lib/core/network/protocols/httpwsProtocol.d.ts +171 -0
  81. package/dist/lib/core/network/protocols/httpwsProtocol.js +921 -0
  82. package/dist/lib/core/network/protocols/internalProtocol.d.ts +27 -0
  83. package/dist/lib/core/network/protocols/internalProtocol.js +82 -0
  84. package/dist/lib/core/network/protocols/mqttProtocol.d.ts +39 -0
  85. package/dist/lib/core/network/protocols/mqttProtocol.js +219 -0
  86. package/dist/lib/core/network/protocols/protocol.d.ts +26 -0
  87. package/dist/lib/core/network/protocols/protocol.js +74 -0
  88. package/dist/lib/core/network/router.d.ts +49 -0
  89. package/dist/lib/core/network/router.js +193 -0
  90. package/dist/lib/core/plugin/plugin.d.ts +56 -0
  91. package/dist/lib/core/plugin/plugin.js +282 -0
  92. package/{lib → dist/lib}/core/plugin/pluginContext.js +2 -2
  93. package/dist/lib/core/plugin/pluginManifest.d.ts +5 -0
  94. package/{lib → dist/lib}/core/plugin/pluginManifest.js +16 -27
  95. package/dist/lib/core/plugin/pluginRepository.d.ts +53 -0
  96. package/dist/lib/core/plugin/pluginRepository.js +112 -0
  97. package/dist/lib/core/plugin/pluginsManager.d.ts +190 -0
  98. package/dist/lib/core/plugin/pluginsManager.js +817 -0
  99. package/dist/lib/core/plugin/privilegedContext.d.ts +14 -0
  100. package/{lib → dist/lib}/core/plugin/privilegedContext.js +10 -14
  101. package/dist/lib/core/realtime/actionEnum.d.ts +25 -0
  102. package/{lib → dist/lib}/core/realtime/actionEnum.js +7 -10
  103. package/dist/lib/core/realtime/index.d.ts +8 -0
  104. package/{lib → dist/lib}/core/realtime/index.js +9 -13
  105. package/dist/lib/core/realtime/notification/document.d.ts +34 -0
  106. package/dist/lib/core/realtime/notification/document.js +98 -0
  107. package/dist/lib/core/realtime/notification/index.d.ts +3 -0
  108. package/{lib → dist/lib}/core/realtime/notification/index.js +4 -5
  109. package/dist/lib/core/realtime/notification/server.d.ts +17 -0
  110. package/{lib → dist/lib}/core/realtime/notification/server.js +8 -10
  111. package/dist/lib/core/realtime/notification/user.d.ts +29 -0
  112. package/dist/lib/core/realtime/notification/user.js +66 -0
  113. package/dist/lib/core/realtime/notifier.d.ts +171 -0
  114. package/dist/lib/core/realtime/notifier.js +405 -0
  115. package/dist/lib/core/security/index.d.ts +14 -0
  116. package/{lib → dist/lib}/core/security/index.js +15 -19
  117. package/dist/lib/core/security/roleRepository.d.ts +143 -0
  118. package/dist/lib/core/security/roleRepository.js +445 -0
  119. package/dist/lib/core/security/securityLoader.d.ts +24 -0
  120. package/dist/lib/core/security/securityLoader.js +125 -0
  121. package/{lib → dist/lib}/core/security/tokenRepository.js +1 -1
  122. package/dist/lib/core/security/userRepository.d.ts +81 -0
  123. package/dist/lib/core/security/userRepository.js +346 -0
  124. package/dist/lib/core/shared/abstractManifest.d.ts +27 -0
  125. package/dist/lib/core/shared/abstractManifest.js +85 -0
  126. package/dist/lib/core/shared/sdk/impersonatedSdk.d.ts +7 -0
  127. package/dist/lib/core/shared/sdk/impersonatedSdk.js +80 -0
  128. package/{lib → dist/lib}/core/shared/store.d.ts +2 -2
  129. package/dist/lib/core/statistics/statistics.d.ts +94 -0
  130. package/dist/lib/core/statistics/statistics.js +287 -0
  131. package/dist/lib/core/storage/clientAdapter.d.ts +62 -0
  132. package/dist/lib/core/storage/clientAdapter.js +756 -0
  133. package/dist/lib/core/storage/storageEngine.d.ts +13 -0
  134. package/dist/lib/core/storage/storageEngine.js +52 -0
  135. package/dist/lib/core/validation/baseType.d.ts +35 -0
  136. package/dist/lib/core/validation/baseType.js +70 -0
  137. package/dist/lib/core/validation/types/anything.d.ts +10 -0
  138. package/{lib → dist/lib}/core/validation/types/anything.js +7 -10
  139. package/dist/lib/core/validation/types/boolean.d.ts +16 -0
  140. package/{lib → dist/lib}/core/validation/types/boolean.js +18 -23
  141. package/dist/lib/core/validation/types/date.d.ts +17 -0
  142. package/dist/lib/core/validation/types/date.js +215 -0
  143. package/dist/lib/core/validation/types/email.d.ts +17 -0
  144. package/dist/lib/core/validation/types/email.js +80 -0
  145. package/dist/lib/core/validation/types/enum.d.ts +17 -0
  146. package/dist/lib/core/validation/types/enum.js +70 -0
  147. package/dist/lib/core/validation/types/geoPoint.d.ts +17 -0
  148. package/{lib → dist/lib}/core/validation/types/geoPoint.js +19 -24
  149. package/dist/lib/core/validation/types/geoShape.d.ts +31 -0
  150. package/dist/lib/core/validation/types/geoShape.js +280 -0
  151. package/dist/lib/core/validation/types/integer.d.ts +7 -0
  152. package/{lib → dist/lib}/core/validation/types/integer.js +21 -27
  153. package/dist/lib/core/validation/types/ipAddress.d.ts +17 -0
  154. package/dist/lib/core/validation/types/ipAddress.js +73 -0
  155. package/dist/lib/core/validation/types/numeric.d.ts +17 -0
  156. package/dist/lib/core/validation/types/numeric.js +84 -0
  157. package/dist/lib/core/validation/types/object.d.ts +24 -0
  158. package/dist/lib/core/validation/types/object.js +74 -0
  159. package/dist/lib/core/validation/types/string.d.ts +17 -0
  160. package/dist/lib/core/validation/types/string.js +85 -0
  161. package/dist/lib/core/validation/types/url.d.ts +17 -0
  162. package/dist/lib/core/validation/types/url.js +73 -0
  163. package/dist/lib/core/validation/validation.d.ts +113 -0
  164. package/dist/lib/core/validation/validation.js +692 -0
  165. package/dist/lib/kerror/codes/0-core.json +194 -0
  166. package/dist/lib/kerror/codes/1-services.json +351 -0
  167. package/dist/lib/kerror/codes/2-api.json +195 -0
  168. package/dist/lib/kerror/codes/3-network.json +151 -0
  169. package/dist/lib/kerror/codes/4-plugin.json +498 -0
  170. package/dist/lib/kerror/codes/5-validation.json +158 -0
  171. package/dist/lib/kerror/codes/6-protocol.json +28 -0
  172. package/dist/lib/kerror/codes/7-security.json +283 -0
  173. package/dist/lib/kerror/codes/8-cluster.json +16 -0
  174. package/dist/lib/kerror/codes/index.d.ts +24 -0
  175. package/dist/lib/kerror/codes/index.js +140 -0
  176. package/{lib → dist/lib}/kerror/index.d.ts +5 -5
  177. package/{lib → dist/lib}/kuzzle/Logger.d.ts +6 -0
  178. package/{lib → dist/lib}/kuzzle/Logger.js +26 -5
  179. package/dist/lib/kuzzle/dumpGenerator.d.ts +14 -0
  180. package/dist/lib/kuzzle/dumpGenerator.js +180 -0
  181. package/dist/lib/kuzzle/event/pipeRunner.d.ts +30 -0
  182. package/dist/lib/kuzzle/event/pipeRunner.js +119 -0
  183. package/dist/lib/kuzzle/event/waterfall.d.ts +2 -0
  184. package/dist/lib/kuzzle/event/waterfall.js +90 -0
  185. package/dist/lib/kuzzle/internalIndexHandler.d.ts +186 -0
  186. package/dist/lib/kuzzle/internalIndexHandler.js +174 -0
  187. package/{lib → dist/lib}/kuzzle/kuzzle.d.ts +6 -7
  188. package/{lib → dist/lib}/kuzzle/kuzzle.js +5 -2
  189. package/dist/lib/kuzzle/kuzzleStateEnum.d.ts +20 -0
  190. package/{lib → dist/lib}/kuzzle/kuzzleStateEnum.js +5 -8
  191. package/dist/lib/kuzzle/vault.d.ts +2 -0
  192. package/dist/lib/kuzzle/vault.js +63 -0
  193. package/dist/lib/model/security/rights.d.ts +8 -0
  194. package/{lib → dist/lib}/model/security/rights.js +4 -8
  195. package/{lib → dist/lib}/model/security/role.d.ts +1 -1
  196. package/{lib → dist/lib}/model/security/user.d.ts +1 -0
  197. package/dist/lib/model/storage/apiKey.d.ts +49 -0
  198. package/dist/lib/model/storage/apiKey.js +126 -0
  199. package/dist/lib/model/storage/baseModel.d.ts +100 -0
  200. package/dist/lib/model/storage/baseModel.js +211 -0
  201. package/dist/lib/service/cache/redis.d.ts +74 -0
  202. package/dist/lib/service/cache/redis.js +237 -0
  203. package/dist/lib/service/service.d.ts +30 -0
  204. package/dist/lib/service/service.js +74 -0
  205. package/{lib → dist/lib}/service/storage/7/elasticsearch.d.ts +2 -2
  206. package/{lib → dist/lib}/service/storage/7/elasticsearch.js +23 -25
  207. package/dist/lib/service/storage/7/esWrapper.d.ts +19 -0
  208. package/dist/lib/service/storage/7/esWrapper.js +245 -0
  209. package/{lib → dist/lib}/service/storage/8/elasticsearch.js +23 -25
  210. package/dist/lib/service/storage/8/esWrapper.d.ts +19 -0
  211. package/dist/lib/service/storage/8/esWrapper.js +245 -0
  212. package/{lib → dist/lib}/types/Plugin.d.ts +1 -1
  213. package/{lib/types → dist/lib/types/controllers}/Controller.d.ts +2 -2
  214. package/{lib/types → dist/lib/types/controllers}/ControllerDefinition.d.ts +1 -1
  215. package/dist/lib/types/controllers/adminControlller.type.d.ts +5 -0
  216. package/dist/lib/types/controllers/adminControlller.type.js +3 -0
  217. package/dist/lib/types/controllers/authController.type.d.ts +5 -0
  218. package/dist/lib/types/controllers/authController.type.js +3 -0
  219. package/dist/lib/types/core/auth/formatProcessing.type.d.ts +7 -0
  220. package/dist/lib/types/core/auth/formatProcessing.type.js +3 -0
  221. package/{lib → dist/lib}/types/index.d.ts +3 -3
  222. package/{lib → dist/lib}/types/index.js +3 -3
  223. package/dist/lib/util/assertType.d.ts +41 -0
  224. package/{lib → dist/lib}/util/assertType.js +38 -56
  225. package/dist/lib/util/asyncStore.d.ts +38 -0
  226. package/dist/lib/util/asyncStore.js +70 -0
  227. package/dist/lib/util/bytes.d.ts +2 -0
  228. package/dist/lib/util/bytes.js +33 -0
  229. package/dist/lib/util/debug.d.ts +2 -0
  230. package/{lib → dist/lib}/util/debug.js +15 -23
  231. package/dist/lib/util/deprecate.d.ts +1 -0
  232. package/dist/lib/util/deprecate.js +64 -0
  233. package/dist/lib/util/didYouMean.d.ts +2 -0
  234. package/{lib → dist/lib}/util/didYouMean.js +9 -15
  235. package/dist/lib/util/extractFields.d.ts +17 -0
  236. package/{lib → dist/lib}/util/extractFields.js +18 -32
  237. package/dist/lib/util/memoize.d.ts +7 -0
  238. package/{lib → dist/lib}/util/memoize.js +14 -21
  239. package/dist/lib/util/promback.d.ts +13 -0
  240. package/dist/lib/util/promback.js +60 -0
  241. package/dist/lib/util/requestAssertions.d.ts +10 -0
  242. package/dist/lib/util/requestAssertions.js +143 -0
  243. package/dist/lib/util/safeObject.d.ts +3 -0
  244. package/{lib → dist/lib}/util/safeObject.js +7 -13
  245. package/dist/lib/util/stackTrace.d.ts +19 -0
  246. package/{lib → dist/lib}/util/stackTrace.js +35 -41
  247. package/dist/lib/util/wildcard.d.ts +1 -0
  248. package/{lib → dist/lib}/util/wildcard.js +21 -30
  249. package/dist/package.json +119 -0
  250. package/package.json +44 -58
  251. package/bin/start-kuzzle-server +0 -126
  252. package/check-node-version.js +0 -17
  253. package/lib/api/controllers/adminController.js +0 -229
  254. package/lib/api/controllers/bulkController.js +0 -210
  255. package/lib/api/controllers/collectionController.js +0 -502
  256. package/lib/api/controllers/documentController.js +0 -1156
  257. package/lib/api/controllers/indexController.js +0 -179
  258. package/lib/api/controllers/memoryStorageController.js +0 -1023
  259. package/lib/api/controllers/realtimeController.js +0 -155
  260. package/lib/api/controllers/securityController.js +0 -1571
  261. package/lib/api/controllers/serverController.js +0 -381
  262. package/lib/api/documentExtractor.js +0 -309
  263. package/lib/api/funnel.js +0 -1143
  264. package/lib/api/httpRoutes.js +0 -1547
  265. package/lib/api/rateLimiter.js +0 -87
  266. package/lib/cluster/command.js +0 -284
  267. package/lib/cluster/node.js +0 -1203
  268. package/lib/cluster/publisher.js +0 -386
  269. package/lib/cluster/subscriber.js +0 -776
  270. package/lib/cluster/workers/IDCardRenewer.js +0 -144
  271. package/lib/config/index.js +0 -351
  272. package/lib/config/sdkCompatibility.json +0 -9
  273. package/lib/core/auth/formatProcessing.js +0 -66
  274. package/lib/core/auth/passportWrapper.js +0 -126
  275. package/lib/core/cache/cacheEngine.js +0 -278
  276. package/lib/core/network/accessLogger.js +0 -322
  277. package/lib/core/network/context.js +0 -80
  278. package/lib/core/network/entryPoint.js +0 -358
  279. package/lib/core/network/httpRouter/index.js +0 -316
  280. package/lib/core/network/httpRouter/routeHandler.js +0 -111
  281. package/lib/core/network/httpRouter/routePart.js +0 -147
  282. package/lib/core/network/protocols/httpMessage.js +0 -69
  283. package/lib/core/network/protocols/httpwsProtocol.js +0 -1254
  284. package/lib/core/network/protocols/internalProtocol.js +0 -109
  285. package/lib/core/network/protocols/mqttProtocol.js +0 -291
  286. package/lib/core/network/protocols/protocol.js +0 -102
  287. package/lib/core/network/router.js +0 -255
  288. package/lib/core/plugin/plugin.js +0 -436
  289. package/lib/core/plugin/pluginRepository.js +0 -132
  290. package/lib/core/plugin/pluginsManager.js +0 -1244
  291. package/lib/core/realtime/notification/document.js +0 -108
  292. package/lib/core/realtime/notification/user.js +0 -70
  293. package/lib/core/realtime/notifier.js +0 -541
  294. package/lib/core/security/README.md +0 -223
  295. package/lib/core/security/roleRepository.js +0 -569
  296. package/lib/core/security/securityLoader.js +0 -174
  297. package/lib/core/security/userRepository.js +0 -446
  298. package/lib/core/shared/README.md +0 -3
  299. package/lib/core/shared/abstractManifest.js +0 -102
  300. package/lib/core/shared/sdk/impersonatedSdk.js +0 -94
  301. package/lib/core/statistics/index.js +0 -24
  302. package/lib/core/statistics/statistics.js +0 -373
  303. package/lib/core/storage/clientAdapter.js +0 -1045
  304. package/lib/core/storage/storageEngine.js +0 -63
  305. package/lib/core/validation/baseType.js +0 -80
  306. package/lib/core/validation/index.js +0 -24
  307. package/lib/core/validation/types/date.js +0 -284
  308. package/lib/core/validation/types/email.js +0 -92
  309. package/lib/core/validation/types/enum.js +0 -100
  310. package/lib/core/validation/types/geoShape.js +0 -370
  311. package/lib/core/validation/types/ipAddress.js +0 -83
  312. package/lib/core/validation/types/numeric.js +0 -108
  313. package/lib/core/validation/types/object.js +0 -88
  314. package/lib/core/validation/types/string.js +0 -110
  315. package/lib/core/validation/types/url.js +0 -83
  316. package/lib/core/validation/validation.js +0 -1180
  317. package/lib/kerror/codes/0-core.json +0 -194
  318. package/lib/kerror/codes/1-services.json +0 -351
  319. package/lib/kerror/codes/2-api.json +0 -195
  320. package/lib/kerror/codes/3-network.json +0 -151
  321. package/lib/kerror/codes/4-plugin.json +0 -498
  322. package/lib/kerror/codes/5-validation.json +0 -158
  323. package/lib/kerror/codes/6-protocol.json +0 -28
  324. package/lib/kerror/codes/7-security.json +0 -283
  325. package/lib/kerror/codes/8-cluster.json +0 -16
  326. package/lib/kerror/codes/index.js +0 -208
  327. package/lib/kuzzle/dumpGenerator.js +0 -259
  328. package/lib/kuzzle/event/pipeRunner.js +0 -144
  329. package/lib/kuzzle/event/waterfall.js +0 -101
  330. package/lib/kuzzle/internalIndexHandler.js +0 -234
  331. package/lib/kuzzle/vault.js +0 -89
  332. package/lib/model/storage/apiKey.js +0 -158
  333. package/lib/model/storage/baseModel.js +0 -275
  334. package/lib/service/cache/redis.js +0 -282
  335. package/lib/service/service.js +0 -84
  336. package/lib/service/storage/7/esWrapper.js +0 -303
  337. package/lib/service/storage/8/esWrapper.js +0 -303
  338. package/lib/util/asyncStore.js +0 -112
  339. package/lib/util/bytes.js +0 -36
  340. package/lib/util/deprecate.js +0 -82
  341. package/lib/util/promback.js +0 -66
  342. package/lib/util/readYamlFile.d.ts +0 -2
  343. package/lib/util/readYamlFile.js +0 -10
  344. package/lib/util/requestAssertions.js +0 -157
  345. /package/{index.d.ts → dist/index.d.ts} +0 -0
  346. /package/{index.js → dist/index.js} +0 -0
  347. /package/{lib → dist/lib}/api/controllers/baseController.d.ts +0 -0
  348. /package/{lib → dist/lib}/api/controllers/baseController.js +0 -0
  349. /package/{lib → dist/lib}/api/controllers/debugController.d.ts +0 -0
  350. /package/{lib → dist/lib}/api/controllers/debugController.js +0 -0
  351. /package/{lib → dist/lib}/api/openapi/OpenApiManager.d.ts +0 -0
  352. /package/{lib → dist/lib}/api/openapi/OpenApiManager.js +0 -0
  353. /package/{lib → dist/lib}/api/openapi/index.d.ts +0 -0
  354. /package/{lib → dist/lib}/api/openapi/index.js +0 -0
  355. /package/{lib → dist/lib}/api/openapi/openApiGenerator.d.ts +0 -0
  356. /package/{lib → dist/lib}/api/openapi/openApiGenerator.js +0 -0
  357. /package/{lib → dist/lib}/api/request/index.d.ts +0 -0
  358. /package/{lib → dist/lib}/api/request/index.js +0 -0
  359. /package/{lib → dist/lib}/api/request/kuzzleRequest.js +0 -0
  360. /package/{lib → dist/lib}/api/request/requestContext.js +0 -0
  361. /package/{lib → dist/lib}/api/request/requestInput.d.ts +0 -0
  362. /package/{lib → dist/lib}/api/request/requestInput.js +0 -0
  363. /package/{lib → dist/lib}/api/request/requestResponse.d.ts +0 -0
  364. /package/{lib → dist/lib}/api/request/requestResponse.js +0 -0
  365. /package/{lib → dist/lib}/cluster/idCardHandler.d.ts +0 -0
  366. /package/{lib → dist/lib}/cluster/idCardHandler.js +0 -0
  367. /package/{lib → dist/lib}/cluster/protobuf/command.proto +0 -0
  368. /package/{lib → dist/lib}/cluster/protobuf/sync.proto +0 -0
  369. /package/{lib → dist/lib}/cluster/state.d.ts +0 -0
  370. /package/{lib → dist/lib}/cluster/state.js +0 -0
  371. /package/{lib → dist/lib}/config/default.config.d.ts +0 -0
  372. /package/{lib → dist/lib}/config/default.config.js +0 -0
  373. /package/{lib → dist/lib}/config/documentEventAliases.js +0 -0
  374. /package/{lib → dist/lib}/core/auth/tokenManager.d.ts +0 -0
  375. /package/{lib → dist/lib}/core/auth/tokenManager.js +0 -0
  376. /package/{lib → dist/lib}/core/backend/applicationManager.d.ts +0 -0
  377. /package/{lib → dist/lib}/core/backend/applicationManager.js +0 -0
  378. /package/{lib → dist/lib}/core/backend/backend.d.ts +0 -0
  379. /package/{lib → dist/lib}/core/backend/backend.js +0 -0
  380. /package/{lib → dist/lib}/core/backend/backendCluster.d.ts +0 -0
  381. /package/{lib → dist/lib}/core/backend/backendCluster.js +0 -0
  382. /package/{lib → dist/lib}/core/backend/backendConfig.d.ts +0 -0
  383. /package/{lib → dist/lib}/core/backend/backendController.d.ts +0 -0
  384. /package/{lib → dist/lib}/core/backend/backendController.js +0 -0
  385. /package/{lib → dist/lib}/core/backend/backendErrors.d.ts +0 -0
  386. /package/{lib → dist/lib}/core/backend/backendHook.d.ts +0 -0
  387. /package/{lib → dist/lib}/core/backend/backendHook.js +0 -0
  388. /package/{lib → dist/lib}/core/backend/backendImport.d.ts +0 -0
  389. /package/{lib → dist/lib}/core/backend/backendImport.js +0 -0
  390. /package/{lib → dist/lib}/core/backend/backendOpenApi.d.ts +0 -0
  391. /package/{lib → dist/lib}/core/backend/backendOpenApi.js +0 -0
  392. /package/{lib → dist/lib}/core/backend/backendPipe.d.ts +0 -0
  393. /package/{lib → dist/lib}/core/backend/backendPipe.js +0 -0
  394. /package/{lib → dist/lib}/core/backend/backendPlugin.d.ts +0 -0
  395. /package/{lib → dist/lib}/core/backend/backendPlugin.js +0 -0
  396. /package/{lib → dist/lib}/core/backend/backendStorage.d.ts +0 -0
  397. /package/{lib → dist/lib}/core/backend/backendStorage.js +0 -0
  398. /package/{lib → dist/lib}/core/backend/backendSubscription.d.ts +0 -0
  399. /package/{lib → dist/lib}/core/backend/backendSubscription.js +0 -0
  400. /package/{lib → dist/lib}/core/backend/backendVault.d.ts +0 -0
  401. /package/{lib → dist/lib}/core/backend/backendVault.js +0 -0
  402. /package/{lib → dist/lib}/core/backend/index.d.ts +0 -0
  403. /package/{lib → dist/lib}/core/backend/index.js +0 -0
  404. /package/{lib → dist/lib}/core/backend/internalLogger.d.ts +0 -0
  405. /package/{lib → dist/lib}/core/backend/internalLogger.js +0 -0
  406. /package/{lib → dist/lib}/core/cache/cacheDbEnum.d.ts +0 -0
  407. /package/{lib → dist/lib}/core/cache/cacheDbEnum.js +0 -0
  408. /package/{lib → dist/lib}/core/debug/kuzzleDebugger.d.ts +0 -0
  409. /package/{lib → dist/lib}/core/debug/kuzzleDebugger.js +0 -0
  410. /package/{lib → dist/lib}/core/plugin/pluginContext.d.ts +0 -0
  411. /package/{lib → dist/lib}/core/realtime/channel.d.ts +0 -0
  412. /package/{lib → dist/lib}/core/realtime/channel.js +0 -0
  413. /package/{lib → dist/lib}/core/realtime/connectionRooms.d.ts +0 -0
  414. /package/{lib → dist/lib}/core/realtime/connectionRooms.js +0 -0
  415. /package/{lib → dist/lib}/core/realtime/hotelClerk.d.ts +0 -0
  416. /package/{lib → dist/lib}/core/realtime/hotelClerk.js +0 -0
  417. /package/{lib → dist/lib}/core/realtime/room.d.ts +0 -0
  418. /package/{lib → dist/lib}/core/realtime/room.js +0 -0
  419. /package/{lib → dist/lib}/core/realtime/subscription.d.ts +0 -0
  420. /package/{lib → dist/lib}/core/realtime/subscription.js +0 -0
  421. /package/{lib → dist/lib}/core/security/profileRepository.d.ts +0 -0
  422. /package/{lib → dist/lib}/core/security/profileRepository.js +0 -0
  423. /package/{lib → dist/lib}/core/security/tokenRepository.d.ts +0 -0
  424. /package/{lib → dist/lib}/core/shared/KoncordeWrapper.d.ts +0 -0
  425. /package/{lib → dist/lib}/core/shared/KoncordeWrapper.js +0 -0
  426. /package/{lib → dist/lib}/core/shared/ObjectRepository.d.ts +0 -0
  427. /package/{lib → dist/lib}/core/shared/ObjectRepository.js +0 -0
  428. /package/{lib → dist/lib}/core/shared/sdk/embeddedSdk.d.ts +0 -0
  429. /package/{lib → dist/lib}/core/shared/sdk/embeddedSdk.js +0 -0
  430. /package/{lib → dist/lib}/core/shared/sdk/funnelProtocol.d.ts +0 -0
  431. /package/{lib → dist/lib}/core/shared/sdk/funnelProtocol.js +0 -0
  432. /package/{lib → dist/lib}/core/shared/store.js +0 -0
  433. /package/{lib → dist/lib}/core/storage/indexCache.d.ts +0 -0
  434. /package/{lib → dist/lib}/core/storage/indexCache.js +0 -0
  435. /package/{lib → dist/lib}/core/storage/storeScopeEnum.d.ts +0 -0
  436. /package/{lib → dist/lib}/core/storage/storeScopeEnum.js +0 -0
  437. /package/{lib → dist/lib}/kerror/errors/badRequestError.d.ts +0 -0
  438. /package/{lib → dist/lib}/kerror/errors/badRequestError.js +0 -0
  439. /package/{lib → dist/lib}/kerror/errors/externalServiceError.d.ts +0 -0
  440. /package/{lib → dist/lib}/kerror/errors/externalServiceError.js +0 -0
  441. /package/{lib → dist/lib}/kerror/errors/forbiddenError.d.ts +0 -0
  442. /package/{lib → dist/lib}/kerror/errors/forbiddenError.js +0 -0
  443. /package/{lib → dist/lib}/kerror/errors/gatewayTimeoutError.d.ts +0 -0
  444. /package/{lib → dist/lib}/kerror/errors/gatewayTimeoutError.js +0 -0
  445. /package/{lib → dist/lib}/kerror/errors/index.d.ts +0 -0
  446. /package/{lib → dist/lib}/kerror/errors/index.js +0 -0
  447. /package/{lib → dist/lib}/kerror/errors/internalError.d.ts +0 -0
  448. /package/{lib → dist/lib}/kerror/errors/internalError.js +0 -0
  449. /package/{lib → dist/lib}/kerror/errors/kuzzleError.d.ts +0 -0
  450. /package/{lib → dist/lib}/kerror/errors/kuzzleError.js +0 -0
  451. /package/{lib → dist/lib}/kerror/errors/multipleErrorsError.d.ts +0 -0
  452. /package/{lib → dist/lib}/kerror/errors/multipleErrorsError.js +0 -0
  453. /package/{lib → dist/lib}/kerror/errors/notFoundError.d.ts +0 -0
  454. /package/{lib → dist/lib}/kerror/errors/notFoundError.js +0 -0
  455. /package/{lib → dist/lib}/kerror/errors/partialError.d.ts +0 -0
  456. /package/{lib → dist/lib}/kerror/errors/partialError.js +0 -0
  457. /package/{lib → dist/lib}/kerror/errors/pluginImplementationError.d.ts +0 -0
  458. /package/{lib → dist/lib}/kerror/errors/pluginImplementationError.js +0 -0
  459. /package/{lib → dist/lib}/kerror/errors/preconditionError.d.ts +0 -0
  460. /package/{lib → dist/lib}/kerror/errors/preconditionError.js +0 -0
  461. /package/{lib → dist/lib}/kerror/errors/serviceUnavailableError.d.ts +0 -0
  462. /package/{lib → dist/lib}/kerror/errors/serviceUnavailableError.js +0 -0
  463. /package/{lib → dist/lib}/kerror/errors/sizeLimitError.d.ts +0 -0
  464. /package/{lib → dist/lib}/kerror/errors/sizeLimitError.js +0 -0
  465. /package/{lib → dist/lib}/kerror/errors/tooManyRequestsError.d.ts +0 -0
  466. /package/{lib → dist/lib}/kerror/errors/tooManyRequestsError.js +0 -0
  467. /package/{lib → dist/lib}/kerror/errors/unauthorizedError.d.ts +0 -0
  468. /package/{lib → dist/lib}/kerror/errors/unauthorizedError.js +0 -0
  469. /package/{lib → dist/lib}/kerror/index.js +0 -0
  470. /package/{lib → dist/lib}/kuzzle/event/KuzzleEventEmitter.d.ts +0 -0
  471. /package/{lib → dist/lib}/kuzzle/event/KuzzleEventEmitter.js +0 -0
  472. /package/{lib → dist/lib}/kuzzle/index.d.ts +0 -0
  473. /package/{lib → dist/lib}/kuzzle/index.js +0 -0
  474. /package/{lib → dist/lib}/model/security/profile.d.ts +0 -0
  475. /package/{lib → dist/lib}/model/security/profile.js +0 -0
  476. /package/{lib → dist/lib}/model/security/role.js +0 -0
  477. /package/{lib → dist/lib}/model/security/token.d.ts +0 -0
  478. /package/{lib → dist/lib}/model/security/token.js +0 -0
  479. /package/{lib → dist/lib}/model/security/user.js +0 -0
  480. /package/{lib → dist/lib}/service/storage/8/elasticsearch.d.ts +0 -0
  481. /package/{lib → dist/lib}/service/storage/Elasticsearch.d.ts +0 -0
  482. /package/{lib → dist/lib}/service/storage/Elasticsearch.js +0 -0
  483. /package/{lib → dist/lib}/service/storage/commons/queryTranslator.d.ts +0 -0
  484. /package/{lib → dist/lib}/service/storage/commons/queryTranslator.js +0 -0
  485. /package/{lib → dist/lib}/types/ClientConnection.d.ts +0 -0
  486. /package/{lib → dist/lib}/types/ClientConnection.js +0 -0
  487. /package/{lib → dist/lib}/types/Deprecation.d.ts +0 -0
  488. /package/{lib → dist/lib}/types/Deprecation.js +0 -0
  489. /package/{lib → dist/lib}/types/EventHandler.d.ts +0 -0
  490. /package/{lib → dist/lib}/types/EventHandler.js +0 -0
  491. /package/{lib → dist/lib}/types/Global.d.ts +0 -0
  492. /package/{lib → dist/lib}/types/Global.js +0 -0
  493. /package/{lib → dist/lib}/types/HttpMessage.d.ts +0 -0
  494. /package/{lib → dist/lib}/types/HttpMessage.js +0 -0
  495. /package/{lib → dist/lib}/types/HttpStream.d.ts +0 -0
  496. /package/{lib → dist/lib}/types/HttpStream.js +0 -0
  497. /package/{lib → dist/lib}/types/Kuzzle.d.ts +0 -0
  498. /package/{lib → dist/lib}/types/Kuzzle.js +0 -0
  499. /package/{lib → dist/lib}/types/KuzzleDocument.d.ts +0 -0
  500. /package/{lib → dist/lib}/types/KuzzleDocument.js +0 -0
  501. /package/{lib → dist/lib}/types/OpenApiDefinition.d.ts +0 -0
  502. /package/{lib → dist/lib}/types/OpenApiDefinition.js +0 -0
  503. /package/{lib → dist/lib}/types/PasswordPolicy.d.ts +0 -0
  504. /package/{lib → dist/lib}/types/PasswordPolicy.js +0 -0
  505. /package/{lib → dist/lib}/types/Plugin.js +0 -0
  506. /package/{lib → dist/lib}/types/PluginManifest.d.ts +0 -0
  507. /package/{lib → dist/lib}/types/PluginManifest.js +0 -0
  508. /package/{lib → dist/lib}/types/Policy.d.ts +0 -0
  509. /package/{lib → dist/lib}/types/Policy.js +0 -0
  510. /package/{lib → dist/lib}/types/PolicyRestrictions.d.ts +0 -0
  511. /package/{lib → dist/lib}/types/PolicyRestrictions.js +0 -0
  512. /package/{lib → dist/lib}/types/ProfileDefinition.d.ts +0 -0
  513. /package/{lib → dist/lib}/types/ProfileDefinition.js +0 -0
  514. /package/{lib → dist/lib}/types/RoleDefinition.d.ts +0 -0
  515. /package/{lib → dist/lib}/types/RoleDefinition.js +0 -0
  516. /package/{lib → dist/lib}/types/StrategyDefinition.d.ts +0 -0
  517. /package/{lib → dist/lib}/types/StrategyDefinition.js +0 -0
  518. /package/{lib → dist/lib}/types/Target.d.ts +0 -0
  519. /package/{lib → dist/lib}/types/Target.js +0 -0
  520. /package/{lib → dist/lib}/types/Token.d.ts +0 -0
  521. /package/{lib → dist/lib}/types/Token.js +0 -0
  522. /package/{lib → dist/lib}/types/User.d.ts +0 -0
  523. /package/{lib → dist/lib}/types/User.js +0 -0
  524. /package/{lib → dist/lib}/types/config/DumpConfiguration.d.ts +0 -0
  525. /package/{lib → dist/lib}/types/config/DumpConfiguration.js +0 -0
  526. /package/{lib → dist/lib}/types/config/HttpConfiguration.d.ts +0 -0
  527. /package/{lib → dist/lib}/types/config/HttpConfiguration.js +0 -0
  528. /package/{lib → dist/lib}/types/config/KuzzleConfiguration.d.ts +0 -0
  529. /package/{lib → dist/lib}/types/config/KuzzleConfiguration.js +0 -0
  530. /package/{lib → dist/lib}/types/config/LimitsConfiguration.d.ts +0 -0
  531. /package/{lib → dist/lib}/types/config/LimitsConfiguration.js +0 -0
  532. /package/{lib → dist/lib}/types/config/PluginsConfiguration.d.ts +0 -0
  533. /package/{lib → dist/lib}/types/config/PluginsConfiguration.js +0 -0
  534. /package/{lib → dist/lib}/types/config/SecurityConfiguration.d.ts +0 -0
  535. /package/{lib → dist/lib}/types/config/SecurityConfiguration.js +0 -0
  536. /package/{lib → dist/lib}/types/config/ServerConfiguration.d.ts +0 -0
  537. /package/{lib → dist/lib}/types/config/ServerConfiguration.js +0 -0
  538. /package/{lib → dist/lib}/types/config/ServicesConfiguration.d.ts +0 -0
  539. /package/{lib → dist/lib}/types/config/ServicesConfiguration.js +0 -0
  540. /package/{lib → dist/lib}/types/config/internalCache/InternalCacheRedisConfiguration.d.ts +0 -0
  541. /package/{lib → dist/lib}/types/config/internalCache/InternalCacheRedisConfiguration.js +0 -0
  542. /package/{lib → dist/lib}/types/config/publicCache/PublicCacheRedisConfiguration.d.ts +0 -0
  543. /package/{lib → dist/lib}/types/config/publicCache/PublicCacheRedisConfiguration.js +0 -0
  544. /package/{lib → dist/lib}/types/config/storageEngine/StorageEngineElasticsearchConfiguration.d.ts +0 -0
  545. /package/{lib → dist/lib}/types/config/storageEngine/StorageEngineElasticsearchConfiguration.js +0 -0
  546. /package/{lib/types → dist/lib/types/controllers}/Controller.js +0 -0
  547. /package/{lib/types → dist/lib/types/controllers}/ControllerDefinition.js +0 -0
  548. /package/{lib/types → dist/lib/types/controllers}/ControllerRights.d.ts +0 -0
  549. /package/{lib/types → dist/lib/types/controllers}/ControllerRights.js +0 -0
  550. /package/{lib → dist/lib}/types/errors/ErrorDefinition.d.ts +0 -0
  551. /package/{lib → dist/lib}/types/errors/ErrorDefinition.js +0 -0
  552. /package/{lib → dist/lib}/types/errors/ErrorDomains.d.ts +0 -0
  553. /package/{lib → dist/lib}/types/errors/ErrorDomains.js +0 -0
  554. /package/{lib → dist/lib}/types/events/EventGenericDocument.d.ts +0 -0
  555. /package/{lib → dist/lib}/types/events/EventGenericDocument.js +0 -0
  556. /package/{lib → dist/lib}/types/events/EventProtocol.d.ts +0 -0
  557. /package/{lib → dist/lib}/types/events/EventProtocol.js +0 -0
  558. /package/{lib → dist/lib}/types/realtime/RealtimeScope.d.ts +0 -0
  559. /package/{lib → dist/lib}/types/realtime/RealtimeScope.js +0 -0
  560. /package/{lib → dist/lib}/types/realtime/RealtimeUsers.d.ts +0 -0
  561. /package/{lib → dist/lib}/types/realtime/RealtimeUsers.js +0 -0
  562. /package/{lib → dist/lib}/types/realtime/RoomList.d.ts +0 -0
  563. /package/{lib → dist/lib}/types/realtime/RoomList.js +0 -0
  564. /package/{lib → dist/lib}/types/shared/StoreCollectionsDefinition.d.ts +0 -0
  565. /package/{lib → dist/lib}/types/shared/StoreCollectionsDefinition.js +0 -0
  566. /package/{lib → dist/lib}/types/storage/7/Elasticsearch.d.ts +0 -0
  567. /package/{lib → dist/lib}/types/storage/7/Elasticsearch.js +0 -0
  568. /package/{lib → dist/lib}/types/storage/8/Elasticsearch.d.ts +0 -0
  569. /package/{lib → dist/lib}/types/storage/8/Elasticsearch.js +0 -0
  570. /package/{lib → dist/lib}/util/Inflector.d.ts +0 -0
  571. /package/{lib → dist/lib}/util/Inflector.js +0 -0
  572. /package/{lib → dist/lib}/util/array.d.ts +0 -0
  573. /package/{lib → dist/lib}/util/array.js +0 -0
  574. /package/{lib → dist/lib}/util/async.d.ts +0 -0
  575. /package/{lib → dist/lib}/util/async.js +0 -0
  576. /package/{lib → dist/lib}/util/bufferedPassThrough.d.ts +0 -0
  577. /package/{lib → dist/lib}/util/bufferedPassThrough.js +0 -0
  578. /package/{lib → dist/lib}/util/crypto.d.ts +0 -0
  579. /package/{lib → dist/lib}/util/crypto.js +0 -0
  580. /package/{lib → dist/lib}/util/dump-collection.d.ts +0 -0
  581. /package/{lib → dist/lib}/util/dump-collection.js +0 -0
  582. /package/{lib → dist/lib}/util/esRequest.d.ts +0 -0
  583. /package/{lib → dist/lib}/util/esRequest.js +0 -0
  584. /package/{lib → dist/lib}/util/koncordeCompat.d.ts +0 -0
  585. /package/{lib → dist/lib}/util/koncordeCompat.js +0 -0
  586. /package/{lib → dist/lib}/util/mutex.d.ts +0 -0
  587. /package/{lib → dist/lib}/util/mutex.js +0 -0
  588. /package/{lib → dist/lib}/util/name-generator.d.ts +0 -0
  589. /package/{lib → dist/lib}/util/name-generator.js +0 -0
  590. /package/{lib → dist/lib}/util/time.d.ts +0 -0
  591. /package/{lib → dist/lib}/util/time.js +0 -0
@@ -1,1254 +0,0 @@
1
- /*
2
- * Kuzzle, a backend software, self-hostable and ready to use
3
- * to power modern apps
4
- *
5
- * Copyright 2015-2022 Kuzzle
6
- * mailto: support AT kuzzle.io
7
- * website: http://kuzzle.io
8
- *
9
- * Licensed under the Apache License, Version 2.0 (the "License");
10
- * you may not use this file except in compliance with the License.
11
- * You may obtain a copy of the License at
12
- *
13
- * https://www.apache.org/licenses/LICENSE-2.0
14
- *
15
- * Unless required by applicable law or agreed to in writing, software
16
- * distributed under the License is distributed on an "AS IS" BASIS,
17
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
- * See the License for the specific language governing permissions and
19
- * limitations under the License.
20
- */
21
-
22
- "use strict";
23
-
24
- const querystring = require("querystring");
25
- const url = require("url");
26
- const zlib = require("zlib");
27
-
28
- const uWS = require("uWebSockets.js");
29
-
30
- const { HttpStream } = require("../../../types");
31
- const { Request } = require("../../../api/request");
32
- const { KuzzleError } = require("../../../kerror/errors");
33
- const Protocol = require("./protocol");
34
- const ClientConnection = require("../clientConnection");
35
- const { removeStacktrace } = require("../../../util/stackTrace");
36
- const debug = require("../../../util/debug");
37
- const kerror = require("../../../kerror");
38
- const HttpMessage = require("./httpMessage");
39
-
40
- const kerrorWS = kerror.wrap("network", "websocket");
41
- const kerrorHTTP = kerror.wrap("network", "http");
42
- const debugWS = debug("kuzzle:network:protocols:websocket");
43
- const debugHTTP = debug("kuzzle:network:protocols:http");
44
-
45
- // The idleTimeout option should never be deactivated, so instead we use
46
- // a default value for backward-compatibility
47
- const DEFAULT_IDLE_TIMEOUT = 60000;
48
-
49
- // Size (in bytes) of backpressure an individual socket can handle before
50
- // needing to drain
51
- const WS_PER_SOCKET_BACKPRESSURE_BUFFER_SIZE = 4096;
52
-
53
- // Size of the backpressure buffer: if a client is too slow to absorb the amount
54
- // of data we need to send to it, then we forcibly close its socket to prevent
55
- // the server to be impacted by it
56
- const WS_BACKPRESSURE_BUFFER_MAX_LENGTH = 50;
57
-
58
- // Applicative WebSocket PONG message for browsers
59
- const WS_APP_PONG_RESPONSE = Buffer.from('{"p":2}');
60
-
61
- // Used by the broadcast method to build JSON payloads while limiting the
62
- // number of JSON serializations
63
- const JSON_ROOM_PROPERTY = ',"room":"';
64
- const JSON_ENDER = '"}';
65
-
66
- // Pre-computed messages & errors
67
- const WS_FORCED_TERMINATION_CODE = 1011;
68
- const WS_BACKPRESSURE_MESSAGE = Buffer.from(
69
- "too much backpressure: client is too slow",
70
- );
71
- const WS_GENERIC_CLOSE_MESSAGE = Buffer.from(
72
- "Connection closed by remote host",
73
- );
74
- const WS_RATE_LIMIT_EXCEEDED_ERROR = kerrorWS.get("ratelimit_exceeded");
75
- const HTTP_REQUEST_TOO_LARGE_ERROR = kerrorHTTP.get("request_too_large");
76
- const HTTP_FILE_TOO_LARGE_ERROR = kerrorHTTP.get("file_too_large");
77
-
78
- // HTTP-related constants
79
- const HTTP_ALLOWED_CONTENT_TYPES = [
80
- "application/json",
81
- "application/x-www-form-urlencoded",
82
- "multipart/form-data",
83
- ];
84
- const HTTP_SKIPPED_HEADERS = ["content-length", "set-cookie"];
85
- const HTTP_HEADER_CONNECTION = Buffer.from("Connection");
86
- const HTTP_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN = Buffer.from(
87
- "Access-Control-Allow-Origin",
88
- );
89
- const HTTP_HEADER_SET_COOKIE = Buffer.from("Set-Cookie");
90
- const HTTP_HEADER_VARY = Buffer.from("Vary");
91
- const WILDCARD = Buffer.from("*");
92
- const ORIGIN = Buffer.from("Origin");
93
- const X_KUZZLE_REQUEST_ID = Buffer.from("X-Kuzzle-Request-Id");
94
- const CLOSE = Buffer.from("close");
95
- const CHARSET_REGEX = /charset=([\w-]+)/i;
96
-
97
- /**
98
- * @class HTTPWS
99
- * Handles both HTTP and WebSocket connections
100
- */
101
- class HttpWsProtocol extends Protocol {
102
- constructor() {
103
- super("websocket");
104
-
105
- this.server = null;
106
- this.wsConfig = null;
107
- this.httpConfig = null;
108
-
109
- // Used to limit the rate of messages on websocket
110
- this.now = Date.now();
111
- this.nowInterval = setInterval(() => {
112
- this.now = Date.now();
113
- }, 1000);
114
-
115
- // Map<uWS.WebSocket, ClientConnection>
116
- this.connectionBySocket = new Map();
117
-
118
- // Map<uWS.WebSocket, Array.<Buffer>>
119
- this.backpressureBuffer = new Map();
120
-
121
- // Map<string, uWS.WebSocket>
122
- this.socketByConnectionId = new Map();
123
-
124
- this.logger = global.kuzzle.log.child("core:network:protocols:httpws");
125
- }
126
-
127
- async init(entrypoint) {
128
- super.init(null, entrypoint);
129
-
130
- this.config = entrypoint.config.protocols;
131
-
132
- this.wsConfig = this.parseWebSocketOptions();
133
- this.httpConfig = this.parseHttpOptions();
134
-
135
- if (!this.wsConfig.enabled && !this.httpConfig.enabled) {
136
- return false;
137
- }
138
-
139
- // eslint-disable-next-line new-cap
140
- this.server = uWS.App();
141
-
142
- if (this.wsConfig.enabled) {
143
- this.initWebSocket();
144
- }
145
-
146
- if (this.httpConfig.enabled) {
147
- this.initHttp();
148
- }
149
-
150
- this.server.listen(entrypoint.config.port, (socket) => {
151
- if (!socket) {
152
- throw new Error(
153
- `[http/websocket] fatal: unable to listen to port ${entrypoint.config.port}`,
154
- );
155
- }
156
- });
157
-
158
- return true;
159
- }
160
-
161
- initWebSocket() {
162
- /* eslint-disable sort-keys */
163
- this.server.ws("/*", {
164
- ...this.wsConfig.opts,
165
- maxBackPressure: WS_PER_SOCKET_BACKPRESSURE_BUFFER_SIZE,
166
- upgrade: this.wsOnUpgradeHandler.bind(this),
167
- open: this.wsOnOpenHandler.bind(this),
168
- close: this.wsOnCloseHandler.bind(this),
169
- message: this.wsOnMessageHandler.bind(this),
170
- drain: this.wsOnDrainHandler.bind(this),
171
- });
172
- /* eslint-enable sort-keys */
173
- }
174
-
175
- initHttp() {
176
- this.server.any("/*", this.httpOnMessageHandler.bind(this));
177
- }
178
-
179
- broadcast(data) {
180
- const stringified = JSON.stringify(data.payload);
181
- const payloadByteSize = Buffer.from(stringified).byteLength;
182
- // 255 bytes should be enough to hold the following:
183
- // ,"room":"<channel identifier>"
184
- // (with current channel encoding, this is less than 100 bytes)
185
- const payload = Buffer.allocUnsafe(payloadByteSize + 255);
186
-
187
- let offset = payloadByteSize - 1;
188
-
189
- payload.write(stringified, 0);
190
- payload.write(JSON_ROOM_PROPERTY, offset);
191
-
192
- offset += JSON_ROOM_PROPERTY.length;
193
-
194
- for (const channel of data.channels) {
195
- // Adds the room property to the message
196
- payload.write(channel, offset);
197
- payload.write(JSON_ENDER, offset + channel.length);
198
-
199
- // prevent buffer overwrites due to sending packets being an
200
- // async method (race condition)
201
- const payloadLength = offset + channel.length + JSON_ENDER.length;
202
- const payloadSafeCopy = Buffer.allocUnsafe(payloadLength);
203
-
204
- payload.copy(payloadSafeCopy, 0, 0, payloadLength);
205
-
206
- debugWS(
207
- 'Publishing to channel "realtime/%s": %s',
208
- channel,
209
- payloadSafeCopy,
210
- );
211
- this.server.publish(`realtime/${channel}`, payloadSafeCopy, false);
212
- }
213
- }
214
-
215
- notify(data) {
216
- const socket = this.socketByConnectionId.get(data.connectionId);
217
- debugWS("notify: %a", data);
218
-
219
- if (!socket) {
220
- return;
221
- }
222
-
223
- const payload = data.payload;
224
-
225
- for (let i = 0; i < data.channels.length; i++) {
226
- payload.room = data.channels[i];
227
- this.wsSend(socket, Buffer.from(JSON.stringify(payload)));
228
- }
229
- }
230
-
231
- joinChannel(channel, connectionId) {
232
- const socket = this.socketByConnectionId.get(connectionId);
233
-
234
- if (!socket) {
235
- return;
236
- }
237
-
238
- debugWS(
239
- 'Subscribing connection ID "%s" to channel "realtime/%s"',
240
- connectionId,
241
- channel,
242
- );
243
- socket.subscribe(`realtime/${channel}`);
244
- }
245
-
246
- leaveChannel(channel, connectionId) {
247
- const socket = this.socketByConnectionId.get(connectionId);
248
-
249
- if (!socket) {
250
- return;
251
- }
252
-
253
- debugWS(
254
- 'Removing connection ID "%s" from channel "realtime/%s"',
255
- connectionId,
256
- channel,
257
- );
258
-
259
- socket.unsubscribe(`realtime/${channel}`);
260
- }
261
-
262
- disconnect(connectionId, message = null) {
263
- debugWS("[%s] forced disconnect", connectionId);
264
-
265
- const socket = this.socketByConnectionId.get(connectionId);
266
-
267
- if (!socket) {
268
- return;
269
- }
270
-
271
- socket.end(
272
- WS_FORCED_TERMINATION_CODE,
273
- message ? Buffer.from(message) : WS_GENERIC_CLOSE_MESSAGE,
274
- );
275
- }
276
-
277
- wsOnUpgradeHandler(res, req, context) {
278
- const headers = {};
279
- // Extract headers from uWS request
280
- req.forEach((header, value) => {
281
- headers[header] = value;
282
- });
283
-
284
- res.upgrade(
285
- {
286
- headers,
287
- internal: {},
288
- },
289
- req.getHeader("sec-websocket-key"),
290
- req.getHeader("sec-websocket-protocol"),
291
- req.getHeader("sec-websocket-extensions"),
292
- context,
293
- );
294
- }
295
-
296
- wsOnOpenHandler(socket) {
297
- const ip = Buffer.from(socket.getRemoteAddressAsText()).toString();
298
- const connection = new ClientConnection(
299
- this.name,
300
- [ip],
301
- socket.headers,
302
- socket.internal,
303
- );
304
-
305
- this.entryPoint.newConnection(connection);
306
- this.connectionBySocket.set(socket, connection);
307
- this.socketByConnectionId.set(connection.id, socket);
308
- this.backpressureBuffer.set(socket, []);
309
- }
310
-
311
- wsOnCloseHandler(socket, code, message) {
312
- const connection = this.connectionBySocket.get(socket);
313
-
314
- if (!connection) {
315
- return;
316
- }
317
-
318
- const reason = Buffer.from(message || "").toString();
319
-
320
- // This hack is only here to indicate that uWebSockets killed the connection early
321
- // because the received payload exceeded the configured threshold.
322
- if (code === 1006 && reason.startsWith("Received too big message")) {
323
- this.logger.error(
324
- `[${connection.id}] connection closed: payload exceeded the threshold`,
325
- );
326
- }
327
-
328
- if (debugWS.enabled) {
329
- debugWS(
330
- "[%s] received a `close` event (CODE: %d, REASON: %s)",
331
- connection.id,
332
- code,
333
- reason,
334
- );
335
- }
336
- this.entryPoint.removeConnection(connection.id);
337
- this.connectionBySocket.delete(socket);
338
- this.backpressureBuffer.delete(socket);
339
- this.socketByConnectionId.delete(connection.id);
340
- }
341
-
342
- async wsOnMessageHandler(socket, data) {
343
- if (!data || data.byteLength === 0) {
344
- return;
345
- }
346
-
347
- const connection = this.connectionBySocket.get(socket);
348
-
349
- // enforce rate limits
350
- if (this.wsConfig.rateLimit > 0) {
351
- if (socket.last === this.now) {
352
- socket.count++;
353
-
354
- if (socket.count > this.wsConfig.rateLimit) {
355
- this.wsSendError(socket, connection, WS_RATE_LIMIT_EXCEEDED_ERROR);
356
- return;
357
- }
358
- } else {
359
- socket.last = this.now;
360
- socket.count = 1;
361
- }
362
- }
363
-
364
- let parsed;
365
- let message = Buffer.from(data).toString();
366
-
367
- debugWS("[%s] client message: %s", connection.id, message);
368
-
369
- ({ payload: message } = await global.kuzzle.pipe(
370
- "protocol:websocket:beforeParsingPayload",
371
- { connection, payload: message },
372
- ));
373
-
374
- try {
375
- ({ payload: parsed } = await global.kuzzle.pipe(
376
- "protocol:websocket:afterParsingPayload",
377
- { connection, payload: JSON.parse(message) },
378
- ));
379
- } catch (e) {
380
- /*
381
- we cannot add a "room" information since we need to extract
382
- a request ID from the incoming data, which is apparently
383
- not a valid JSON
384
- So... the error is forwarded to the client, hoping they know
385
- what to do with it.
386
- */
387
- this.wsSendError(
388
- socket,
389
- connection,
390
- kerrorWS.getFrom(e, "unexpected_error", e.message),
391
- );
392
- return;
393
- }
394
-
395
- if (parsed.p && parsed.p === 1 && Object.keys(parsed).length === 1) {
396
- debugWS('[%s] sending back a "pong" message', connection.id);
397
- this.wsSend(socket, WS_APP_PONG_RESPONSE);
398
- return;
399
- }
400
-
401
- let request;
402
-
403
- try {
404
- request = new Request(parsed, { connection });
405
- } catch (e) {
406
- this.wsSendError(socket, connection, e, parsed.requestId);
407
- return;
408
- }
409
-
410
- this.entryPoint.execute(connection, request, (result) => {
411
- if (result.content) {
412
- if (typeof result.content === "object") {
413
- result.content.room = result.requestId;
414
- }
415
- } else {
416
- result.content = "";
417
- }
418
-
419
- this.wsSend(socket, Buffer.from(JSON.stringify(result.content)));
420
- });
421
- }
422
-
423
- /**
424
- * Absorb as much of the backpressure buffer as possible
425
- * @param {uWS.WebSocket} socket
426
- */
427
- wsOnDrainHandler(socket) {
428
- socket.cork(() => {
429
- const buffer = this.backpressureBuffer.get(socket);
430
-
431
- while (
432
- buffer.length > 0 &&
433
- socket.getBufferedAmount() < WS_PER_SOCKET_BACKPRESSURE_BUFFER_SIZE
434
- ) {
435
- const payload = buffer.shift();
436
- socket.send(payload);
437
- }
438
- });
439
- }
440
-
441
- /**
442
- * Forwards an error to a socket
443
- *
444
- * @param {uWS.WebSocket} socket
445
- * @param {ClientConnection} connection
446
- * @param {Error} error
447
- * @param {String} requestId @optional
448
- */
449
- wsSendError(socket, connection, error, requestId) {
450
- const request = new Request({}, { connection, error });
451
-
452
- // If a requestId is provided we use it instead of the generated one
453
- request.id = requestId || request.id;
454
-
455
- const sanitized = removeStacktrace(request.response.toJSON()).content;
456
-
457
- this.wsSend(socket, Buffer.from(JSON.stringify(sanitized)));
458
- }
459
-
460
- /**
461
- * Sends a message immediately, or queue it up for later if backpressure built
462
- * up
463
- *
464
- * @param {uWS.WebSocket} socket
465
- * @param {Buffer} payload
466
- */
467
- wsSend(socket, payload) {
468
- if (!this.connectionBySocket.has(socket)) {
469
- return;
470
- }
471
-
472
- if (socket.getBufferedAmount() < WS_PER_SOCKET_BACKPRESSURE_BUFFER_SIZE) {
473
- socket.cork(() => socket.send(payload));
474
- } else {
475
- const buffer = this.backpressureBuffer.get(socket);
476
- buffer.push(payload);
477
-
478
- /**
479
- * Client socket too slow: we need to close it
480
- *
481
- * If the socket is marked as a debugSession, we don't close it
482
- * the debugger might send a lot of messages and we don't want to
483
- * loose the connection while debugging and loose important information.
484
- */
485
- if (
486
- !socket.internal.debugSession &&
487
- buffer.length > WS_BACKPRESSURE_BUFFER_MAX_LENGTH
488
- ) {
489
- socket.end(WS_FORCED_TERMINATION_CODE, WS_BACKPRESSURE_MESSAGE);
490
- }
491
- }
492
- }
493
-
494
- /**
495
- * @param {uWS.HttpResponse} response
496
- * @param {uWS.HttpRequest} request
497
- */
498
- httpOnMessageHandler(response, request) {
499
- const connection = new ClientConnection(
500
- "HTTP/1.1",
501
- getHttpIps(response, request),
502
- request.headers,
503
- );
504
- const message = new HttpMessage(connection, request);
505
-
506
- debugHTTP("[%s] Received HTTP request: %a", connection.id, message);
507
-
508
- if (message.headers["content-length"] > this.maxRequestSize) {
509
- this.httpSendError(message, response, HTTP_REQUEST_TOO_LARGE_ERROR);
510
- return;
511
- }
512
-
513
- const contentTypeHeader = message.headers["content-type"];
514
-
515
- if (contentTypeHeader) {
516
- const contentTypeParamIndex = contentTypeHeader.indexOf(";");
517
- const contentType =
518
- contentTypeParamIndex !== -1
519
- ? contentTypeHeader.slice(0, contentTypeParamIndex).trim()
520
- : contentTypeHeader.trim();
521
-
522
- if (
523
- !this.httpConfig.opts.allowedContentTypes.some(
524
- (allowed) => contentType === allowed,
525
- )
526
- ) {
527
- this.httpSendError(
528
- message,
529
- response,
530
- kerrorHTTP.get("unsupported_content", contentType),
531
- );
532
- return;
533
- }
534
- }
535
-
536
- const encoding = CHARSET_REGEX.exec(contentTypeHeader);
537
-
538
- if (encoding !== null && encoding[1].toLowerCase() !== "utf-8") {
539
- this.httpSendError(
540
- message,
541
- response,
542
- kerrorHTTP.get("unsupported_charset", encoding[1].toLowerCase()),
543
- );
544
- return;
545
- }
546
-
547
- this.httpReadData(message, response, (err) => {
548
- if (err) {
549
- this.httpSendError(message, response, err);
550
- return;
551
- }
552
-
553
- this.httpProcessRequest(response, message);
554
- });
555
- }
556
-
557
- /**
558
- * Read an HTTP payload data
559
- *
560
- * @param {HttpMessage} message
561
- * @param {uWS.HttpResponse} response
562
- * @param {Function} cb
563
- */
564
- httpReadData(message, response, cb) {
565
- let payload = null;
566
- response.aborted = false;
567
-
568
- response.onData((data, isLast) => {
569
- const chunk = Buffer.from(data);
570
-
571
- payload = payload
572
- ? Buffer.concat([payload, chunk])
573
- : Buffer.concat([chunk]);
574
-
575
- /*
576
- * The content-length header can be bypassed and
577
- * is not reliable enough. We have to enforce the HTTP
578
- * max size limit while reading chunks too
579
- */
580
- if (payload.byteLength > this.maxRequestSize) {
581
- cb(HTTP_REQUEST_TOO_LARGE_ERROR);
582
- return;
583
- }
584
-
585
- if (!isLast) {
586
- return;
587
- }
588
-
589
- if (payload.byteLength === 0) {
590
- cb();
591
- return;
592
- }
593
-
594
- let resolve;
595
- let promise = new Promise((res) => (resolve = res));
596
-
597
- this.httpUncompress(message, payload, async (err, inflated) => {
598
- if (err) {
599
- cb(err);
600
- resolve();
601
- return;
602
- }
603
-
604
- const { payload: newPayload } = await global.kuzzle.pipe(
605
- "protocol:http:beforeParsingPayload",
606
- { message, payload: inflated },
607
- );
608
- await this.httpParseContent(message, newPayload, cb);
609
- resolve();
610
- });
611
-
612
- return promise;
613
- });
614
-
615
- // Beware: the "response" object might be invalidated at any point of time,
616
- // whenever the connection gets closed by the client for instance
617
- response.onAborted(() => {
618
- response.aborted = true;
619
- });
620
- }
621
-
622
- async httpParseContent(message, content, cb) {
623
- const type = message.headers["content-type"] || "";
624
-
625
- if (type.includes("multipart/form-data")) {
626
- const parts = uWS.getParts(content, message.headers["content-type"]);
627
- message.content = {};
628
-
629
- if (!parts) {
630
- cb();
631
- return;
632
- }
633
-
634
- for (const part of parts) {
635
- if (part.data.byteLength > this.maxFormFileSize) {
636
- cb(HTTP_FILE_TOO_LARGE_ERROR);
637
- return;
638
- }
639
-
640
- if (part.filename) {
641
- message.content[part.name] = {
642
- encoding: part.type,
643
- file: Buffer.from(part.data).toString("base64"),
644
- filename: part.filename,
645
- };
646
- } else {
647
- message.content[part.name] = Buffer.from(part.data).toString();
648
- }
649
- }
650
- } else if (type.includes("application/x-www-form-urlencoded")) {
651
- message.content = querystring.parse(content.toString());
652
- } else {
653
- try {
654
- const { payload } = await global.kuzzle.pipe(
655
- "protocol:http:afterParsingPayload",
656
- { message, payload: JSON.parse(content.toString()) },
657
- );
658
- message.content = payload;
659
- } catch (e) {
660
- cb(
661
- kerrorHTTP.get("body_parse_failed", content.toString().slice(0, 50)),
662
- );
663
- return;
664
- }
665
- }
666
-
667
- cb();
668
- }
669
-
670
- httpProcessRequest(response, message) {
671
- debugHTTP("[%s] httpProcessRequest: %a", message.connection.id, message);
672
-
673
- if (response.aborted) {
674
- return;
675
- }
676
-
677
- this.entryPoint.newConnection(message.connection);
678
-
679
- global.kuzzle.router.http.route(message, (request) => {
680
- this.entryPoint.logAccess(message.connection, request, message);
681
- this.entryPoint.removeConnection(message.connection.id);
682
-
683
- if (response.aborted) {
684
- return;
685
- }
686
-
687
- if (request.result instanceof HttpStream) {
688
- this.httpSendStream(request, response, request.result, message);
689
- return;
690
- }
691
-
692
- // Send the response in one go
693
-
694
- const data = this.httpRequestToResponse(request, message);
695
-
696
- this.httpCompress(message, data, (result) => {
697
- if (response.aborted) {
698
- return;
699
- }
700
-
701
- request.response.setHeader("Content-Encoding", result.encoding);
702
-
703
- response.cork(() => {
704
- this.httpWriteRequestHeaders(request, response, message);
705
-
706
- const [success] = response.tryEnd(
707
- result.compressed,
708
- result.compressed.length,
709
- );
710
-
711
- if (!success) {
712
- response.onWritable((offset) => {
713
- const retryData = result.compressed.subarray(offset);
714
- const [retrySuccess] = response.tryEnd(
715
- retryData,
716
- retryData.length,
717
- );
718
-
719
- return retrySuccess;
720
- });
721
- }
722
- });
723
- });
724
- });
725
- }
726
-
727
- /**
728
- *
729
- * @param {uWS.HttpRequest} request
730
- * @param {uWS.HttpResponse} response
731
- * @param {HttpMessage} message
732
- */
733
- httpWriteRequestHeaders(request, response, message) {
734
- response.writeStatus(Buffer.from(request.response.status.toString()));
735
-
736
- response.writeHeader(HTTP_HEADER_CONNECTION, CLOSE);
737
- response.writeHeader(X_KUZZLE_REQUEST_ID, message.requestId);
738
-
739
- for (const header of this.httpConfig.headers) {
740
- // If header is missing, add the default one
741
- if (request.response.headers[header[2]] === undefined) {
742
- response.writeHeader(header[0], header[1]);
743
- }
744
- }
745
-
746
- // Access-Control-Allow-Origin Logic
747
- if (
748
- request.response.headers["Access-Control-Allow-Origin"] === undefined &&
749
- message.headers &&
750
- message.headers.origin
751
- ) {
752
- response.writeHeader(
753
- HTTP_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN,
754
- Buffer.from(message.headers.origin),
755
- );
756
-
757
- response.writeHeader(HTTP_HEADER_VARY, ORIGIN);
758
- }
759
-
760
- if (request.response.headers["set-cookie"]) {
761
- for (const cookie of request.response.headers["set-cookie"]) {
762
- response.writeHeader(HTTP_HEADER_SET_COOKIE, Buffer.from(cookie));
763
- }
764
- }
765
-
766
- for (const [key, value] of Object.entries(request.response.headers)) {
767
- // Skip some headers that are not allowed to be sent or modified
768
- if (HTTP_SKIPPED_HEADERS.includes(key.toLowerCase())) {
769
- continue;
770
- }
771
-
772
- response.writeHeader(Buffer.from(key), Buffer.from(value.toString()));
773
- }
774
- }
775
-
776
- /**
777
- * Send stream data thorugh the HTTP response
778
- * @param {HttpRequest} request
779
- * @param {HttpStream} httpStream - The data stream to send
780
- * @param {uWS.HttpResponse} response
781
- * @param {HttpMessage} message
782
- */
783
- httpSendStream(request, response, httpStream, message) {
784
- const streamSizeFixed =
785
- typeof httpStream.totalBytes === "number" && httpStream.totalBytes > 0;
786
-
787
- if (httpStream.errored) {
788
- this.httpSendError(
789
- message,
790
- response,
791
- kerror.get(
792
- "network",
793
- "http",
794
- "stream_errored",
795
- httpStream.error.message,
796
- ),
797
- );
798
- return;
799
- }
800
-
801
- if (httpStream.destroyed) {
802
- this.httpSendError(
803
- message,
804
- response,
805
- kerror.get("network", "http", "stream_closed"),
806
- );
807
- return;
808
- }
809
-
810
- // Remove Content-Length header to avoid conflic with Transfer-Encoding header
811
- request.response.setHeader("Content-Length", null);
812
-
813
- // Send Headers in one go
814
- response.cork(() => {
815
- this.httpWriteRequestHeaders(request, response, message);
816
- });
817
-
818
- httpStream.stream.on("data", (chunk) => {
819
- // Make a copy of the array buffer
820
- const arrayBuffer = chunk.buffer.slice(
821
- chunk.byteOffset,
822
- chunk.byteOffset + chunk.byteLength,
823
- );
824
-
825
- const arrayBufferOffset = response.getWriteOffset();
826
-
827
- let backpressure = false;
828
-
829
- /**
830
- * Switch method of writing data to the response
831
- * based on the size of the stream.
832
- * If the stream has a fixed size we can use the tryEnd method
833
- */
834
- if (streamSizeFixed) {
835
- const [success, done] = response.tryEnd(
836
- arrayBuffer,
837
- httpStream.totalBytes,
838
- );
839
- backpressure = !success;
840
-
841
- if (done) {
842
- httpStream.destroy();
843
- return;
844
- }
845
- } else {
846
- const success = response.write(arrayBuffer);
847
-
848
- backpressure = !success;
849
- }
850
-
851
- // In case of backpressure we need to wait for drainage before sending more data
852
- if (backpressure) {
853
- response.arrayBufferOffset = arrayBufferOffset;
854
- response.arrayBuffer = arrayBuffer;
855
- httpStream.stream.pause();
856
-
857
- /**
858
- * When the stream is drained we can resume sending data,
859
- * only if the is no backpressure after we wrote the missing chunk data.
860
- */
861
- response.onWritable((offset) => {
862
- if (!streamSizeFixed && offset - response.arrayBufferOffset === 0) {
863
- httpStream.stream.resume();
864
- return true;
865
- }
866
-
867
- let retryBackpressure = false;
868
- const remainingChunkData = response.arrayBuffer.slice(
869
- offset - response.arrayBufferOffset,
870
- );
871
-
872
- if (streamSizeFixed) {
873
- const [success] = response.tryEnd(
874
- remainingChunkData,
875
- httpStream.totalBytes,
876
- );
877
-
878
- retryBackpressure = !success;
879
- } else {
880
- const success = response.write(remainingChunkData);
881
-
882
- retryBackpressure = !success;
883
- }
884
-
885
- if (!retryBackpressure) {
886
- httpStream.stream.resume();
887
- }
888
-
889
- return !retryBackpressure;
890
- });
891
- }
892
- });
893
-
894
- httpStream.stream.on("end", () => {
895
- if (httpStream.destroy()) {
896
- response.end();
897
- }
898
- });
899
-
900
- httpStream.stream.on("close", () => {
901
- if (httpStream.destroy()) {
902
- response.end();
903
- }
904
- });
905
-
906
- httpStream.stream.on("error", (err) => {
907
- if (httpStream.destroy()) {
908
- response.end();
909
- }
910
-
911
- debugHTTP(
912
- "[%s] httpSendStream: %s",
913
- httpStream.connection.id,
914
- err.message,
915
- );
916
- });
917
-
918
- response.onAborted(() => {
919
- httpStream.destroy();
920
- });
921
- }
922
-
923
- /**
924
- * Forward an error response to the client
925
- *
926
- * @param {HttpMessage} message
927
- * @param {uWS.HttpResponse} response
928
- * @param {Error} error
929
- */
930
- httpSendError(message, response, error) {
931
- const kerr =
932
- error instanceof KuzzleError
933
- ? error
934
- : kerrorHTTP.getFrom(error, "unexpected_error", error.message);
935
-
936
- const content = Buffer.from(JSON.stringify(removeStacktrace(kerr)));
937
-
938
- debugHTTP("[%s] httpSendError: %a", message.connection.id, kerr);
939
-
940
- this.entryPoint.logAccess(
941
- message.connection,
942
- new Request(message, {
943
- connectionId: message.connection.id,
944
- error: kerr,
945
- }),
946
- message,
947
- );
948
- this.entryPoint.removeConnection(message.connection.id);
949
-
950
- if (response.aborted) {
951
- return;
952
- }
953
-
954
- response.cork(() => {
955
- response.writeStatus(Buffer.from(kerr.status.toString()));
956
-
957
- for (const header of this.httpConfig.headers) {
958
- response.writeHeader(header[0], header[1]);
959
- }
960
-
961
- // Access-Control-Allow-Origin Logic
962
- if (message.headers && message.headers.origin) {
963
- if (global.kuzzle.config.internal.allowAllOrigins) {
964
- response.writeHeader(
965
- HTTP_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN,
966
- WILDCARD,
967
- );
968
- } else {
969
- response.writeHeader(
970
- HTTP_HEADER_ACCESS_CONTROL_ALLOW_ORIGIN,
971
- Buffer.from(message.headers.origin),
972
- );
973
- response.writeHeader(HTTP_HEADER_VARY, ORIGIN);
974
- }
975
- }
976
-
977
- response.end(content);
978
- });
979
- }
980
-
981
- /**
982
- * Convert a Kuzzle query result into an appropriate payload format
983
- * to send back to the client
984
- *
985
- * @param {Request} request
986
- * @param {HttpMessage} message
987
- * @returns {Buffer}
988
- */
989
- httpRequestToResponse(request, message) {
990
- let data = removeStacktrace(request.response.toJSON());
991
-
992
- if (message.requestId !== data.requestId) {
993
- data.requestId = message.requestId;
994
-
995
- if (!data.raw) {
996
- data.content.requestId = message.requestId;
997
- }
998
- }
999
-
1000
- debugHTTP("HTTP request response: %a", data);
1001
-
1002
- if (data.raw) {
1003
- if (data.content === null || data.content === undefined) {
1004
- data = "";
1005
- } else if (typeof data.content === "object") {
1006
- /*
1007
- This object can be either a Buffer object, a stringified Buffer object,
1008
- or anything else.
1009
- In the former two cases, we create a new Buffer object, and in the
1010
- latter, we stringify t he content.
1011
- */
1012
- if (
1013
- data.content instanceof Buffer ||
1014
- (data.content.type === "Buffer" && Array.isArray(data.content.data))
1015
- ) {
1016
- data = data.content;
1017
- } else {
1018
- data = JSON.stringify(data.content);
1019
- }
1020
- } else {
1021
- // scalars are sent as strings
1022
- data = data.content.toString();
1023
- }
1024
- } else {
1025
- let indent = 0;
1026
- const parsedUrl = url.parse(message.url, true);
1027
-
1028
- if (parsedUrl.query && parsedUrl.query.pretty !== undefined) {
1029
- indent = 2;
1030
- }
1031
-
1032
- data = JSON.stringify(data.content, undefined, indent);
1033
- }
1034
-
1035
- return Buffer.from(data);
1036
- }
1037
-
1038
- /**
1039
- * Compress an outgoing message according to the
1040
- * specified accept-encoding HTTP header
1041
- *
1042
- * @param {HttpMessage} message
1043
- * @param {Buffer} data
1044
- * @param {Function} callback
1045
- */
1046
- httpCompress(message, data, callback) {
1047
- if (message.headers["accept-encoding"]) {
1048
- const encodings = message.headers["accept-encoding"]
1049
- .split(",")
1050
- .map((e) => e.trim().toLowerCase());
1051
-
1052
- let algorithm;
1053
- let priority = -1;
1054
-
1055
- for (const encoding of encodings) {
1056
- if (encoding.startsWith("gzip") || encoding.startsWith("deflate")) {
1057
- let [_algorithm, _priority = "q=0"] = encoding.split(";");
1058
- _priority = Number.parseFloat(_priority.split("=")[1] || 0);
1059
-
1060
- if (_priority > priority) {
1061
- algorithm = _algorithm;
1062
- priority = _priority;
1063
- }
1064
- // gzip should be the preferred algorithm in case of a tie
1065
- else if (
1066
- Math.abs(priority - _priority) < 10e-3 &&
1067
- _algorithm === "gzip"
1068
- ) {
1069
- algorithm = "gzip";
1070
- }
1071
- }
1072
- }
1073
-
1074
- if (algorithm === "gzip") {
1075
- zlib.gzip(data, (err, compressed) =>
1076
- callback({
1077
- compressed: !err ? compressed : data,
1078
- encoding: !err ? "gzip" : "identity",
1079
- }),
1080
- );
1081
- return;
1082
- } else if (algorithm === "deflate") {
1083
- zlib.deflate(data, (err, compressed) =>
1084
- callback({
1085
- compressed: !err ? compressed : data,
1086
- encoding: !err ? "deflate" : "identity",
1087
- }),
1088
- );
1089
- return;
1090
- }
1091
- }
1092
-
1093
- callback({
1094
- compressed: data,
1095
- encoding: "identity",
1096
- });
1097
- }
1098
-
1099
- httpUncompress(message, payload, cb) {
1100
- let encodings = message.headers["content-encoding"];
1101
- if (!encodings) {
1102
- cb(null, payload);
1103
- return;
1104
- }
1105
-
1106
- encodings = encodings.split(",").map((e) => e.trim().toLowerCase());
1107
-
1108
- if (encodings.length > this.httpConfig.opts.maxEncodingLayers) {
1109
- cb(kerrorHTTP.get("too_many_encodings"));
1110
- return;
1111
- }
1112
-
1113
- // encodings are listed in the same order they have been applied
1114
- // this means that we need to invert the list to correctly
1115
- // decode the message
1116
- encodings.reverse();
1117
-
1118
- this.httpUncompressStep(encodings, payload, cb, 0);
1119
- }
1120
-
1121
- httpUncompressStep(encodings, payload, cb, index) {
1122
- if (index === encodings.length) {
1123
- cb(null, payload);
1124
- return;
1125
- }
1126
-
1127
- const encoding = encodings[index];
1128
-
1129
- if (encoding === "identity") {
1130
- this.httpUncompressStep(encodings, payload, cb, index + 1);
1131
- } else if (encoding === "gzip" || encoding === "deflate") {
1132
- const fn = encoding === "gzip" ? zlib.gunzip : zlib.inflate;
1133
-
1134
- fn(payload, (err, inflated) => {
1135
- if (err) {
1136
- cb(err);
1137
- return;
1138
- }
1139
-
1140
- this.httpUncompressStep(encodings, inflated, cb, index + 1);
1141
- });
1142
- } else {
1143
- cb(kerrorHTTP.get("unsupported_compression", encoding));
1144
- }
1145
- }
1146
-
1147
- parseWebSocketOptions() {
1148
- const cfg = this.config.websocket;
1149
-
1150
- if (cfg === undefined) {
1151
- this.logger.warn(
1152
- "[websocket] no configuration found for websocket: disabling it",
1153
- );
1154
- return { enabled: false };
1155
- }
1156
-
1157
- let idleTimeout = cfg.idleTimeout;
1158
- const compression = cfg.compression ? uWS.SHARED_COMPRESSOR : uWS.DISABLED;
1159
-
1160
- if (idleTimeout === 0 || idleTimeout < 1000) {
1161
- idleTimeout = DEFAULT_IDLE_TIMEOUT;
1162
- this.logger.warn(
1163
- `[websocket] The "idleTimeout" parameter can neither be deactivated or be set with a value lower than 1000. Defaulted to ${DEFAULT_IDLE_TIMEOUT}.`,
1164
- );
1165
- }
1166
-
1167
- const idleTimeoutInSecond = Math.round(idleTimeout / 1000);
1168
-
1169
- /**
1170
- * @deprecated -- to be removed in the next major version
1171
- */
1172
- if (cfg.heartbeat) {
1173
- this.logger.warn(
1174
- '[websocket] The "heartbeat" parameter has been deprecated and is now ignored. The "idleTimeout" parameter should now be configured instead.',
1175
- );
1176
- }
1177
-
1178
- return {
1179
- enabled: cfg.enabled,
1180
- opts: {
1181
- compression,
1182
- idleTimeout: idleTimeoutInSecond,
1183
- maxPayloadLength: this.maxRequestSize,
1184
- resetIdleTimeoutOnSend: cfg.resetIdleTimeoutOnSend,
1185
- sendPingsAutomatically: cfg.sendPingsAutomatically,
1186
- },
1187
- rateLimit: cfg.rateLimit,
1188
- };
1189
- }
1190
-
1191
- parseHttpOptions() {
1192
- const cfg = this.config.http;
1193
-
1194
- if (cfg === undefined) {
1195
- this.logger.warn("[http] no configuration found for http: disabling it");
1196
- return { enabled: false };
1197
- }
1198
-
1199
- // precomputes default headers
1200
- const httpCfg = global.kuzzle.config.http;
1201
- const headers = [
1202
- ["Access-Control-Allow-Headers", httpCfg.accessControlAllowHeaders],
1203
- ["Access-Control-Allow-Methods", httpCfg.accessControlAllowMethods],
1204
- ["Content-Type", "application/json"],
1205
- ];
1206
-
1207
- for (const header of headers) {
1208
- header[2] = header[0]; // Save the raw header name in the third slot
1209
- header[0] = Buffer.from(header[0]);
1210
- header[1] = Buffer.from(header[1]);
1211
- }
1212
-
1213
- return {
1214
- enabled: cfg.enabled,
1215
- headers,
1216
- opts: {
1217
- allowCompression: cfg.allowCompression,
1218
- allowedContentTypes: [
1219
- ...HTTP_ALLOWED_CONTENT_TYPES,
1220
- ...cfg.additionalContentTypes,
1221
- ],
1222
- maxEncodingLayers: cfg.maxEncodingLayers,
1223
- maxFormFileSize: cfg.maxFormFileSize,
1224
- },
1225
- };
1226
- }
1227
- }
1228
-
1229
- /**
1230
- * Returns the list of IP addresses
1231
- *
1232
- * @param {uWS.HttpResponse} response
1233
- * @param {uWS.HttpRequest} request
1234
- * @return {Array.<string>}
1235
- */
1236
- function getHttpIps(response, request) {
1237
- const ips = [Buffer.from(response.getRemoteAddressAsText()).toString()];
1238
-
1239
- const forwardHeader = request.getHeader("x-forwarded-for");
1240
-
1241
- if (forwardHeader && forwardHeader.length > 0) {
1242
- for (const header of forwardHeader.split(",")) {
1243
- const trimmed = header.trim();
1244
-
1245
- if (trimmed.length > 0) {
1246
- ips.push(trimmed);
1247
- }
1248
- }
1249
- }
1250
-
1251
- return ips;
1252
- }
1253
-
1254
- module.exports = HttpWsProtocol;