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,12 +19,14 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const Protocol = require(
|
|
25
|
-
const ClientConnection = require(
|
|
24
|
+
const Protocol = require("./protocol");
|
|
25
|
+
const ClientConnection = require("../clientConnection");
|
|
26
26
|
|
|
27
|
-
const debug = require(
|
|
27
|
+
const debug = require("../../../util/debug")(
|
|
28
|
+
"kuzzle:network:protocols:internal"
|
|
29
|
+
);
|
|
28
30
|
|
|
29
31
|
/**
|
|
30
32
|
* Internal protocol to use SDK realtime subscription from plugins.
|
|
@@ -35,10 +37,10 @@ const debug = require('../../../util/debug')('kuzzle:network:protocols:internal'
|
|
|
35
37
|
* - 'core:network:internal:message'
|
|
36
38
|
*/
|
|
37
39
|
class InternalProtocol extends Protocol {
|
|
38
|
-
constructor
|
|
39
|
-
super(
|
|
40
|
+
constructor() {
|
|
41
|
+
super("internal");
|
|
40
42
|
|
|
41
|
-
this.connection = new ClientConnection(this.name, [
|
|
43
|
+
this.connection = new ClientConnection(this.name, ["127.0.0.1"]);
|
|
42
44
|
|
|
43
45
|
/**
|
|
44
46
|
* List of channel IDs
|
|
@@ -47,10 +49,10 @@ class InternalProtocol extends Protocol {
|
|
|
47
49
|
this.channels = new Set();
|
|
48
50
|
}
|
|
49
51
|
|
|
50
|
-
async init
|
|
52
|
+
async init(entryPoint) {
|
|
51
53
|
await super.init(null, entryPoint);
|
|
52
54
|
|
|
53
|
-
debug(
|
|
55
|
+
debug("initializing InternalProtocol");
|
|
54
56
|
|
|
55
57
|
this.entryPoint.newConnection(this.connection);
|
|
56
58
|
|
|
@@ -59,46 +61,47 @@ class InternalProtocol extends Protocol {
|
|
|
59
61
|
*
|
|
60
62
|
* @returns {string} connectionId
|
|
61
63
|
*/
|
|
62
|
-
global.kuzzle.onAsk(
|
|
63
|
-
|
|
64
|
-
|
|
64
|
+
global.kuzzle.onAsk(
|
|
65
|
+
"core:network:internal:connectionId:get",
|
|
66
|
+
() => this.connection.id
|
|
67
|
+
);
|
|
65
68
|
}
|
|
66
69
|
|
|
67
|
-
joinChannel
|
|
68
|
-
debug(
|
|
70
|
+
joinChannel(channel, connectionId) {
|
|
71
|
+
debug("joinChannel: %s", channel, connectionId);
|
|
69
72
|
|
|
70
73
|
this.channels.add(channel);
|
|
71
74
|
}
|
|
72
75
|
|
|
73
|
-
leaveChannel
|
|
74
|
-
debug(
|
|
76
|
+
leaveChannel(channel, connectionId) {
|
|
77
|
+
debug("leaveChannel: %s", channel, connectionId);
|
|
75
78
|
|
|
76
79
|
this.channels.delete(channel);
|
|
77
80
|
}
|
|
78
81
|
|
|
79
|
-
disconnect
|
|
80
|
-
debug(
|
|
82
|
+
disconnect(connectionId) {
|
|
83
|
+
debug("disconnect: %s", connectionId);
|
|
81
84
|
|
|
82
85
|
// Never happens, the InternalProtocol always keep his only connection open
|
|
83
86
|
}
|
|
84
87
|
|
|
85
|
-
broadcast
|
|
86
|
-
debug(
|
|
88
|
+
broadcast(data) {
|
|
89
|
+
debug("broadcast: %a", data);
|
|
87
90
|
|
|
88
91
|
this._send(data);
|
|
89
92
|
}
|
|
90
93
|
|
|
91
|
-
notify
|
|
92
|
-
debug(
|
|
94
|
+
notify(data) {
|
|
95
|
+
debug("notify: %a", data);
|
|
93
96
|
|
|
94
97
|
this._send(data);
|
|
95
98
|
}
|
|
96
99
|
|
|
97
|
-
_send
|
|
100
|
+
_send(data) {
|
|
98
101
|
for (let i = 0; i < data.channels.length; i++) {
|
|
99
102
|
const message = { ...data.payload, room: data.channels[i] };
|
|
100
103
|
|
|
101
|
-
global.kuzzle.emit(
|
|
104
|
+
global.kuzzle.emit("core:network:internal:message", message);
|
|
102
105
|
}
|
|
103
106
|
}
|
|
104
107
|
}
|
|
@@ -19,25 +19,25 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const net = require(
|
|
24
|
+
const net = require("net");
|
|
25
25
|
|
|
26
|
-
const aedes = require(
|
|
26
|
+
const aedes = require("aedes");
|
|
27
27
|
|
|
28
|
-
const ClientConnection = require(
|
|
29
|
-
const Protocol = require(
|
|
30
|
-
const { Request } = require(
|
|
31
|
-
const { removeStacktrace } = require(
|
|
32
|
-
const kerror = require(
|
|
33
|
-
const debug = require(
|
|
28
|
+
const ClientConnection = require("../clientConnection");
|
|
29
|
+
const Protocol = require("./protocol");
|
|
30
|
+
const { Request } = require("../../../api/request");
|
|
31
|
+
const { removeStacktrace } = require("../../../util/stackTrace");
|
|
32
|
+
const kerror = require("../../../kerror").wrap("network", "mqtt");
|
|
33
|
+
const debug = require("../../../util/debug")("kuzzle:network:protocols:mqtt");
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* @class MqttProtocol
|
|
37
37
|
*/
|
|
38
38
|
class MqttProtocol extends Protocol {
|
|
39
|
-
constructor
|
|
40
|
-
super(
|
|
39
|
+
constructor() {
|
|
40
|
+
super("mqtt");
|
|
41
41
|
|
|
42
42
|
this.aedes = new aedes.Server();
|
|
43
43
|
this.server = net.createServer(this.aedes.handle);
|
|
@@ -46,32 +46,35 @@ class MqttProtocol extends Protocol {
|
|
|
46
46
|
this.connectionsById = new Map();
|
|
47
47
|
|
|
48
48
|
// needs to be bound to this object's context
|
|
49
|
-
this.publishCallback = function pubcb
|
|
49
|
+
this.publishCallback = function pubcb(error) {
|
|
50
50
|
if (error) {
|
|
51
51
|
global.kuzzle.info(`[MQTT] Publishing message failed: ${error}`);
|
|
52
52
|
}
|
|
53
53
|
};
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
async init
|
|
56
|
+
async init(entryPoint) {
|
|
57
57
|
await super.init(null, entryPoint);
|
|
58
58
|
|
|
59
59
|
if (this.config.enabled === false) {
|
|
60
60
|
return false;
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
debug(
|
|
63
|
+
debug("initializing MQTT Server with config: %a", this.config);
|
|
64
64
|
|
|
65
|
-
this.config = Object.assign(
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
65
|
+
this.config = Object.assign(
|
|
66
|
+
{
|
|
67
|
+
allowPubSub: false,
|
|
68
|
+
developmentMode: false,
|
|
69
|
+
disconnectDelay: 250,
|
|
70
|
+
requestTopic: "Kuzzle/request",
|
|
71
|
+
responseTopic: "Kuzzle/response",
|
|
72
|
+
server: {
|
|
73
|
+
port: 1883,
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
this.config
|
|
77
|
+
);
|
|
75
78
|
|
|
76
79
|
/*
|
|
77
80
|
* To avoid ill-use of our topics, we need to configure authorizations:
|
|
@@ -84,18 +87,20 @@ class MqttProtocol extends Protocol {
|
|
|
84
87
|
this.aedes.authorizeSubscribe = this._authorizeSubscribe.bind(this);
|
|
85
88
|
|
|
86
89
|
// Message events
|
|
87
|
-
this.aedes.on(
|
|
88
|
-
this.aedes.on(
|
|
89
|
-
this.aedes.on(
|
|
90
|
-
this.aedes.on(
|
|
90
|
+
this.aedes.on("client", this.onConnection.bind(this));
|
|
91
|
+
this.aedes.on("clientError", this.onDisconnection.bind(this));
|
|
92
|
+
this.aedes.on("clientDisconnect", this.onDisconnection.bind(this));
|
|
93
|
+
this.aedes.on("publish", this.onMessage.bind(this));
|
|
91
94
|
|
|
92
|
-
await new Promise(res =>
|
|
95
|
+
await new Promise((res) =>
|
|
96
|
+
this.server.listen(this.config.server.port, res)
|
|
97
|
+
);
|
|
93
98
|
|
|
94
99
|
return true;
|
|
95
100
|
}
|
|
96
101
|
|
|
97
|
-
broadcast
|
|
98
|
-
debug(
|
|
102
|
+
broadcast(data) {
|
|
103
|
+
debug("broadcast %a", data);
|
|
99
104
|
|
|
100
105
|
const payload = JSON.stringify(data.payload);
|
|
101
106
|
|
|
@@ -104,8 +109,8 @@ class MqttProtocol extends Protocol {
|
|
|
104
109
|
}
|
|
105
110
|
}
|
|
106
111
|
|
|
107
|
-
disconnect
|
|
108
|
-
debug(
|
|
112
|
+
disconnect(connectionId, message = "Connection closed by remote host") {
|
|
113
|
+
debug("disconnect: connection id: %s, message %s", connectionId, message);
|
|
109
114
|
|
|
110
115
|
const client = this.connectionsById.get(connectionId);
|
|
111
116
|
|
|
@@ -114,26 +119,26 @@ class MqttProtocol extends Protocol {
|
|
|
114
119
|
}
|
|
115
120
|
}
|
|
116
121
|
|
|
117
|
-
joinChannel
|
|
122
|
+
joinChannel() {
|
|
118
123
|
// do nothing
|
|
119
124
|
}
|
|
120
125
|
|
|
121
|
-
leaveChannel
|
|
126
|
+
leaveChannel() {
|
|
122
127
|
// do nothing
|
|
123
128
|
}
|
|
124
129
|
|
|
125
|
-
notify
|
|
126
|
-
debug(
|
|
130
|
+
notify(data) {
|
|
131
|
+
debug("notify %a", data);
|
|
127
132
|
|
|
128
133
|
const client = this.connectionsById.get(data.connectionId);
|
|
129
134
|
|
|
130
|
-
if (!
|
|
135
|
+
if (!client) {
|
|
131
136
|
return;
|
|
132
137
|
}
|
|
133
138
|
|
|
134
139
|
const payload = Buffer.from(JSON.stringify(data.payload));
|
|
135
140
|
|
|
136
|
-
data.channels.forEach(topic => {
|
|
141
|
+
data.channels.forEach((topic) => {
|
|
137
142
|
client.publish({ payload, topic }, this.publishCallback);
|
|
138
143
|
});
|
|
139
144
|
}
|
|
@@ -141,13 +146,14 @@ class MqttProtocol extends Protocol {
|
|
|
141
146
|
/**
|
|
142
147
|
* @param {Client} client
|
|
143
148
|
*/
|
|
144
|
-
onConnection
|
|
145
|
-
debug(
|
|
149
|
+
onConnection(client) {
|
|
150
|
+
debug("onConnection: %s", client.id);
|
|
146
151
|
|
|
147
152
|
const connection = new ClientConnection(
|
|
148
153
|
this.name,
|
|
149
154
|
[client.conn.remoteAddress],
|
|
150
|
-
{}
|
|
155
|
+
{}
|
|
156
|
+
);
|
|
151
157
|
this.entryPoint.newConnection(connection);
|
|
152
158
|
|
|
153
159
|
this.connections.set(client, connection);
|
|
@@ -157,21 +163,19 @@ class MqttProtocol extends Protocol {
|
|
|
157
163
|
/**
|
|
158
164
|
* @param {Client} client
|
|
159
165
|
*/
|
|
160
|
-
onDisconnection
|
|
161
|
-
debug(
|
|
166
|
+
onDisconnection(client) {
|
|
167
|
+
debug("onDisconnection %s", client.id);
|
|
162
168
|
|
|
163
169
|
if (this.connections.has(client)) {
|
|
164
|
-
setTimeout(
|
|
165
|
-
()
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
},
|
|
174
|
-
this.config.disconnectDelay);
|
|
170
|
+
setTimeout(() => {
|
|
171
|
+
const connection = this.connections.get(client);
|
|
172
|
+
|
|
173
|
+
if (connection) {
|
|
174
|
+
this.connections.delete(client);
|
|
175
|
+
this.connectionsById.delete(connection.id);
|
|
176
|
+
this.entryPoint.removeConnection(connection.id);
|
|
177
|
+
}
|
|
178
|
+
}, this.config.disconnectDelay);
|
|
175
179
|
}
|
|
176
180
|
}
|
|
177
181
|
|
|
@@ -179,10 +183,11 @@ class MqttProtocol extends Protocol {
|
|
|
179
183
|
* @param packet
|
|
180
184
|
* @param client
|
|
181
185
|
*/
|
|
182
|
-
onMessage
|
|
183
|
-
if (
|
|
184
|
-
|
|
185
|
-
|
|
186
|
+
onMessage(packet, client) {
|
|
187
|
+
if (
|
|
188
|
+
packet.topic !== this.config.requestTopic ||
|
|
189
|
+
packet.payload === null ||
|
|
190
|
+
client.id === null
|
|
186
191
|
) {
|
|
187
192
|
return;
|
|
188
193
|
}
|
|
@@ -190,32 +195,36 @@ class MqttProtocol extends Protocol {
|
|
|
190
195
|
const connection = this.connections.get(client);
|
|
191
196
|
|
|
192
197
|
if (connection === undefined) {
|
|
193
|
-
debug(
|
|
194
|
-
|
|
198
|
+
debug(
|
|
199
|
+
"no connection id for client id %s - packet: %o",
|
|
200
|
+
client.id,
|
|
201
|
+
packet
|
|
202
|
+
);
|
|
203
|
+
global.kuzzle.log.error(
|
|
204
|
+
`[MQTT] Received a packet from an unregistered client: ${client.id}`
|
|
205
|
+
);
|
|
195
206
|
return;
|
|
196
207
|
}
|
|
197
208
|
|
|
198
209
|
try {
|
|
199
210
|
const payload = JSON.parse(packet.payload.toString());
|
|
200
211
|
|
|
201
|
-
debug(
|
|
212
|
+
debug("onMessage payload: %o", payload);
|
|
202
213
|
|
|
203
214
|
const request = new Request(payload, { connection });
|
|
204
215
|
|
|
205
|
-
this.entryPoint.execute(
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
}
|
|
210
|
-
catch (error) {
|
|
216
|
+
this.entryPoint.execute(connection, request, (response) =>
|
|
217
|
+
this._respond(client, response)
|
|
218
|
+
);
|
|
219
|
+
} catch (error) {
|
|
211
220
|
this._respondError(client, error);
|
|
212
221
|
}
|
|
213
222
|
}
|
|
214
223
|
|
|
215
|
-
_respond
|
|
216
|
-
debug(
|
|
224
|
+
_respond(client, response) {
|
|
225
|
+
debug("sending response: %o", response.content);
|
|
217
226
|
|
|
218
|
-
if (global.NODE_ENV ===
|
|
227
|
+
if (global.NODE_ENV === "development" && this.config.developmentMode) {
|
|
219
228
|
this.broadcast({
|
|
220
229
|
channels: [this.config.responseTopic],
|
|
221
230
|
payload: response.content,
|
|
@@ -229,48 +238,49 @@ class MqttProtocol extends Protocol {
|
|
|
229
238
|
payload: Buffer.from(JSON.stringify(response.content)),
|
|
230
239
|
topic: this.config.responseTopic,
|
|
231
240
|
},
|
|
232
|
-
this.publishCallback
|
|
241
|
+
this.publishCallback
|
|
242
|
+
);
|
|
233
243
|
}
|
|
234
244
|
|
|
235
|
-
_respondError
|
|
245
|
+
_respondError(client, error) {
|
|
236
246
|
const connection = this.connections.get(client);
|
|
237
247
|
|
|
238
|
-
const errReq = new Request(
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
248
|
+
const errReq = new Request(
|
|
249
|
+
{},
|
|
250
|
+
{
|
|
251
|
+
connection,
|
|
252
|
+
error: kerror.getFrom(error, "unexpected_error", error.message),
|
|
253
|
+
}
|
|
254
|
+
);
|
|
242
255
|
this._respond(client, removeStacktrace(errReq.response.toJSON()));
|
|
243
256
|
}
|
|
244
257
|
|
|
245
|
-
_authorizePublish
|
|
258
|
+
_authorizePublish(client, packet, callback) {
|
|
246
259
|
const topic = packet.topic.toString();
|
|
247
260
|
|
|
248
261
|
if (this.config.allowPubSub) {
|
|
249
262
|
if (topic === this.config.responseTopic) {
|
|
250
|
-
callback(new Error(
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
}
|
|
255
|
-
else {
|
|
263
|
+
callback(new Error("Cannot publish: this topic is read-only"));
|
|
264
|
+
} else if (topic.includes("#") || topic.includes("+")) {
|
|
265
|
+
callback(new Error("Cannot publish: wildcards are disabled"));
|
|
266
|
+
} else {
|
|
256
267
|
callback(null);
|
|
257
268
|
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
269
|
+
} else {
|
|
270
|
+
callback(
|
|
271
|
+
topic === this.config.requestTopic
|
|
272
|
+
? null
|
|
273
|
+
: new Error("Cannot publish on this topic: unauthorized")
|
|
274
|
+
);
|
|
263
275
|
}
|
|
264
276
|
}
|
|
265
277
|
|
|
266
|
-
_authorizeSubscribe
|
|
278
|
+
_authorizeSubscribe(client, sub, callback) {
|
|
267
279
|
if (sub.topic === this.config.requestTopic) {
|
|
268
|
-
callback(new Error(
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
}
|
|
273
|
-
else {
|
|
280
|
+
callback(new Error("Cannot subscribe: this topic is write-only"));
|
|
281
|
+
} else if (sub.topic.includes("#") || sub.topic.includes("+")) {
|
|
282
|
+
callback(new Error("Cannot subscribe: wildcards are disabled"));
|
|
283
|
+
} else {
|
|
274
284
|
callback(null, sub);
|
|
275
285
|
}
|
|
276
286
|
}
|
|
@@ -19,14 +19,14 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const assert = require(
|
|
24
|
+
const assert = require("assert");
|
|
25
25
|
|
|
26
|
-
const bytes = require(
|
|
26
|
+
const bytes = require("../../../util/bytes");
|
|
27
27
|
|
|
28
28
|
class Protocol {
|
|
29
|
-
constructor
|
|
29
|
+
constructor(name) {
|
|
30
30
|
this.maxRequestSize = null;
|
|
31
31
|
this.entryPoint = null;
|
|
32
32
|
this.name = name;
|
|
@@ -34,9 +34,9 @@ class Protocol {
|
|
|
34
34
|
|
|
35
35
|
this.initCalled = false;
|
|
36
36
|
|
|
37
|
-
Reflect.defineProperty(this,
|
|
37
|
+
Reflect.defineProperty(this, "_kuzzle", {
|
|
38
38
|
value: null,
|
|
39
|
-
writable: true
|
|
39
|
+
writable: true,
|
|
40
40
|
});
|
|
41
41
|
}
|
|
42
42
|
|
|
@@ -46,23 +46,25 @@ class Protocol {
|
|
|
46
46
|
*
|
|
47
47
|
* @returns {Promise<boolean>}
|
|
48
48
|
*/
|
|
49
|
-
async init
|
|
49
|
+
async init(name, entryPoint) {
|
|
50
50
|
this.entryPoint = entryPoint;
|
|
51
51
|
|
|
52
52
|
// name should be passed in the constructor
|
|
53
53
|
assert(
|
|
54
|
-
this.name && !
|
|
55
|
-
|
|
54
|
+
this.name && !name,
|
|
55
|
+
"A name has been given in the constructor and init method. Passing the name in the init method is deprecated."
|
|
56
|
+
);
|
|
56
57
|
|
|
57
|
-
if (!
|
|
58
|
+
if (!this.name) {
|
|
58
59
|
this.name = name;
|
|
59
60
|
}
|
|
60
61
|
|
|
61
62
|
this.maxRequestSize = bytes(entryPoint.config.maxRequestSize);
|
|
62
63
|
|
|
63
64
|
assert(
|
|
64
|
-
typeof this.name ===
|
|
65
|
-
'Invalid "name" parameter value: expected a non empty string value'
|
|
65
|
+
typeof this.name === "string" && this.name.length > 0,
|
|
66
|
+
'Invalid "name" parameter value: expected a non empty string value'
|
|
67
|
+
);
|
|
66
68
|
|
|
67
69
|
if (entryPoint.config.protocols && entryPoint.config.protocols[this.name]) {
|
|
68
70
|
this.config = entryPoint.config.protocols[this.name];
|
|
@@ -70,28 +72,29 @@ class Protocol {
|
|
|
70
72
|
|
|
71
73
|
assert(
|
|
72
74
|
Number.isInteger(this.maxRequestSize),
|
|
73
|
-
'Invalid "maxRequestSize" parameter value: expected a numeric value'
|
|
75
|
+
'Invalid "maxRequestSize" parameter value: expected a numeric value'
|
|
76
|
+
);
|
|
74
77
|
|
|
75
78
|
this.initCalled = true;
|
|
76
79
|
|
|
77
80
|
return true;
|
|
78
81
|
}
|
|
79
82
|
|
|
80
|
-
broadcast
|
|
83
|
+
broadcast() {
|
|
81
84
|
// do nothing by default
|
|
82
85
|
}
|
|
83
86
|
|
|
84
|
-
joinChannel
|
|
87
|
+
joinChannel(channel, connectionId) {
|
|
85
88
|
// do nothing by default
|
|
86
89
|
return { channel, connectionId };
|
|
87
90
|
}
|
|
88
91
|
|
|
89
|
-
leaveChannel
|
|
92
|
+
leaveChannel(channel, connectionId) {
|
|
90
93
|
// do nothing by default
|
|
91
94
|
return { channel, connectionId };
|
|
92
95
|
}
|
|
93
96
|
|
|
94
|
-
notify
|
|
97
|
+
notify() {
|
|
95
98
|
// do nothing by default
|
|
96
99
|
}
|
|
97
100
|
}
|