kuzzle 2.19.2 → 2.19.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 (289) hide show
  1. package/lib/api/controllers/adminController.js +94 -80
  2. package/lib/api/controllers/authController.js +239 -212
  3. package/lib/api/controllers/baseController.js +89 -51
  4. package/lib/api/controllers/bulkController.js +62 -49
  5. package/lib/api/controllers/clusterController.js +6 -8
  6. package/lib/api/controllers/collectionController.js +140 -129
  7. package/lib/api/controllers/debugController.d.ts +2 -2
  8. package/lib/api/controllers/debugController.js +33 -31
  9. package/lib/api/controllers/documentController.js +365 -274
  10. package/lib/api/controllers/index.js +13 -13
  11. package/lib/api/controllers/indexController.js +46 -50
  12. package/lib/api/controllers/memoryStorageController.js +410 -360
  13. package/lib/api/controllers/realtimeController.js +37 -36
  14. package/lib/api/controllers/securityController.js +553 -412
  15. package/lib/api/controllers/serverController.js +111 -104
  16. package/lib/api/documentExtractor.js +75 -68
  17. package/lib/api/funnel.js +411 -312
  18. package/lib/api/httpRoutes.js +1493 -324
  19. package/lib/api/openapi/OpenApiManager.d.ts +1 -1
  20. package/lib/api/openapi/OpenApiManager.js +22 -22
  21. package/lib/api/openapi/components/document/count.yaml +1 -1
  22. package/lib/api/openapi/components/document/create.yaml +2 -2
  23. package/lib/api/openapi/components/document/delete.yaml +1 -1
  24. package/lib/api/openapi/components/document/deleteByQuery.yaml +1 -1
  25. package/lib/api/openapi/components/document/exists.yaml +1 -1
  26. package/lib/api/openapi/components/document/get.yaml +2 -2
  27. package/lib/api/openapi/components/document/index.js +12 -12
  28. package/lib/api/openapi/components/document/replace.yaml +1 -1
  29. package/lib/api/openapi/components/document/scroll.yaml +1 -1
  30. package/lib/api/openapi/components/document/validate.yaml +1 -1
  31. package/lib/api/openapi/components/index.d.ts +2 -2
  32. package/lib/api/openapi/components/index.js +1 -1
  33. package/lib/api/openapi/components/security/index.js +1 -1
  34. package/lib/api/openapi/components/security/upsertUser.yaml +2 -3
  35. package/lib/api/openapi/index.d.ts +1 -1
  36. package/lib/api/openapi/openApiGenerator.d.ts +1 -1
  37. package/lib/api/openapi/openApiGenerator.js +7 -7
  38. package/lib/api/rateLimiter.js +12 -13
  39. package/lib/api/request/index.d.ts +4 -4
  40. package/lib/api/request/kuzzleRequest.d.ts +9 -9
  41. package/lib/api/request/kuzzleRequest.js +89 -87
  42. package/lib/api/request/requestContext.d.ts +2 -2
  43. package/lib/api/request/requestContext.js +17 -17
  44. package/lib/api/request/requestInput.d.ts +1 -1
  45. package/lib/api/request/requestInput.js +19 -19
  46. package/lib/api/request/requestResponse.d.ts +4 -4
  47. package/lib/api/request/requestResponse.js +31 -33
  48. package/lib/cluster/command.js +48 -44
  49. package/lib/cluster/idCardHandler.d.ts +1 -1
  50. package/lib/cluster/idCardHandler.js +15 -15
  51. package/lib/cluster/index.js +2 -2
  52. package/lib/cluster/node.js +301 -269
  53. package/lib/cluster/publisher.js +45 -46
  54. package/lib/cluster/state.d.ts +5 -5
  55. package/lib/cluster/state.js +8 -8
  56. package/lib/cluster/subscriber.js +163 -113
  57. package/lib/cluster/workers/IDCardRenewer.js +33 -32
  58. package/lib/config/default.config.d.ts +1 -1
  59. package/lib/config/default.config.js +212 -171
  60. package/lib/config/documentEventAliases.js +6 -6
  61. package/lib/config/index.js +161 -98
  62. package/lib/config/sdkCompatibility.json +8 -8
  63. package/lib/core/auth/formatProcessing.js +7 -7
  64. package/lib/core/auth/passportResponse.js +7 -7
  65. package/lib/core/auth/passportWrapper.js +34 -30
  66. package/lib/core/auth/tokenManager.d.ts +2 -2
  67. package/lib/core/auth/tokenManager.js +11 -10
  68. package/lib/core/backend/applicationManager.d.ts +1 -1
  69. package/lib/core/backend/applicationManager.js +2 -2
  70. package/lib/core/backend/backend.d.ts +3 -3
  71. package/lib/core/backend/backend.js +34 -31
  72. package/lib/core/backend/backendCluster.d.ts +2 -2
  73. package/lib/core/backend/backendCluster.js +5 -5
  74. package/lib/core/backend/backendConfig.d.ts +2 -2
  75. package/lib/core/backend/backendConfig.js +3 -3
  76. package/lib/core/backend/backendController.d.ts +2 -2
  77. package/lib/core/backend/backendController.js +9 -10
  78. package/lib/core/backend/backendErrors.d.ts +3 -3
  79. package/lib/core/backend/backendErrors.js +2 -1
  80. package/lib/core/backend/backendHook.d.ts +2 -2
  81. package/lib/core/backend/backendHook.js +5 -5
  82. package/lib/core/backend/backendImport.d.ts +3 -3
  83. package/lib/core/backend/backendImport.js +23 -23
  84. package/lib/core/backend/backendOpenApi.d.ts +2 -2
  85. package/lib/core/backend/backendOpenApi.js +16 -16
  86. package/lib/core/backend/backendPipe.d.ts +2 -2
  87. package/lib/core/backend/backendPipe.js +6 -6
  88. package/lib/core/backend/backendPlugin.d.ts +4 -4
  89. package/lib/core/backend/backendPlugin.js +14 -14
  90. package/lib/core/backend/backendStorage.d.ts +2 -2
  91. package/lib/core/backend/backendStorage.js +1 -2
  92. package/lib/core/backend/backendVault.d.ts +2 -2
  93. package/lib/core/backend/backendVault.js +3 -3
  94. package/lib/core/backend/index.d.ts +14 -14
  95. package/lib/core/backend/internalLogger.d.ts +1 -1
  96. package/lib/core/backend/internalLogger.js +5 -5
  97. package/lib/core/cache/cacheDbEnum.js +4 -4
  98. package/lib/core/cache/cacheEngine.js +79 -85
  99. package/lib/core/network/accessLogger.js +126 -120
  100. package/lib/core/network/clientConnection.js +5 -5
  101. package/lib/core/network/context.js +8 -8
  102. package/lib/core/network/entryPoint.js +100 -85
  103. package/lib/core/network/httpRouter/index.js +63 -60
  104. package/lib/core/network/httpRouter/routeHandler.js +18 -19
  105. package/lib/core/network/httpRouter/routePart.js +23 -19
  106. package/lib/core/network/protocolManifest.js +3 -3
  107. package/lib/core/network/protocols/httpMessage.js +8 -10
  108. package/lib/core/network/protocols/httpwsProtocol.js +305 -250
  109. package/lib/core/network/protocols/internalProtocol.js +27 -24
  110. package/lib/core/network/protocols/mqttProtocol.js +106 -96
  111. package/lib/core/network/protocols/protocol.js +20 -17
  112. package/lib/core/network/router.js +56 -46
  113. package/lib/core/plugin/plugin.js +151 -120
  114. package/lib/core/plugin/pluginContext.d.ts +7 -7
  115. package/lib/core/plugin/pluginContext.js +48 -44
  116. package/lib/core/plugin/pluginManifest.js +13 -12
  117. package/lib/core/plugin/pluginRepository.js +26 -27
  118. package/lib/core/plugin/pluginsManager.js +425 -304
  119. package/lib/core/plugin/privilegedContext.js +3 -3
  120. package/lib/core/realtime/actionEnum.js +1 -1
  121. package/lib/core/realtime/channel.d.ts +1 -1
  122. package/lib/core/realtime/channel.js +22 -22
  123. package/lib/core/realtime/connectionRooms.d.ts +1 -1
  124. package/lib/core/realtime/hotelClerk.d.ts +2 -2
  125. package/lib/core/realtime/hotelClerk.js +53 -50
  126. package/lib/core/realtime/index.js +5 -5
  127. package/lib/core/realtime/notification/document.js +25 -25
  128. package/lib/core/realtime/notification/index.js +4 -4
  129. package/lib/core/realtime/notification/server.js +3 -3
  130. package/lib/core/realtime/notification/user.js +4 -4
  131. package/lib/core/realtime/notifier.js +113 -75
  132. package/lib/core/realtime/room.d.ts +1 -1
  133. package/lib/core/realtime/subscription.d.ts +1 -1
  134. package/lib/core/realtime/subscription.js +1 -1
  135. package/lib/core/security/index.js +8 -8
  136. package/lib/core/security/profileRepository.d.ts +6 -6
  137. package/lib/core/security/profileRepository.js +48 -45
  138. package/lib/core/security/roleRepository.js +127 -115
  139. package/lib/core/security/securityLoader.js +70 -63
  140. package/lib/core/security/tokenRepository.js +132 -118
  141. package/lib/core/security/userRepository.js +104 -88
  142. package/lib/core/shared/KoncordeWrapper.d.ts +1 -1
  143. package/lib/core/shared/KoncordeWrapper.js +3 -1
  144. package/lib/core/shared/abstractManifest.js +22 -23
  145. package/lib/core/shared/repository.js +69 -67
  146. package/lib/core/shared/sdk/embeddedSdk.d.ts +2 -2
  147. package/lib/core/shared/sdk/embeddedSdk.js +36 -32
  148. package/lib/core/shared/sdk/funnelProtocol.d.ts +1 -1
  149. package/lib/core/shared/sdk/funnelProtocol.js +11 -11
  150. package/lib/core/shared/sdk/impersonatedSdk.js +19 -18
  151. package/lib/core/shared/store.js +127 -32
  152. package/lib/core/statistics/index.js +2 -2
  153. package/lib/core/statistics/statistics.js +99 -85
  154. package/lib/core/storage/clientAdapter.js +219 -136
  155. package/lib/core/storage/indexCache.js +3 -3
  156. package/lib/core/storage/storageEngine.js +10 -13
  157. package/lib/core/storage/storeScopeEnum.js +3 -3
  158. package/lib/core/validation/baseType.js +12 -10
  159. package/lib/core/validation/index.js +2 -2
  160. package/lib/core/validation/types/anything.js +4 -4
  161. package/lib/core/validation/types/boolean.js +7 -7
  162. package/lib/core/validation/types/date.js +165 -131
  163. package/lib/core/validation/types/email.js +18 -21
  164. package/lib/core/validation/types/enum.js +34 -21
  165. package/lib/core/validation/types/geoPoint.js +7 -7
  166. package/lib/core/validation/types/geoShape.js +148 -125
  167. package/lib/core/validation/types/integer.js +9 -9
  168. package/lib/core/validation/types/ipAddress.js +17 -19
  169. package/lib/core/validation/types/numeric.js +36 -29
  170. package/lib/core/validation/types/object.js +19 -19
  171. package/lib/core/validation/types/string.js +36 -29
  172. package/lib/core/validation/types/url.js +17 -19
  173. package/lib/core/validation/validation.js +422 -378
  174. package/lib/kerror/codes/1-services.json +7 -1
  175. package/lib/kerror/codes/4-plugin.json +2 -2
  176. package/lib/kerror/codes/index.js +85 -63
  177. package/lib/kerror/errors/badRequestError.d.ts +1 -1
  178. package/lib/kerror/errors/externalServiceError.d.ts +1 -1
  179. package/lib/kerror/errors/forbiddenError.d.ts +1 -1
  180. package/lib/kerror/errors/gatewayTimeoutError.d.ts +1 -1
  181. package/lib/kerror/errors/index.d.ts +15 -15
  182. package/lib/kerror/errors/internalError.d.ts +1 -1
  183. package/lib/kerror/errors/kuzzleError.d.ts +1 -1
  184. package/lib/kerror/errors/multipleErrorsError.d.ts +1 -1
  185. package/lib/kerror/errors/multipleErrorsError.js +1 -1
  186. package/lib/kerror/errors/notFoundError.d.ts +1 -1
  187. package/lib/kerror/errors/partialError.d.ts +1 -1
  188. package/lib/kerror/errors/partialError.js +1 -1
  189. package/lib/kerror/errors/pluginImplementationError.d.ts +1 -1
  190. package/lib/kerror/errors/pluginImplementationError.js +2 -1
  191. package/lib/kerror/errors/preconditionError.d.ts +1 -1
  192. package/lib/kerror/errors/serviceUnavailableError.d.ts +1 -1
  193. package/lib/kerror/errors/sizeLimitError.d.ts +1 -1
  194. package/lib/kerror/errors/tooManyRequestsError.d.ts +1 -1
  195. package/lib/kerror/errors/unauthorizedError.d.ts +1 -1
  196. package/lib/kerror/index.d.ts +3 -3
  197. package/lib/kerror/index.js +17 -16
  198. package/lib/kuzzle/dumpGenerator.js +130 -114
  199. package/lib/kuzzle/event/kuzzleEventEmitter.js +96 -70
  200. package/lib/kuzzle/event/pipeRunner.js +25 -24
  201. package/lib/kuzzle/event/waterfall.js +13 -15
  202. package/lib/kuzzle/index.js +2 -2
  203. package/lib/kuzzle/internalIndexHandler.js +80 -59
  204. package/lib/kuzzle/kuzzle.js +99 -99
  205. package/lib/kuzzle/kuzzleStateEnum.js +1 -1
  206. package/lib/kuzzle/log.js +23 -18
  207. package/lib/kuzzle/vault.js +34 -19
  208. package/lib/model/security/profile.d.ts +3 -3
  209. package/lib/model/security/profile.js +38 -37
  210. package/lib/model/security/rights.js +5 -5
  211. package/lib/model/security/role.d.ts +3 -3
  212. package/lib/model/security/role.js +25 -26
  213. package/lib/model/security/token.d.ts +1 -1
  214. package/lib/model/security/token.js +4 -4
  215. package/lib/model/security/user.d.ts +2 -2
  216. package/lib/model/security/user.js +9 -9
  217. package/lib/model/storage/apiKey.js +43 -33
  218. package/lib/model/storage/baseModel.js +49 -45
  219. package/lib/service/cache/redis.js +60 -55
  220. package/lib/service/service.js +17 -17
  221. package/lib/service/storage/elasticsearch.js +839 -755
  222. package/lib/service/storage/esWrapper.js +103 -86
  223. package/lib/service/storage/queryTranslator.js +52 -59
  224. package/lib/types/Controller.d.ts +3 -3
  225. package/lib/types/ControllerDefinition.d.ts +3 -3
  226. package/lib/types/DebugModule.d.ts +2 -2
  227. package/lib/types/DebugModule.js +1 -1
  228. package/lib/types/Global.d.ts +1 -1
  229. package/lib/types/HttpStream.d.ts +2 -1
  230. package/lib/types/HttpStream.js +7 -5
  231. package/lib/types/Kuzzle.d.ts +1 -1
  232. package/lib/types/KuzzleDocument.d.ts +1 -1
  233. package/lib/types/OpenApiDefinition.d.ts +1 -1
  234. package/lib/types/PasswordPolicy.d.ts +1 -1
  235. package/lib/types/Plugin.d.ts +6 -6
  236. package/lib/types/Plugin.js +2 -2
  237. package/lib/types/Policy.d.ts +1 -1
  238. package/lib/types/RequestPayload.d.ts +1 -1
  239. package/lib/types/ResponsePayload.d.ts +1 -1
  240. package/lib/types/Token.d.ts +1 -1
  241. package/lib/types/User.d.ts +1 -1
  242. package/lib/types/config/DumpConfiguration.d.ts +8 -8
  243. package/lib/types/config/HttpConfiguration.d.ts +1 -1
  244. package/lib/types/config/KuzzleConfiguration.d.ts +1 -1
  245. package/lib/types/config/LimitsConfiguration.d.ts +8 -8
  246. package/lib/types/config/PluginsConfiguration.d.ts +4 -4
  247. package/lib/types/config/SecurityConfiguration.d.ts +62 -62
  248. package/lib/types/config/ServerConfiguration.d.ts +55 -55
  249. package/lib/types/config/ServicesConfiguration.d.ts +2 -2
  250. package/lib/types/config/internalCache/InternalCacheRedisConfiguration.d.ts +10 -10
  251. package/lib/types/config/publicCache/PublicCacheRedisConfiguration.d.ts +3 -3
  252. package/lib/types/config/storageEngine/StorageEngineElasticsearchConfiguration.d.ts +194 -110
  253. package/lib/types/errors/ErrorDefinition.d.ts +1 -1
  254. package/lib/types/errors/ErrorDomains.d.ts +1 -1
  255. package/lib/types/index.d.ts +38 -38
  256. package/lib/types/realtime/RealtimeScope.d.ts +1 -1
  257. package/lib/types/realtime/RealtimeUsers.d.ts +1 -1
  258. package/lib/util/assertType.js +13 -11
  259. package/lib/util/async.d.ts +1 -0
  260. package/lib/util/async.js +61 -0
  261. package/lib/util/asyncStore.js +19 -21
  262. package/lib/util/bufferedPassThrough.d.ts +2 -2
  263. package/lib/util/bufferedPassThrough.js +4 -4
  264. package/lib/util/bytes.js +9 -13
  265. package/lib/util/crypto.js +1 -1
  266. package/lib/util/debug.js +5 -5
  267. package/lib/util/deprecate.js +24 -21
  268. package/lib/util/didYouMean.js +7 -7
  269. package/lib/util/dump-collection.d.ts +2 -2
  270. package/lib/util/dump-collection.js +26 -26
  271. package/lib/util/esRequest.d.ts +1 -0
  272. package/lib/util/esRequest.js +62 -0
  273. package/lib/util/extractFields.js +24 -25
  274. package/lib/util/inflector.js +5 -5
  275. package/lib/util/koncordeCompat.d.ts +2 -2
  276. package/lib/util/koncordeCompat.js +5 -5
  277. package/lib/util/memoize.js +3 -5
  278. package/lib/util/mutex.d.ts +19 -1
  279. package/lib/util/mutex.js +39 -12
  280. package/lib/util/name-generator.js +1331 -1331
  281. package/lib/util/promback.js +8 -10
  282. package/lib/util/readYamlFile.d.ts +1 -1
  283. package/lib/util/readYamlFile.js +1 -1
  284. package/lib/util/requestAssertions.js +34 -34
  285. package/lib/util/safeObject.js +5 -5
  286. package/lib/util/stackTrace.js +20 -22
  287. package/lib/util/wildcard.js +15 -15
  288. package/package.json +6 -6
  289. package/npm-shrinkwrap.json +0 -19422
