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.
- package/lib/api/controllers/adminController.js +94 -80
- package/lib/api/controllers/authController.js +239 -212
- package/lib/api/controllers/baseController.js +89 -51
- package/lib/api/controllers/bulkController.js +62 -49
- package/lib/api/controllers/clusterController.js +6 -8
- package/lib/api/controllers/collectionController.js +140 -129
- package/lib/api/controllers/debugController.d.ts +2 -2
- package/lib/api/controllers/debugController.js +33 -31
- package/lib/api/controllers/documentController.js +365 -274
- package/lib/api/controllers/index.js +13 -13
- package/lib/api/controllers/indexController.js +46 -50
- package/lib/api/controllers/memoryStorageController.js +410 -360
- package/lib/api/controllers/realtimeController.js +37 -36
- package/lib/api/controllers/securityController.js +553 -412
- package/lib/api/controllers/serverController.js +111 -104
- package/lib/api/documentExtractor.js +75 -68
- package/lib/api/funnel.js +411 -312
- package/lib/api/httpRoutes.js +1493 -324
- package/lib/api/openapi/OpenApiManager.d.ts +1 -1
- package/lib/api/openapi/OpenApiManager.js +22 -22
- package/lib/api/openapi/components/document/count.yaml +1 -1
- package/lib/api/openapi/components/document/create.yaml +2 -2
- package/lib/api/openapi/components/document/delete.yaml +1 -1
- package/lib/api/openapi/components/document/deleteByQuery.yaml +1 -1
- package/lib/api/openapi/components/document/exists.yaml +1 -1
- package/lib/api/openapi/components/document/get.yaml +2 -2
- package/lib/api/openapi/components/document/index.js +12 -12
- package/lib/api/openapi/components/document/replace.yaml +1 -1
- package/lib/api/openapi/components/document/scroll.yaml +1 -1
- package/lib/api/openapi/components/document/validate.yaml +1 -1
- package/lib/api/openapi/components/index.d.ts +2 -2
- package/lib/api/openapi/components/index.js +1 -1
- package/lib/api/openapi/components/security/index.js +1 -1
- package/lib/api/openapi/components/security/upsertUser.yaml +2 -3
- package/lib/api/openapi/index.d.ts +1 -1
- package/lib/api/openapi/openApiGenerator.d.ts +1 -1
- package/lib/api/openapi/openApiGenerator.js +7 -7
- package/lib/api/rateLimiter.js +12 -13
- package/lib/api/request/index.d.ts +4 -4
- package/lib/api/request/kuzzleRequest.d.ts +9 -9
- package/lib/api/request/kuzzleRequest.js +89 -87
- package/lib/api/request/requestContext.d.ts +2 -2
- package/lib/api/request/requestContext.js +17 -17
- package/lib/api/request/requestInput.d.ts +1 -1
- package/lib/api/request/requestInput.js +19 -19
- package/lib/api/request/requestResponse.d.ts +4 -4
- package/lib/api/request/requestResponse.js +31 -33
- package/lib/cluster/command.js +48 -44
- package/lib/cluster/idCardHandler.d.ts +1 -1
- package/lib/cluster/idCardHandler.js +15 -15
- package/lib/cluster/index.js +2 -2
- package/lib/cluster/node.js +301 -269
- package/lib/cluster/publisher.js +45 -46
- package/lib/cluster/state.d.ts +5 -5
- package/lib/cluster/state.js +8 -8
- package/lib/cluster/subscriber.js +163 -113
- package/lib/cluster/workers/IDCardRenewer.js +33 -32
- package/lib/config/default.config.d.ts +1 -1
- package/lib/config/default.config.js +212 -171
- package/lib/config/documentEventAliases.js +6 -6
- package/lib/config/index.js +161 -98
- package/lib/config/sdkCompatibility.json +8 -8
- package/lib/core/auth/formatProcessing.js +7 -7
- package/lib/core/auth/passportResponse.js +7 -7
- package/lib/core/auth/passportWrapper.js +34 -30
- package/lib/core/auth/tokenManager.d.ts +2 -2
- package/lib/core/auth/tokenManager.js +11 -10
- package/lib/core/backend/applicationManager.d.ts +1 -1
- package/lib/core/backend/applicationManager.js +2 -2
- package/lib/core/backend/backend.d.ts +3 -3
- package/lib/core/backend/backend.js +34 -31
- package/lib/core/backend/backendCluster.d.ts +2 -2
- package/lib/core/backend/backendCluster.js +5 -5
- package/lib/core/backend/backendConfig.d.ts +2 -2
- package/lib/core/backend/backendConfig.js +3 -3
- package/lib/core/backend/backendController.d.ts +2 -2
- package/lib/core/backend/backendController.js +9 -10
- package/lib/core/backend/backendErrors.d.ts +3 -3
- package/lib/core/backend/backendErrors.js +2 -1
- package/lib/core/backend/backendHook.d.ts +2 -2
- package/lib/core/backend/backendHook.js +5 -5
- package/lib/core/backend/backendImport.d.ts +3 -3
- package/lib/core/backend/backendImport.js +23 -23
- package/lib/core/backend/backendOpenApi.d.ts +2 -2
- package/lib/core/backend/backendOpenApi.js +16 -16
- package/lib/core/backend/backendPipe.d.ts +2 -2
- package/lib/core/backend/backendPipe.js +6 -6
- package/lib/core/backend/backendPlugin.d.ts +4 -4
- package/lib/core/backend/backendPlugin.js +14 -14
- package/lib/core/backend/backendStorage.d.ts +2 -2
- package/lib/core/backend/backendStorage.js +1 -2
- package/lib/core/backend/backendVault.d.ts +2 -2
- package/lib/core/backend/backendVault.js +3 -3
- package/lib/core/backend/index.d.ts +14 -14
- package/lib/core/backend/internalLogger.d.ts +1 -1
- package/lib/core/backend/internalLogger.js +5 -5
- package/lib/core/cache/cacheDbEnum.js +4 -4
- package/lib/core/cache/cacheEngine.js +79 -85
- package/lib/core/network/accessLogger.js +126 -120
- package/lib/core/network/clientConnection.js +5 -5
- package/lib/core/network/context.js +8 -8
- package/lib/core/network/entryPoint.js +100 -85
- package/lib/core/network/httpRouter/index.js +63 -60
- package/lib/core/network/httpRouter/routeHandler.js +18 -19
- package/lib/core/network/httpRouter/routePart.js +23 -19
- package/lib/core/network/protocolManifest.js +3 -3
- package/lib/core/network/protocols/httpMessage.js +8 -10
- package/lib/core/network/protocols/httpwsProtocol.js +305 -250
- package/lib/core/network/protocols/internalProtocol.js +27 -24
- package/lib/core/network/protocols/mqttProtocol.js +106 -96
- package/lib/core/network/protocols/protocol.js +20 -17
- package/lib/core/network/router.js +56 -46
- package/lib/core/plugin/plugin.js +151 -120
- package/lib/core/plugin/pluginContext.d.ts +7 -7
- package/lib/core/plugin/pluginContext.js +48 -44
- package/lib/core/plugin/pluginManifest.js +13 -12
- package/lib/core/plugin/pluginRepository.js +26 -27
- package/lib/core/plugin/pluginsManager.js +425 -304
- package/lib/core/plugin/privilegedContext.js +3 -3
- package/lib/core/realtime/actionEnum.js +1 -1
- package/lib/core/realtime/channel.d.ts +1 -1
- package/lib/core/realtime/channel.js +22 -22
- package/lib/core/realtime/connectionRooms.d.ts +1 -1
- package/lib/core/realtime/hotelClerk.d.ts +2 -2
- package/lib/core/realtime/hotelClerk.js +53 -50
- package/lib/core/realtime/index.js +5 -5
- package/lib/core/realtime/notification/document.js +25 -25
- package/lib/core/realtime/notification/index.js +4 -4
- package/lib/core/realtime/notification/server.js +3 -3
- package/lib/core/realtime/notification/user.js +4 -4
- package/lib/core/realtime/notifier.js +113 -75
- package/lib/core/realtime/room.d.ts +1 -1
- package/lib/core/realtime/subscription.d.ts +1 -1
- package/lib/core/realtime/subscription.js +1 -1
- package/lib/core/security/index.js +8 -8
- package/lib/core/security/profileRepository.d.ts +6 -6
- package/lib/core/security/profileRepository.js +48 -45
- package/lib/core/security/roleRepository.js +127 -115
- package/lib/core/security/securityLoader.js +70 -63
- package/lib/core/security/tokenRepository.js +132 -118
- package/lib/core/security/userRepository.js +104 -88
- package/lib/core/shared/KoncordeWrapper.d.ts +1 -1
- package/lib/core/shared/KoncordeWrapper.js +3 -1
- package/lib/core/shared/abstractManifest.js +22 -23
- package/lib/core/shared/repository.js +69 -67
- package/lib/core/shared/sdk/embeddedSdk.d.ts +2 -2
- package/lib/core/shared/sdk/embeddedSdk.js +36 -32
- package/lib/core/shared/sdk/funnelProtocol.d.ts +1 -1
- package/lib/core/shared/sdk/funnelProtocol.js +11 -11
- package/lib/core/shared/sdk/impersonatedSdk.js +19 -18
- package/lib/core/shared/store.js +127 -32
- package/lib/core/statistics/index.js +2 -2
- package/lib/core/statistics/statistics.js +99 -85
- package/lib/core/storage/clientAdapter.js +219 -136
- package/lib/core/storage/indexCache.js +3 -3
- package/lib/core/storage/storageEngine.js +10 -13
- package/lib/core/storage/storeScopeEnum.js +3 -3
- package/lib/core/validation/baseType.js +12 -10
- package/lib/core/validation/index.js +2 -2
- package/lib/core/validation/types/anything.js +4 -4
- package/lib/core/validation/types/boolean.js +7 -7
- package/lib/core/validation/types/date.js +165 -131
- package/lib/core/validation/types/email.js +18 -21
- package/lib/core/validation/types/enum.js +34 -21
- package/lib/core/validation/types/geoPoint.js +7 -7
- package/lib/core/validation/types/geoShape.js +148 -125
- package/lib/core/validation/types/integer.js +9 -9
- package/lib/core/validation/types/ipAddress.js +17 -19
- package/lib/core/validation/types/numeric.js +36 -29
- package/lib/core/validation/types/object.js +19 -19
- package/lib/core/validation/types/string.js +36 -29
- package/lib/core/validation/types/url.js +17 -19
- package/lib/core/validation/validation.js +422 -378
- package/lib/kerror/codes/1-services.json +7 -1
- package/lib/kerror/codes/4-plugin.json +2 -2
- package/lib/kerror/codes/index.js +85 -63
- package/lib/kerror/errors/badRequestError.d.ts +1 -1
- package/lib/kerror/errors/externalServiceError.d.ts +1 -1
- package/lib/kerror/errors/forbiddenError.d.ts +1 -1
- package/lib/kerror/errors/gatewayTimeoutError.d.ts +1 -1
- package/lib/kerror/errors/index.d.ts +15 -15
- package/lib/kerror/errors/internalError.d.ts +1 -1
- package/lib/kerror/errors/kuzzleError.d.ts +1 -1
- package/lib/kerror/errors/multipleErrorsError.d.ts +1 -1
- package/lib/kerror/errors/multipleErrorsError.js +1 -1
- package/lib/kerror/errors/notFoundError.d.ts +1 -1
- package/lib/kerror/errors/partialError.d.ts +1 -1
- package/lib/kerror/errors/partialError.js +1 -1
- package/lib/kerror/errors/pluginImplementationError.d.ts +1 -1
- package/lib/kerror/errors/pluginImplementationError.js +2 -1
- package/lib/kerror/errors/preconditionError.d.ts +1 -1
- package/lib/kerror/errors/serviceUnavailableError.d.ts +1 -1
- package/lib/kerror/errors/sizeLimitError.d.ts +1 -1
- package/lib/kerror/errors/tooManyRequestsError.d.ts +1 -1
- package/lib/kerror/errors/unauthorizedError.d.ts +1 -1
- package/lib/kerror/index.d.ts +3 -3
- package/lib/kerror/index.js +17 -16
- package/lib/kuzzle/dumpGenerator.js +130 -114
- package/lib/kuzzle/event/kuzzleEventEmitter.js +96 -70
- package/lib/kuzzle/event/pipeRunner.js +25 -24
- package/lib/kuzzle/event/waterfall.js +13 -15
- package/lib/kuzzle/index.js +2 -2
- package/lib/kuzzle/internalIndexHandler.js +80 -59
- package/lib/kuzzle/kuzzle.js +99 -99
- package/lib/kuzzle/kuzzleStateEnum.js +1 -1
- package/lib/kuzzle/log.js +23 -18
- package/lib/kuzzle/vault.js +34 -19
- package/lib/model/security/profile.d.ts +3 -3
- package/lib/model/security/profile.js +38 -37
- package/lib/model/security/rights.js +5 -5
- package/lib/model/security/role.d.ts +3 -3
- package/lib/model/security/role.js +25 -26
- package/lib/model/security/token.d.ts +1 -1
- package/lib/model/security/token.js +4 -4
- package/lib/model/security/user.d.ts +2 -2
- package/lib/model/security/user.js +9 -9
- package/lib/model/storage/apiKey.js +43 -33
- package/lib/model/storage/baseModel.js +49 -45
- package/lib/service/cache/redis.js +60 -55
- package/lib/service/service.js +17 -17
- package/lib/service/storage/elasticsearch.js +839 -755
- package/lib/service/storage/esWrapper.js +103 -86
- package/lib/service/storage/queryTranslator.js +52 -59
- package/lib/types/Controller.d.ts +3 -3
- package/lib/types/ControllerDefinition.d.ts +3 -3
- package/lib/types/DebugModule.d.ts +2 -2
- package/lib/types/DebugModule.js +1 -1
- package/lib/types/Global.d.ts +1 -1
- package/lib/types/HttpStream.d.ts +2 -1
- package/lib/types/HttpStream.js +7 -5
- package/lib/types/Kuzzle.d.ts +1 -1
- package/lib/types/KuzzleDocument.d.ts +1 -1
- package/lib/types/OpenApiDefinition.d.ts +1 -1
- package/lib/types/PasswordPolicy.d.ts +1 -1
- package/lib/types/Plugin.d.ts +6 -6
- package/lib/types/Plugin.js +2 -2
- package/lib/types/Policy.d.ts +1 -1
- package/lib/types/RequestPayload.d.ts +1 -1
- package/lib/types/ResponsePayload.d.ts +1 -1
- package/lib/types/Token.d.ts +1 -1
- package/lib/types/User.d.ts +1 -1
- package/lib/types/config/DumpConfiguration.d.ts +8 -8
- package/lib/types/config/HttpConfiguration.d.ts +1 -1
- package/lib/types/config/KuzzleConfiguration.d.ts +1 -1
- package/lib/types/config/LimitsConfiguration.d.ts +8 -8
- package/lib/types/config/PluginsConfiguration.d.ts +4 -4
- package/lib/types/config/SecurityConfiguration.d.ts +62 -62
- package/lib/types/config/ServerConfiguration.d.ts +55 -55
- package/lib/types/config/ServicesConfiguration.d.ts +2 -2
- package/lib/types/config/internalCache/InternalCacheRedisConfiguration.d.ts +10 -10
- package/lib/types/config/publicCache/PublicCacheRedisConfiguration.d.ts +3 -3
- package/lib/types/config/storageEngine/StorageEngineElasticsearchConfiguration.d.ts +194 -110
- package/lib/types/errors/ErrorDefinition.d.ts +1 -1
- package/lib/types/errors/ErrorDomains.d.ts +1 -1
- package/lib/types/index.d.ts +38 -38
- package/lib/types/realtime/RealtimeScope.d.ts +1 -1
- package/lib/types/realtime/RealtimeUsers.d.ts +1 -1
- package/lib/util/assertType.js +13 -11
- package/lib/util/async.d.ts +1 -0
- package/lib/util/async.js +61 -0
- package/lib/util/asyncStore.js +19 -21
- package/lib/util/bufferedPassThrough.d.ts +2 -2
- package/lib/util/bufferedPassThrough.js +4 -4
- package/lib/util/bytes.js +9 -13
- package/lib/util/crypto.js +1 -1
- package/lib/util/debug.js +5 -5
- package/lib/util/deprecate.js +24 -21
- package/lib/util/didYouMean.js +7 -7
- package/lib/util/dump-collection.d.ts +2 -2
- package/lib/util/dump-collection.js +26 -26
- package/lib/util/esRequest.d.ts +1 -0
- package/lib/util/esRequest.js +62 -0
- package/lib/util/extractFields.js +24 -25
- package/lib/util/inflector.js +5 -5
- package/lib/util/koncordeCompat.d.ts +2 -2
- package/lib/util/koncordeCompat.js +5 -5
- package/lib/util/memoize.js +3 -5
- package/lib/util/mutex.d.ts +19 -1
- package/lib/util/mutex.js +39 -12
- package/lib/util/name-generator.js +1331 -1331
- package/lib/util/promback.js +8 -10
- package/lib/util/readYamlFile.d.ts +1 -1
- package/lib/util/readYamlFile.js +1 -1
- package/lib/util/requestAssertions.js +34 -34
- package/lib/util/safeObject.js +5 -5
- package/lib/util/stackTrace.js +20 -22
- package/lib/util/wildcard.js +15 -15
- package/package.json +6 -6
- package/npm-shrinkwrap.json +0 -19422
|
@@ -19,34 +19,30 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const fs = require(
|
|
25
|
-
const path = require(
|
|
24
|
+
const fs = require("fs");
|
|
25
|
+
const path = require("path");
|
|
26
26
|
|
|
27
|
-
const Bluebird = require(
|
|
27
|
+
const Bluebird = require("bluebird");
|
|
28
28
|
|
|
29
|
-
const { RequestContext } = require(
|
|
30
|
-
const Context = require(
|
|
31
|
-
const debug = require(
|
|
32
|
-
const MqttProtocol = require(
|
|
33
|
-
const InternalProtocol = require(
|
|
34
|
-
const HttpWsProtocol = require(
|
|
35
|
-
const Manifest = require(
|
|
36
|
-
const { removeStacktrace } = require(
|
|
37
|
-
const kerror = require(
|
|
38
|
-
const { AccessLogger } = require(
|
|
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(
|
|
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
|
|
57
|
+
dispatch(event, data) {
|
|
62
58
|
switch (event) {
|
|
63
|
-
case
|
|
59
|
+
case "notify":
|
|
64
60
|
this._notify(data);
|
|
65
61
|
return;
|
|
66
|
-
case
|
|
62
|
+
case "broadcast":
|
|
67
63
|
this._broadcast(data);
|
|
68
64
|
return;
|
|
69
|
-
case
|
|
65
|
+
case "shutdown":
|
|
70
66
|
this.isShuttingDown = true;
|
|
71
|
-
return
|
|
67
|
+
return;
|
|
72
68
|
default:
|
|
73
|
-
throw networkError.get(
|
|
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(
|
|
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 (!
|
|
103
|
-
throw networkError.get(
|
|
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(
|
|
117
|
-
.then(enabled => {
|
|
118
|
-
if (!
|
|
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
|
|
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 (!
|
|
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
|
-
|
|
151
|
-
|
|
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
|
|
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 (!
|
|
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
|
-
|
|
171
|
-
|
|
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,
|
|
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 =
|
|
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(
|
|
204
|
+
.catch((error) => {
|
|
205
|
+
global.kuzzle.log.error(
|
|
206
|
+
`Error during "${manifest.name}" protocol init:`
|
|
207
|
+
);
|
|
206
208
|
throw error;
|
|
207
209
|
})
|
|
208
|
-
.timeout(
|
|
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(
|
|
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
|
|
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
|
|
249
|
+
execute(connection, request, cb) {
|
|
240
250
|
if (this.isShuttingDown) {
|
|
241
|
-
debug(
|
|
251
|
+
debug("Shutting down. Dropping request: %a", request);
|
|
242
252
|
this._isShuttingDownError(connection, request, cb);
|
|
243
253
|
return;
|
|
244
254
|
}
|
|
245
255
|
|
|
246
|
-
debug(
|
|
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 && !
|
|
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
|
|
277
|
+
newConnection(connection) {
|
|
268
278
|
this._clients.set(connection.id, connection);
|
|
269
279
|
|
|
270
|
-
global.kuzzle.emit(
|
|
280
|
+
global.kuzzle.emit("connection:new", connection);
|
|
271
281
|
global.kuzzle.router.newConnection(new RequestContext({ connection }));
|
|
272
282
|
debug(
|
|
273
|
-
|
|
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
|
|
292
|
+
removeConnection(connectionId) {
|
|
282
293
|
const connection = this._clients.get(connectionId);
|
|
283
294
|
|
|
284
295
|
if (connection) {
|
|
285
|
-
global.kuzzle.emit(
|
|
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
|
-
|
|
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
|
|
312
|
+
_broadcast(data) {
|
|
301
313
|
const sanitized = removeStacktrace(data);
|
|
302
314
|
|
|
303
|
-
debug(
|
|
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
|
-
|
|
310
|
-
|
|
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
|
|
316
|
-
request.setError(networkError.get(
|
|
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
|
|
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 (!
|
|
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
|
-
|
|
338
|
-
|
|
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
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const { Request } = require(
|
|
25
|
-
const { KuzzleError } = require(
|
|
26
|
-
const RoutePart = require(
|
|
27
|
-
const { has } = require(
|
|
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(
|
|
30
|
-
const debug = require(
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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[
|
|
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[
|
|
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(
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
143
|
-
debug(
|
|
148
|
+
route(message, cb) {
|
|
149
|
+
debug("Routing HTTP message: %a", message);
|
|
144
150
|
|
|
145
|
-
if (!
|
|
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(
|
|
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 (!
|
|
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 =
|
|
180
|
-
|
|
181
|
-
|
|
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
|
|
194
|
-
const
|
|
195
|
-
|
|
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 ===
|
|
212
|
+
if (message.method === "OPTIONS") {
|
|
206
213
|
request.input.headers = message.headers;
|
|
207
214
|
request.setResult({}, 200);
|
|
208
215
|
|
|
209
|
-
global.kuzzle.pipe(
|
|
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
|
|
237
|
+
function applyACAOHeader(message, request) {
|
|
235
238
|
if (message.headers && message.headers.origin) {
|
|
236
239
|
request.response.setHeaders(
|
|
237
240
|
{
|
|
238
|
-
|
|
239
|
-
|
|
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
|
|
254
|
-
const sanitized = path[path.length - 1] ===
|
|
256
|
+
function attach(path, handler, target) {
|
|
257
|
+
const sanitized = path[path.length - 1] === "/" ? path.slice(0, -1) : path;
|
|
255
258
|
|
|
256
|
-
if (!
|
|
257
|
-
throw kerror.get(
|
|
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
|
|
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
|
|
307
|
+
function replyWithError(cb, request, error) {
|
|
305
308
|
request.setError(error);
|
|
306
309
|
|
|
307
310
|
cb(request);
|