@@ -19,34 +19,30 @@
19
19
  * limitations under the License.
20
20
  */
21
21
 
22
- 'use strict';
22
+ "use strict";
23
23
 
24
- const fs = require('fs');
25
- const path = require('path');
24
+ const fs = require("fs");
25
+ const path = require("path");
26
26
 
27
- const Bluebird = require('bluebird');
27
+ const Bluebird = require("bluebird");
28
28
 
29
- const { RequestContext } = require('../../api/request');
30
- const Context = require('./context');
31
- const debug = require('../../util/debug')('kuzzle:network:embedded');
32
- const MqttProtocol = require('./protocols/mqttProtocol');
33
- const InternalProtocol = require('./protocols/internalProtocol');
34
- const HttpWsProtocol = require('./protocols/httpwsProtocol');
35
- const Manifest = require('./protocolManifest');
36
- const { removeStacktrace } = require('../../util/stackTrace');
37
- const kerror = require('../../kerror');
38
- const { AccessLogger } = require('./accessLogger');
29
+ const { RequestContext } = require("../../api/request");
30
+ const Context = require("./context");
31
+ const debug = require("../../util/debug")("kuzzle:network:embedded");
32
+ const MqttProtocol = require("./protocols/mqttProtocol");
33
+ const InternalProtocol = require("./protocols/internalProtocol");
34
+ const HttpWsProtocol = require("./protocols/httpwsProtocol");
35
+ const Manifest = require("./protocolManifest");
36
+ const { removeStacktrace } = require("../../util/stackTrace");
37
+ const kerror = require("../../kerror");
38
+ const { AccessLogger } = require("./accessLogger");
39
39
 
40
- const networkError = kerror.wrap('network', 'entrypoint');
40
+ const networkError = kerror.wrap("network", "entrypoint");
41
41
 
42
- const DEFAULT_PROTOCOLS = [
43
- HttpWsProtocol,
44
- MqttProtocol,
45
- InternalProtocol,
46
- ];
42
+ const DEFAULT_PROTOCOLS = [HttpWsProtocol, MqttProtocol, InternalProtocol];
47
43
 
48
44
  class EntryPoint {
49
- constructor () {
45
+ constructor() {
50
46
  this.config = global.kuzzle.config.server;
51
47
 
52
48
  this.protocols = new Map();
@@ -58,19 +54,19 @@ class EntryPoint {
58
54
  this.isShuttingDown = false;
59
55
  }
60
56
 
61
- dispatch (event, data) {
57
+ dispatch(event, data) {
62
58
  switch (event) {
63
- case 'notify':
59
+ case "notify":
64
60
  this._notify(data);
65
61
  return;
66
- case 'broadcast':
62
+ case "broadcast":
67
63
  this._broadcast(data);
68
64
  return;
69
- case 'shutdown':
65
+ case "shutdown":
70
66
  this.isShuttingDown = true;
71
- return ;
67
+ return;
72
68
  default:
73
- throw networkError.get('unexpected_event', event);
69
+ throw networkError.get("unexpected_event", event);
74
70
  }
75
71
  }
76
72
 
@@ -80,14 +76,14 @@ class EntryPoint {
80
76
  *
81
77
  * @returns {Promise}
82
78
  */
83
- async init () {
79
+ async init() {
84
80
  for (const ProtocolClass of DEFAULT_PROTOCOLS) {
85
81
  const protocol = new ProtocolClass();
86
82
 
87
83
  this.protocols.set(protocol.name, protocol);
88
84
  }
89
85
 
90
- return this.protocols.get('internal').init(this);
86
+ return this.protocols.get("internal").init(this);
91
87
  }
92
88
 
93
89
  /**
@@ -96,11 +92,11 @@ class EntryPoint {
96
92
  *
97
93
  * @returns {Promise}
98
94
  */
99
- async startListening () {
95
+ async startListening() {
100
96
  // We need to verify the port ourselves, to make sure Node.js won't open
101
97
  // a named pipe if the provided port number is a string
102
- if (! Number.isInteger(this.config.port)) {
103
- throw networkError.get('invalid_port', this.config.port);
98
+ if (!Number.isInteger(this.config.port)) {
99
+ throw networkError.get("invalid_port", this.config.port);
104
100
  }
105
101
 
106
102
  await this.accessLogger.init();
@@ -113,9 +109,9 @@ class EntryPoint {
113
109
  continue;
114
110
  }
115
111
 
116
- initPromises.push(protocol.init(this)
117
- .then(enabled => {
118
- if (! enabled) {
112
+ initPromises.push(
113
+ protocol.init(this).then((enabled) => {
114
+ if (!enabled) {
119
115
  this.protocols.delete(protocol.name);
120
116
  }
121
117
  })
@@ -124,7 +120,6 @@ class EntryPoint {
124
120
 
125
121
  await Bluebird.all(initPromises);
126
122
 
127
-
128
123
  await this.loadMoreProtocols();
129
124
  }
130
125
 
@@ -135,80 +130,95 @@ class EntryPoint {
135
130
  * @param {string} channel
136
131
  * @param {string} connectionId
137
132
  */
138
- joinChannel (channel, connectionId) {
133
+ joinChannel(channel, connectionId) {
139
134
  debug('[server] client "%s" joining channel "%s"', connectionId, channel);
140
135
 
141
136
  const client = this._clients.get(connectionId);
142
137
 
143
- if (! client || ! client.protocol) {
138
+ if (!client || !client.protocol) {
144
139
  return;
145
140
  }
146
141
 
147
142
  try {
148
143
  this.protocols.get(client.protocol).joinChannel(channel, connectionId);
149
- }
150
- catch (e) {
151
- global.kuzzle.log.error(`[join] protocol ${client && client.protocol} failed: ${e.message}`);
144
+ } catch (e) {
145
+ global.kuzzle.log.error(
146
+ `[join] protocol ${client && client.protocol} failed: ${e.message}`
147
+ );
152
148
  }
153
149
  }
154
150
 
155
- leaveChannel (channel, connectionId) {
151
+ leaveChannel(channel, connectionId) {
156
152
  debug(
157
153
  '[server] connection "%s" leaving channel "%s"',
158
154
  connectionId,
159
- channel);
155
+ channel
156
+ );
160
157
 
161
158
  const client = this._clients.get(connectionId);
162
159
 
163
- if (! client || ! client.protocol) {
160
+ if (!client || !client.protocol) {
164
161
  return;
165
162
  }
166
163
 
167
164
  try {
168
165
  this.protocols.get(client.protocol).leaveChannel(channel, connectionId);
169
- }
170
- catch (e) {
171
- global.kuzzle.log.error(`[leave channel] protocol ${client && client.protocol} failed: ${e.message}`);
166
+ } catch (e) {
167
+ global.kuzzle.log.error(
168
+ `[leave channel] protocol ${client && client.protocol} failed: ${
169
+ e.message
170
+ }`
171
+ );
172
172
  }
173
173
  }
174
174
 
175
175
  /**
176
176
  * Loads installed protocols in memory
177
177
  */
178
- async loadMoreProtocols () {
179
- const dir = path.join(__dirname, '../../../protocols/enabled');
178
+ async loadMoreProtocols() {
179
+ const dir = path.join(__dirname, "../../../protocols/enabled");
180
180
  let dirs;
181
181
 
182
182
  try {
183
183
  dirs = fs.readdirSync(dir);
184
- }
185
- catch (e) {
184
+ } catch (e) {
186
185
  // ignore if there is no protocols directory
187
186
  return;
188
187
  }
189
188
 
190
189
  dirs = dirs
191
- .map(d => path.join(dir, d))
192
- .filter(d => fs.statSync(d).isDirectory());
190
+ .map((d) => path.join(dir, d))
191
+ .filter((d) => fs.statSync(d).isDirectory());
193
192
 
194
- await Bluebird.map(dirs, protoDir => {
193
+ await Bluebird.map(dirs, (protoDir) => {
195
194
  const protocol = new (require(protoDir))();
196
195
  const manifest = new Manifest(protoDir, protocol);
197
196
 
198
197
  manifest.load();
199
198
 
200
- const initTimeout = global.kuzzle.config.services.common.defaultInitTimeout;
199
+ const initTimeout =
200
+ global.kuzzle.config.services.common.defaultInitTimeout;
201
201
 
202
202
  return Bluebird.resolve()
203
203
  .then(() => protocol.init(this, new Context()))
204
- .catch(error => {
205
- global.kuzzle.log.error(`Error during "${manifest.name}" protocol init:`);
204
+ .catch((error) => {
205
+ global.kuzzle.log.error(
206
+ `Error during "${manifest.name}" protocol init:`
207
+ );
206
208
  throw error;
207
209
  })
208
- .timeout(initTimeout, `Protocol "${manifest.name}" initialization timed out after ${initTimeout}ms. Try to increase the configuration "services.common.defaultInitTimeout".`)
210
+ .timeout(
211
+ initTimeout,
212
+ `Protocol "${manifest.name}" initialization timed out after ${initTimeout}ms. Try to increase the configuration "services.common.defaultInitTimeout".`
213
+ )
209
214
  .then(() => {
210
215
  if (this.protocols.has(manifest.name)) {
211
- throw kerror.get('protocol', 'runtime', 'already_exists', manifest.name);
216
+ throw kerror.get(
217
+ "protocol",
218
+ "runtime",
219
+ "already_exists",
220
+ manifest.name
221
+ );
212
222
  }
213
223
 
214
224
  this.protocols.set(manifest.name, protocol);
@@ -221,7 +231,7 @@ class EntryPoint {
221
231
  * @param {Request} request
222
232
  * @param {object} extra
223
233
  */
224
- logAccess (connection, request, extra = null) {
234
+ logAccess(connection, request, extra = null) {
225
235
  this.accessLogger.log(connection, request, extra);
226
236
  }
227
237
 
@@ -236,19 +246,19 @@ class EntryPoint {
236
246
  * @param {Request} request
237
247
  * @param cb
238
248
  */
239
- execute (connection, request, cb) {
249
+ execute(connection, request, cb) {
240
250
  if (this.isShuttingDown) {
241
- debug('Shutting down. Dropping request: %a', request);
251
+ debug("Shutting down. Dropping request: %a", request);
242
252
  this._isShuttingDownError(connection, request, cb);
243
253
  return;
244
254
  }
245
255
 
246
- debug('Funneling request: %a', request);
256
+ debug("Funneling request: %a", request);
247
257
 
248
258
  global.kuzzle.funnel.execute(request, (error, result) => {
249
259
  const _res = result || request;
250
260
 
251
- if (error && ! _res.error) {
261
+ if (error && !_res.error) {
252
262
  _res.setError(error);
253
263
  }
254
264
 
@@ -264,78 +274,83 @@ class EntryPoint {
264
274
  *
265
275
  * @param {ClientConnection} connection
266
276
  */
267
- newConnection (connection) {
277
+ newConnection(connection) {
268
278
  this._clients.set(connection.id, connection);
269
279
 
270
- global.kuzzle.emit('connection:new', connection);
280
+ global.kuzzle.emit("connection:new", connection);
271
281
  global.kuzzle.router.newConnection(new RequestContext({ connection }));
272
282
  debug(
273
- 'New connection created: %s (protocol: %s)',
283
+ "New connection created: %s (protocol: %s)",
274
284
  connection.id,
275
- connection.protocol);
285
+ connection.protocol
286
+ );
276
287
  }
277
288
 
278
289
  /**
279
290
  * @param {string} connectionId
280
291
  */
281
- removeConnection (connectionId) {
292
+ removeConnection(connectionId) {
282
293
  const connection = this._clients.get(connectionId);
283
294
 
284
295
  if (connection) {
285
- global.kuzzle.emit('connection:remove', connection);
296
+ global.kuzzle.emit("connection:remove", connection);
286
297
 
287
298
  global.kuzzle.router.removeConnection(new RequestContext({ connection }));
288
299
 
289
300
  this._clients.delete(connectionId);
290
301
 
291
302
  debug(
292
- 'Removed connection: %s (protocol: %s)',
303
+ "Removed connection: %s (protocol: %s)",
293
304
  connection.id,
294
- connection.protocol);
305
+ connection.protocol
306
+ );
295
307
  }
296
308
  }
297
309
 
298
310
  // --------------------------------------------------------------------
299
311
 
300
- _broadcast (data) {
312
+ _broadcast(data) {
301
313
  const sanitized = removeStacktrace(data);
302
314
 
303
- debug('[server] broadcasting data through all protocols: %a', sanitized);
315
+ debug("[server] broadcasting data through all protocols: %a", sanitized);
304
316
 
305
317
  for (const [name, protocol] of this.protocols.entries()) {
306
318
  try {
307
319
  protocol.broadcast(sanitized);
308
- }
309
- catch (e) {
310
- global.kuzzle.log.error(`[broadcast] protocol ${name} failed: ${e.message}\n${e.stack}`);
320
+ } catch (e) {
321
+ global.kuzzle.log.error(
322
+ `[broadcast] protocol ${name} failed: ${e.message}\n${e.stack}`
323
+ );
311
324
  }
312
325
  }
313
326
  }
314
327
 
315
- _isShuttingDownError (connection, request, cb) {
316
- request.setError(networkError.get('shutting_down'));
328
+ _isShuttingDownError(connection, request, cb) {
329
+ request.setError(networkError.get("shutting_down"));
317
330
  this.logAccess(connection, request);
318
331
 
319
332
  cb(removeStacktrace(request.response.toJSON()));
320
333
  }
321
334
 
322
- _notify (data) {
335
+ _notify(data) {
323
336
  debug(
324
337
  '[server] sending notification to client with connection id "%s": %a',
325
338
  data.connectionId,
326
- data);
339
+ data
340
+ );
327
341
 
328
342
  const client = this._clients.get(data.connectionId);
329
343
 
330
- if (! client || ! client.protocol) {
344
+ if (!client || !client.protocol) {
331
345
  return;
332
346
  }
333
347
 
334
348
  try {
335
349
  this.protocols.get(client.protocol).notify(removeStacktrace(data));
336
- }
337
- catch (e) {
338
- global.kuzzle.log.error(`[notify] protocol ${client.protocol} failed: ${e.message}`);
350
+ } catch (e) {
351
+ global.kuzzle.log.error(
352
+ `[notify] protocol ${client.protocol} failed: ${e.message}`
353
+ );
339
354
  }
340
355
  }
341
356
  }
@@ -19,15 +19,15 @@
19
19
  * limitations under the License.
20
20
  */
21
21
 
22
- 'use strict';
22
+ "use strict";
23
23
 
24
- const { Request } = require('../../../api/request');
25
- const { KuzzleError } = require('../../../kerror/errors');
26
- const RoutePart = require('./routePart');
27
- const { has } = require('../../../util/safeObject');
24
+ const { Request } = require("../../../api/request");
25
+ const { KuzzleError } = require("../../../kerror/errors");
26
+ const RoutePart = require("./routePart");
27
+ const { has } = require("../../../util/safeObject");
28
28
 
29
- const kerror = require('../../../kerror').wrap('network', 'http');
30
- const debug = require('../../../util/debug')('kuzzle:http:router');
29
+ const kerror = require("../../../kerror").wrap("network", "http");
30
+ const debug = require("../../../util/debug")("kuzzle:http:router");
31
31
 
32
32
  /**
33
33
  * Attach handler to routes and dispatch a HTTP
@@ -41,20 +41,22 @@ const debug = require('../../../util/debug')('kuzzle:http:router');
41
41
  * @class Router
42
42
  */
43
43
  class Router {
44
- constructor () {
44
+ constructor() {
45
45
  this.defaultHeaders = {
46
- 'Accept-Encoding': 'identity',
47
- 'Access-Control-Allow-Headers': global.kuzzle.config.http.accessControlAllowHeaders,
48
- 'Access-Control-Allow-Methods': global.kuzzle.config.http.accessControlAllowMethods,
49
- 'content-type': 'application/json'
46
+ "Accept-Encoding": "identity",
47
+ "Access-Control-Allow-Headers":
48
+ global.kuzzle.config.http.accessControlAllowHeaders,
49
+ "Access-Control-Allow-Methods":
50
+ global.kuzzle.config.http.accessControlAllowMethods,
51
+ "content-type": "application/json",
50
52
  };
51
53
 
52
54
  if (global.kuzzle.config.http.cookieAuthentication) {
53
- this.defaultHeaders['Access-Control-Allow-Credentials'] = 'true';
55
+ this.defaultHeaders["Access-Control-Allow-Credentials"] = "true";
54
56
  }
55
57
 
56
58
  if (global.kuzzle.config.server.protocols.http.allowCompression === true) {
57
- this.defaultHeaders['Accept-Encoding'] = 'gzip,deflate,identity';
59
+ this.defaultHeaders["Accept-Encoding"] = "gzip,deflate,identity";
58
60
  }
59
61
 
60
62
  this.routes = {
@@ -63,14 +65,18 @@ class Router {
63
65
  HEAD: new RoutePart(),
64
66
  PATCH: new RoutePart(),
65
67
  POST: new RoutePart(),
66
- PUT: new RoutePart()
68
+ PUT: new RoutePart(),
67
69
  };
68
70
 
69
71
  // Add an automatic HEAD route on the '/' url, answering with default headers
70
- attach('/', (request, cb) => {
71
- request.setResult({}, 200);
72
- cb(request);
73
- }, this.routes.HEAD);
72
+ attach(
73
+ "/",
74
+ (request, cb) => {
75
+ request.setResult({}, 200);
76
+ cb(request);
77
+ },
78
+ this.routes.HEAD
79
+ );
74
80
  }
75
81
 
76
82
  /**
@@ -79,7 +85,7 @@ class Router {
79
85
  * @param {string} path
80
86
  * @param {Function} handler
81
87
  */
82
- get (path, handler) {
88
+ get(path, handler) {
83
89
  attach(path, handler, this.routes.GET);
84
90
  }
85
91
 
@@ -89,7 +95,7 @@ class Router {
89
95
  * @param {string} path
90
96
  * @param {Function} handler
91
97
  */
92
- post (path, handler) {
98
+ post(path, handler) {
93
99
  attach(path, handler, this.routes.POST);
94
100
  }
95
101
 
@@ -99,7 +105,7 @@ class Router {
99
105
  * @param {string} path
100
106
  * @param {Function} handler
101
107
  */
102
- put (path, handler) {
108
+ put(path, handler) {
103
109
  attach(path, handler, this.routes.PUT);
104
110
  }
105
111
 
@@ -109,7 +115,7 @@ class Router {
109
115
  * @param {string} path
110
116
  * @param {Function} handler
111
117
  */
112
- patch (path, handler) {
118
+ patch(path, handler) {
113
119
  attach(path, handler, this.routes.PATCH);
114
120
  }
115
121
 
@@ -119,7 +125,7 @@ class Router {
119
125
  * @param {string} path
120
126
  * @param {Function} handler
121
127
  */
122
- delete (path, handler) {
128
+ delete(path, handler) {
123
129
  attach(path, handler, this.routes.DELETE);
124
130
  }
125
131
 
@@ -129,7 +135,7 @@ class Router {
129
135
  * @param {string} path
130
136
  * @param {Function} handler
131
137
  */
132
- head (path, handler) {
138
+ head(path, handler) {
133
139
  attach(path, handler, this.routes.HEAD);
134
140
  }
135
141
 
@@ -139,10 +145,10 @@ class Router {
139
145
  * @param {HttpMessage} message - Parsed HTTP message
140
146
  * @param {function} cb
141
147
  */
142
- route (message, cb) {
143
- debug('Routing HTTP message: %a', message);
148
+ route(message, cb) {
149
+ debug("Routing HTTP message: %a", message);
144
150
 
145
- if (! has(this.routes, message.method)) {
151
+ if (!has(this.routes, message.method)) {
146
152
  this.routeUnhandledHttpMethod(message, cb);
147
153
  return;
148
154
  }
@@ -158,27 +164,26 @@ class Router {
158
164
  applyACAOHeader(message, routeHandler.request);
159
165
 
160
166
  if (routeHandler.handler === null) {
161
- throw kerror.get('url_not_found', routeHandler.url);
167
+ throw kerror.get("url_not_found", routeHandler.url);
162
168
  }
163
169
 
164
170
  routeHandler.invokeHandler(cb);
165
- }
166
- catch (err) {
171
+ } catch (err) {
167
172
  let request;
168
- if (! routeHandler || ! routeHandler._request) {
173
+ if (!routeHandler || !routeHandler._request) {
169
174
  request = new Request({ requestId: message.requestId }, {});
170
175
  // Set Headers if not present
171
176
  request.response.setHeaders(this.defaultHeaders, true);
172
177
 
173
178
  applyACAOHeader(message, request);
174
- }
175
- else {
179
+ } else {
176
180
  request = routeHandler.request;
177
181
  }
178
182
 
179
- const e = err instanceof KuzzleError
180
- ? err
181
- : kerror.getFrom(err, 'unexpected_error', err.message);
183
+ const e =
184
+ err instanceof KuzzleError
185
+ ? err
186
+ : kerror.getFrom(err, "unexpected_error", err.message);
182
187
 
183
188
  replyWithError(cb, request, e);
184
189
  }
@@ -190,27 +195,28 @@ class Router {
190
195
  * @param {HttpMessage} message
191
196
  * @param {function} cb
192
197
  */
193
- routeUnhandledHttpMethod (message, cb) {
194
- const
195
- requestContext = global.kuzzle.router.connections.get(message.connection.id),
198
+ routeUnhandledHttpMethod(message, cb) {
199
+ const requestContext = global.kuzzle.router.connections.get(
200
+ message.connection.id
201
+ ),
196
202
  request = new Request(
197
203
  { requestId: message.requestId },
198
- requestContext && requestContext.toJSON());
204
+ requestContext && requestContext.toJSON()
205
+ );
199
206
 
200
207
  // Set Headers if not present
201
208
  request.response.setHeaders(this.defaultHeaders, true);
202
209
 
203
210
  applyACAOHeader(message, request);
204
211
 
205
- if (message.method === 'OPTIONS') {
212
+ if (message.method === "OPTIONS") {
206
213
  request.input.headers = message.headers;
207
214
  request.setResult({}, 200);
208
215
 
209
- global.kuzzle.pipe('http:options', request, (error, result) => {
216
+ global.kuzzle.pipe("http:options", request, (error, result) => {
210
217
  if (error) {
211
218
  replyWithError(cb, request, error);
212
- }
213
- else {
219
+ } else {
214
220
  cb(result);
215
221
  }
216
222
  });
@@ -218,10 +224,7 @@ class Router {
218
224
  return;
219
225
  }
220
226
 
221
- replyWithError(
222
- cb,
223
- request,
224
- kerror.get('unsupported_verb', message.method));
227
+ replyWithError(cb, request, kerror.get("unsupported_verb", message.method));
225
228
  }
226
229
  }
227
230
 
@@ -231,12 +234,12 @@ class Router {
231
234
  * @param {HttpMessage} message
232
235
  * @param {Request} request
233
236
  */
234
- function applyACAOHeader (message, request) {
237
+ function applyACAOHeader(message, request) {
235
238
  if (message.headers && message.headers.origin) {
236
239
  request.response.setHeaders(
237
240
  {
238
- 'Access-Control-Allow-Origin': message.headers.origin,
239
- 'Vary': 'Origin',
241
+ "Access-Control-Allow-Origin": message.headers.origin,
242
+ Vary: "Origin",
240
243
  },
241
244
  true
242
245
  );
@@ -250,11 +253,11 @@ function applyACAOHeader (message, request) {
250
253
  * @param {Function} handler
251
254
  * @param {RoutePart} target
252
255
  */
253
- function attach (path, handler, target) {
254
- const sanitized = path[path.length - 1] === '/' ? path.slice(0, -1) : path;
256
+ function attach(path, handler, target) {
257
+ const sanitized = path[path.length - 1] === "/" ? path.slice(0, -1) : path;
255
258
 
256
- if (! attachParts(sanitized.split('/'), handler, target)) {
257
- throw kerror.get('duplicate_url', sanitized);
259
+ if (!attachParts(sanitized.split("/"), handler, target)) {
260
+ throw kerror.get("duplicate_url", sanitized);
258
261
  }
259
262
  }
260
263
 
@@ -266,16 +269,16 @@ function attach (path, handler, target) {
266
269
  * @param {Array<string>} placeholders
267
270
  * @returns {Boolean} If false, failed to attach because of a duplicate
268
271
  */
269
- function attachParts (parts, handler, target, placeholders = []) {
272
+ function attachParts(parts, handler, target, placeholders = []) {
270
273
  let part;
271
274
 
272
275
  do {
273
276
  part = parts.shift();
274
277
  } while (parts.length > 0 && part.length === 0);
275
278
 
276
- if (part && part[0] === ':') {
279
+ if (part && part[0] === ":") {
277
280
  placeholders.push(part.substring(1));
278
- part = '*';
281
+ part = "*";
279
282
  }
280
283
 
281
284
  const next = target.getNext(part);
@@ -301,7 +304,7 @@ function attachParts (parts, handler, target, placeholders = []) {
301
304
  * @param {Request} request
302
305
  * @param {Error} error
303
306
  */
304
- function replyWithError (cb, request, error) {
307
+ function replyWithError(cb, request, error) {
305
308
  request.setError(error);
306
309
 
307
310
  cb(request);