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,9 +19,9 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const { PluginContext } = require(
|
|
24
|
+
const { PluginContext } = require("./pluginContext");
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
27
|
* @class PrivilegedPluginContext
|
|
@@ -33,7 +33,7 @@ class PrivilegedPluginContext extends PluginContext {
|
|
|
33
33
|
* @param {string} pluginName
|
|
34
34
|
* @constructor
|
|
35
35
|
*/
|
|
36
|
-
constructor
|
|
36
|
+
constructor(pluginName) {
|
|
37
37
|
super(pluginName);
|
|
38
38
|
|
|
39
39
|
this.accessors.kuzzle = global.kuzzle;
|
|
@@ -45,7 +45,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
45
45
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
46
|
exports.Channel = void 0;
|
|
47
47
|
const kerror = __importStar(require("../../kerror"));
|
|
48
|
-
const realtimeError = kerror.wrap(
|
|
48
|
+
const realtimeError = kerror.wrap("core", "realtime");
|
|
49
49
|
/**
|
|
50
50
|
* A channel define how notifications should be send for a particular realtime
|
|
51
51
|
* room.
|
|
@@ -68,15 +68,15 @@ const realtimeError = kerror.wrap('core', 'realtime');
|
|
|
68
68
|
* @property cluster
|
|
69
69
|
*/
|
|
70
70
|
class Channel {
|
|
71
|
-
constructor(roomId, { scope =
|
|
71
|
+
constructor(roomId, { scope = "all", users = "none", propagate = true, } = {}) {
|
|
72
72
|
this.scope = scope;
|
|
73
73
|
this.users = users;
|
|
74
74
|
this.cluster = propagate;
|
|
75
75
|
if (!Channel.SCOPE_ALLOWED_VALUES.includes(this.scope)) {
|
|
76
|
-
throw realtimeError.get(
|
|
76
|
+
throw realtimeError.get("invalid_scope");
|
|
77
77
|
}
|
|
78
78
|
if (!Channel.USERS_ALLOWED_VALUES.includes(this.users)) {
|
|
79
|
-
throw realtimeError.get(
|
|
79
|
+
throw realtimeError.get("invalid_users");
|
|
80
80
|
}
|
|
81
81
|
this.name = `${roomId}-${Channel.hash(this)}`;
|
|
82
82
|
}
|
|
@@ -86,44 +86,44 @@ class Channel {
|
|
|
86
86
|
* This is 10x faster than murmur.
|
|
87
87
|
*/
|
|
88
88
|
static hash(channel) {
|
|
89
|
-
let str =
|
|
89
|
+
let str = "";
|
|
90
90
|
switch (channel.users) {
|
|
91
|
-
case
|
|
92
|
-
str +=
|
|
91
|
+
case "all":
|
|
92
|
+
str += "1";
|
|
93
93
|
break;
|
|
94
|
-
case
|
|
95
|
-
str +=
|
|
94
|
+
case "in":
|
|
95
|
+
str += "2";
|
|
96
96
|
break;
|
|
97
|
-
case
|
|
98
|
-
str +=
|
|
97
|
+
case "out":
|
|
98
|
+
str += "3";
|
|
99
99
|
break;
|
|
100
|
-
case
|
|
101
|
-
str +=
|
|
100
|
+
case "none":
|
|
101
|
+
str += "3";
|
|
102
102
|
break;
|
|
103
103
|
}
|
|
104
104
|
switch (channel.cluster) {
|
|
105
105
|
case true:
|
|
106
|
-
str +=
|
|
106
|
+
str += "1";
|
|
107
107
|
break;
|
|
108
108
|
case false:
|
|
109
|
-
str +=
|
|
109
|
+
str += "2";
|
|
110
110
|
break;
|
|
111
111
|
}
|
|
112
112
|
switch (channel.scope) {
|
|
113
|
-
case
|
|
114
|
-
str +=
|
|
113
|
+
case "all":
|
|
114
|
+
str += "1";
|
|
115
115
|
break;
|
|
116
|
-
case
|
|
117
|
-
str +=
|
|
116
|
+
case "in":
|
|
117
|
+
str += "2";
|
|
118
118
|
break;
|
|
119
|
-
case
|
|
120
|
-
str +=
|
|
119
|
+
case "out":
|
|
120
|
+
str += "3";
|
|
121
121
|
break;
|
|
122
122
|
}
|
|
123
123
|
return str;
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
126
|
exports.Channel = Channel;
|
|
127
|
-
Channel.USERS_ALLOWED_VALUES = [
|
|
127
|
+
Channel.USERS_ALLOWED_VALUES = ["all", "in", "out", "none"];
|
|
128
128
|
Channel.SCOPE_ALLOWED_VALUES = Channel.USERS_ALLOWED_VALUES;
|
|
129
129
|
//# sourceMappingURL=channel.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { KuzzleRequest } from
|
|
2
|
-
import { User, RoomList } from
|
|
1
|
+
import { KuzzleRequest } from "../../api/request";
|
|
2
|
+
import { User, RoomList } from "../../types";
|
|
3
3
|
/**
|
|
4
4
|
* The HotelClerk is responsible of keeping the list of rooms and subscriptions
|
|
5
5
|
* made to those rooms.
|
|
@@ -56,8 +56,8 @@ const channel_1 = require("./channel");
|
|
|
56
56
|
const connectionRooms_1 = require("./connectionRooms");
|
|
57
57
|
const room_1 = require("./room");
|
|
58
58
|
const subscription_1 = require("./subscription");
|
|
59
|
-
const realtimeError = kerror.wrap(
|
|
60
|
-
const debug = (0, debug_1.default)(
|
|
59
|
+
const realtimeError = kerror.wrap("core", "realtime");
|
|
60
|
+
const debug = (0, debug_1.default)("kuzzle:realtime:hotelClerk");
|
|
61
61
|
/**
|
|
62
62
|
* The HotelClerk is responsible of keeping the list of rooms and subscriptions
|
|
63
63
|
* made to those rooms.
|
|
@@ -114,13 +114,13 @@ class HotelClerk {
|
|
|
114
114
|
* @param {string} roomId
|
|
115
115
|
* @returns {boolean} status indicating if the room was created or not
|
|
116
116
|
*/
|
|
117
|
-
global.kuzzle.onAsk(
|
|
117
|
+
global.kuzzle.onAsk("core:realtime:room:create", (index, collection, roomId) => this.newRoom(index, collection, roomId));
|
|
118
118
|
/**
|
|
119
119
|
* Joins an existing room.
|
|
120
120
|
* @param {Request} request
|
|
121
121
|
* @returns {Promise}
|
|
122
122
|
*/
|
|
123
|
-
global.kuzzle.onAsk(
|
|
123
|
+
global.kuzzle.onAsk("core:realtime:join", (request) => this.join(request));
|
|
124
124
|
/**
|
|
125
125
|
* Return the list of index, collection, rooms (+ their users count)
|
|
126
126
|
* on all index/collection pairs that the requesting user is allowed to
|
|
@@ -130,25 +130,25 @@ class HotelClerk {
|
|
|
130
130
|
* @return {number}
|
|
131
131
|
* @throws {NotFoundError} If the roomId does not exist
|
|
132
132
|
*/
|
|
133
|
-
global.kuzzle.onAsk(
|
|
133
|
+
global.kuzzle.onAsk("core:realtime:list", (user) => this.list(user));
|
|
134
134
|
/**
|
|
135
135
|
* Given an index, returns the list of collections having subscriptions
|
|
136
136
|
* on them.
|
|
137
137
|
* @param {string} index
|
|
138
138
|
* @return {Array.<string>}
|
|
139
139
|
*/
|
|
140
|
-
global.kuzzle.onAsk(
|
|
140
|
+
global.kuzzle.onAsk("core:realtime:collections:get", (index) => this.listCollections(index));
|
|
141
141
|
/**
|
|
142
142
|
* Removes a user and all their subscriptions.
|
|
143
143
|
* @param {string} connectionId
|
|
144
144
|
*/
|
|
145
|
-
global.kuzzle.onAsk(
|
|
145
|
+
global.kuzzle.onAsk("core:realtime:connection:remove", (connectionId) => this.removeConnection(connectionId));
|
|
146
146
|
/**
|
|
147
147
|
* Adds a new user subscription
|
|
148
148
|
* @param {Request} request
|
|
149
149
|
* @return {Object|null}
|
|
150
150
|
*/
|
|
151
|
-
global.kuzzle.onAsk(
|
|
151
|
+
global.kuzzle.onAsk("core:realtime:subscribe", (request) => this.subscribe(request));
|
|
152
152
|
/**
|
|
153
153
|
* Unsubscribes a user from a room
|
|
154
154
|
* @param {string} connectionId
|
|
@@ -156,24 +156,23 @@ class HotelClerk {
|
|
|
156
156
|
* @param {string} kuid
|
|
157
157
|
* @param {boolean} [notify]
|
|
158
158
|
*/
|
|
159
|
-
global.kuzzle.onAsk(
|
|
159
|
+
global.kuzzle.onAsk("core:realtime:unsubscribe", (connectionId, roomId, notify) => {
|
|
160
160
|
return this.unsubscribe(connectionId, roomId, notify);
|
|
161
161
|
});
|
|
162
162
|
/**
|
|
163
163
|
* Returns inner metrics from the HotelClerk
|
|
164
164
|
* @return {{rooms: number, subscriptions: number}}
|
|
165
165
|
*/
|
|
166
|
-
global.kuzzle.onAsk(
|
|
166
|
+
global.kuzzle.onAsk("core:realtime:hotelClerk:metrics", () => this.metrics());
|
|
167
167
|
/**
|
|
168
168
|
* Clear the hotel clerk and properly disconnect connections.
|
|
169
169
|
*/
|
|
170
|
-
global.kuzzle.on(
|
|
170
|
+
global.kuzzle.on("kuzzle:shutdown", () => this.clearConnections());
|
|
171
171
|
/**
|
|
172
172
|
* Clear subscriptions when a connection is dropped
|
|
173
173
|
*/
|
|
174
|
-
global.kuzzle.on(
|
|
175
|
-
this.removeConnection(connection.id)
|
|
176
|
-
.catch(err => global.kuzzle.log.info(err));
|
|
174
|
+
global.kuzzle.on("connection:remove", (connection) => {
|
|
175
|
+
this.removeConnection(connection.id).catch((err) => global.kuzzle.log.info(err));
|
|
177
176
|
});
|
|
178
177
|
}
|
|
179
178
|
/**
|
|
@@ -191,10 +190,10 @@ class HotelClerk {
|
|
|
191
190
|
async subscribe(request) {
|
|
192
191
|
const { index, collection } = request.input.resource;
|
|
193
192
|
if (!index) {
|
|
194
|
-
return kerror.reject(
|
|
193
|
+
return kerror.reject("api", "assert", "missing_argument", "index");
|
|
195
194
|
}
|
|
196
195
|
if (!collection) {
|
|
197
|
-
return kerror.reject(
|
|
196
|
+
return kerror.reject("api", "assert", "missing_argument", "collection");
|
|
198
197
|
}
|
|
199
198
|
/*
|
|
200
199
|
* /!\ This check is a duplicate to the one already made by the
|
|
@@ -215,7 +214,7 @@ class HotelClerk {
|
|
|
215
214
|
normalized = this.koncorde.normalize(request.input.body, (0, koncordeCompat_1.toKoncordeIndex)(index, collection));
|
|
216
215
|
}
|
|
217
216
|
catch (e) {
|
|
218
|
-
throw kerror.get(
|
|
217
|
+
throw kerror.get("api", "assert", "koncorde_dsl_error", e.message);
|
|
219
218
|
}
|
|
220
219
|
this.createRoom(normalized);
|
|
221
220
|
/**
|
|
@@ -235,10 +234,10 @@ class HotelClerk {
|
|
|
235
234
|
*/
|
|
236
235
|
const afterSubscribeCallback = async (subscribed) => {
|
|
237
236
|
if (subscribed) {
|
|
238
|
-
global.kuzzle.call(
|
|
237
|
+
global.kuzzle.call("core:realtime:subscribe:after", normalized.id);
|
|
239
238
|
// @deprecated -- to be removed in next major version
|
|
240
239
|
// we have to recreate the old "diff" object
|
|
241
|
-
await global.kuzzle.pipe(
|
|
240
|
+
await global.kuzzle.pipe("core:hotelClerk:addSubscription", {
|
|
242
241
|
changed: subscribed,
|
|
243
242
|
collection,
|
|
244
243
|
connectionId: request.context.connection.id,
|
|
@@ -250,7 +249,7 @@ class HotelClerk {
|
|
|
250
249
|
};
|
|
251
250
|
const { channel } = await this.subscribeToRoom(normalized.id, request, afterSubscribeCallback);
|
|
252
251
|
const subscription = new subscription_1.Subscription(index, collection, request.input.body, normalized.id, request.context.connection.id, request.context.user);
|
|
253
|
-
global.kuzzle.emit(
|
|
252
|
+
global.kuzzle.emit("core:realtime:user:subscribe:after", subscription);
|
|
254
253
|
return {
|
|
255
254
|
channel,
|
|
256
255
|
roomId: normalized.id,
|
|
@@ -271,9 +270,9 @@ class HotelClerk {
|
|
|
271
270
|
async join(request) {
|
|
272
271
|
const roomId = request.input.body.roomId;
|
|
273
272
|
if (!this.rooms.has(roomId)) {
|
|
274
|
-
const normalized = await global.kuzzle.ask(
|
|
273
|
+
const normalized = await global.kuzzle.ask("cluster:realtime:filters:get", roomId);
|
|
275
274
|
if (!normalized) {
|
|
276
|
-
throw realtimeError.get(
|
|
275
|
+
throw realtimeError.get("room_not_found", roomId);
|
|
277
276
|
}
|
|
278
277
|
this.createRoom(normalized);
|
|
279
278
|
}
|
|
@@ -294,7 +293,7 @@ class HotelClerk {
|
|
|
294
293
|
*/
|
|
295
294
|
const afterSubscribeCallback = async (subscribed, cluster) => {
|
|
296
295
|
if (cluster && subscribed) {
|
|
297
|
-
global.kuzzle.call(
|
|
296
|
+
global.kuzzle.call("core:realtime:subscribe:after", roomId);
|
|
298
297
|
}
|
|
299
298
|
};
|
|
300
299
|
const { channel } = await this.subscribeToRoom(roomId, request, afterSubscribeCallback);
|
|
@@ -312,14 +311,14 @@ class HotelClerk {
|
|
|
312
311
|
// We need the room list from the cluster's full state, NOT the one stored
|
|
313
312
|
// in Koncorde: the latter also contains subscriptions created by the
|
|
314
313
|
// framework (or by plugins), and we don't want those to appear in the API
|
|
315
|
-
const fullStateRooms = await global.kuzzle.ask(
|
|
314
|
+
const fullStateRooms = await global.kuzzle.ask("cluster:realtime:room:list");
|
|
316
315
|
const isAllowedRequest = new request_1.KuzzleRequest({
|
|
317
|
-
action:
|
|
318
|
-
controller:
|
|
316
|
+
action: "subscribe",
|
|
317
|
+
controller: "realtime",
|
|
319
318
|
}, {});
|
|
320
319
|
for (const [index, collections] of Object.entries(fullStateRooms)) {
|
|
321
320
|
isAllowedRequest.input.resource.index = index;
|
|
322
|
-
const toRemove = await bluebird_1.default.filter(Object.keys(collections), collection => {
|
|
321
|
+
const toRemove = await bluebird_1.default.filter(Object.keys(collections), (collection) => {
|
|
323
322
|
isAllowedRequest.input.resource.collection = collection;
|
|
324
323
|
return !user.isActionAllowed(isAllowedRequest);
|
|
325
324
|
});
|
|
@@ -340,7 +339,7 @@ class HotelClerk {
|
|
|
340
339
|
// No need to raise an error if the connection does not have room subscriptions
|
|
341
340
|
return;
|
|
342
341
|
}
|
|
343
|
-
await bluebird_1.default.map(connectionRooms.roomIds, (roomId) =>
|
|
342
|
+
await bluebird_1.default.map(connectionRooms.roomIds, (roomId) => this.unsubscribe(connectionId, roomId, notify).catch(global.kuzzle.log.error));
|
|
344
343
|
}
|
|
345
344
|
/**
|
|
346
345
|
* Clear all connections made to this node:
|
|
@@ -348,7 +347,7 @@ class HotelClerk {
|
|
|
348
347
|
* - send user exit room notifications
|
|
349
348
|
*/
|
|
350
349
|
async clearConnections() {
|
|
351
|
-
await bluebird_1.default.map(this.subscriptions.keys(), (connectionId) =>
|
|
350
|
+
await bluebird_1.default.map(this.subscriptions.keys(), (connectionId) => this.removeConnection(connectionId, false));
|
|
352
351
|
}
|
|
353
352
|
/**
|
|
354
353
|
* Register a new subscription
|
|
@@ -356,7 +355,7 @@ class HotelClerk {
|
|
|
356
355
|
* - add the connection to the list of active connections of the room
|
|
357
356
|
*/
|
|
358
357
|
registerSubscription(connectionId, roomId, volatile) {
|
|
359
|
-
debug(
|
|
358
|
+
debug("Add room %s for connection %s", roomId, connectionId);
|
|
360
359
|
let connectionRooms = this.subscriptions.get(connectionId);
|
|
361
360
|
if (!connectionRooms) {
|
|
362
361
|
connectionRooms = new connectionRooms_1.ConnectionRooms();
|
|
@@ -378,12 +377,12 @@ class HotelClerk {
|
|
|
378
377
|
}
|
|
379
378
|
const roomsLimit = global.kuzzle.config.limits.subscriptionRooms;
|
|
380
379
|
if (roomsLimit > 0 && this.roomsCount >= roomsLimit) {
|
|
381
|
-
throw realtimeError.get(
|
|
380
|
+
throw realtimeError.get("too_many_rooms");
|
|
382
381
|
}
|
|
383
382
|
this.koncorde.store(normalized);
|
|
384
|
-
global.kuzzle.call(
|
|
383
|
+
global.kuzzle.call("core:realtime:room:create:after", normalized);
|
|
385
384
|
// @deprecated -- to be removed in the next major version of kuzzle
|
|
386
|
-
global.kuzzle.emit(
|
|
385
|
+
global.kuzzle.emit("room:new", { collection, index, roomId });
|
|
387
386
|
/*
|
|
388
387
|
In some very rare cases, the room may have been created between
|
|
389
388
|
the beginning of the function executed at the end of normalize,
|
|
@@ -405,14 +404,14 @@ class HotelClerk {
|
|
|
405
404
|
async unsubscribe(connectionId, roomId, notify = true) {
|
|
406
405
|
const connectionRooms = this.subscriptions.get(connectionId);
|
|
407
406
|
const requestContext = new request_1.RequestContext({
|
|
408
|
-
connection: { id: connectionId }
|
|
407
|
+
connection: { id: connectionId },
|
|
409
408
|
});
|
|
410
409
|
if (!connectionRooms) {
|
|
411
|
-
throw realtimeError.get(
|
|
410
|
+
throw realtimeError.get("not_subscribed", connectionId, roomId);
|
|
412
411
|
}
|
|
413
412
|
const volatile = connectionRooms.getVolatile(roomId);
|
|
414
413
|
if (volatile === undefined) {
|
|
415
|
-
throw realtimeError.get(
|
|
414
|
+
throw realtimeError.get("not_subscribed", connectionId, roomId);
|
|
416
415
|
}
|
|
417
416
|
if (connectionRooms.count > 1) {
|
|
418
417
|
connectionRooms.removeRoom(roomId);
|
|
@@ -423,7 +422,7 @@ class HotelClerk {
|
|
|
423
422
|
const room = this.rooms.get(roomId);
|
|
424
423
|
if (!room) {
|
|
425
424
|
global.kuzzle.log.error(`Cannot remove room "${roomId}": room not found`);
|
|
426
|
-
throw realtimeError.get(
|
|
425
|
+
throw realtimeError.get("room_not_found", roomId);
|
|
427
426
|
}
|
|
428
427
|
for (const channel of Object.keys(room.channels)) {
|
|
429
428
|
global.kuzzle.entryPoint.leaveChannel(channel, connectionId);
|
|
@@ -441,21 +440,21 @@ class HotelClerk {
|
|
|
441
440
|
// even if the room is deleted for this node, another one may need the
|
|
442
441
|
// notification
|
|
443
442
|
const request = new request_1.Request({
|
|
444
|
-
action:
|
|
443
|
+
action: "unsubscribe",
|
|
445
444
|
collection: room.collection,
|
|
446
|
-
controller:
|
|
445
|
+
controller: "realtime",
|
|
447
446
|
index: room.index,
|
|
448
447
|
volatile,
|
|
449
448
|
}, requestContext);
|
|
450
449
|
// Do not send an unsubscription notification if the room has been destroyed
|
|
451
450
|
// because the other nodes already had destroyed it in the full state
|
|
452
|
-
if (notify
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
global.kuzzle.call(
|
|
451
|
+
if (notify &&
|
|
452
|
+
this.rooms.has(roomId) &&
|
|
453
|
+
room.channels.size > 0 &&
|
|
454
|
+
!roomDeleted) {
|
|
455
|
+
global.kuzzle.call("core:realtime:unsubscribe:after", roomId);
|
|
457
456
|
// @deprecated -- to be removed in next major version
|
|
458
|
-
await global.kuzzle.pipe(
|
|
457
|
+
await global.kuzzle.pipe("core:hotelClerk:removeRoomForCustomer", {
|
|
459
458
|
requestContext,
|
|
460
459
|
room: {
|
|
461
460
|
collection: room.collection,
|
|
@@ -464,10 +463,12 @@ class HotelClerk {
|
|
|
464
463
|
},
|
|
465
464
|
});
|
|
466
465
|
}
|
|
467
|
-
await this.module.notifier.notifyUser(roomId, request,
|
|
466
|
+
await this.module.notifier.notifyUser(roomId, request, "out", {
|
|
467
|
+
count: room.size,
|
|
468
|
+
});
|
|
468
469
|
const kuid = global.kuzzle.tokenManager.getKuidFromConnection(connectionId);
|
|
469
470
|
const subscription = new subscription_1.Subscription(room.index, room.collection, undefined, roomId, connectionId, { _id: kuid });
|
|
470
|
-
global.kuzzle.emit(
|
|
471
|
+
global.kuzzle.emit("core:realtime:user:unsubscribe:after", {
|
|
471
472
|
/* @deprecated */
|
|
472
473
|
requestContext,
|
|
473
474
|
/* @deprecated */
|
|
@@ -499,10 +500,10 @@ class HotelClerk {
|
|
|
499
500
|
// The cluster will also remove the room from Koncorde if no other node
|
|
500
501
|
// uses it.
|
|
501
502
|
// (this node may have no subscribers on it, but other nodes might)
|
|
502
|
-
await global.kuzzle.ask(
|
|
503
|
+
await global.kuzzle.ask("cluster:realtime:room:remove", roomId);
|
|
503
504
|
// @deprecated -- to be removed in the next major version
|
|
504
505
|
try {
|
|
505
|
-
await global.kuzzle.pipe(
|
|
506
|
+
await global.kuzzle.pipe("room:remove", roomId);
|
|
506
507
|
}
|
|
507
508
|
catch (e) {
|
|
508
509
|
return;
|
|
@@ -526,7 +527,9 @@ class HotelClerk {
|
|
|
526
527
|
if (!connectionRooms || !connectionRooms.hasRoom(roomId)) {
|
|
527
528
|
subscribed = true;
|
|
528
529
|
this.registerSubscription(connectionId, roomId, request.input.volatile);
|
|
529
|
-
notifyPromise = this.module.notifier.notifyUser(roomId, request,
|
|
530
|
+
notifyPromise = this.module.notifier.notifyUser(roomId, request, "in", {
|
|
531
|
+
count: room.size,
|
|
532
|
+
});
|
|
530
533
|
}
|
|
531
534
|
else {
|
|
532
535
|
notifyPromise = bluebird_1.default.resolve();
|
|
@@ -19,18 +19,18 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const Notifier = require(
|
|
25
|
-
const { HotelClerk } = require(
|
|
24
|
+
const Notifier = require("./notifier");
|
|
25
|
+
const { HotelClerk } = require("./hotelClerk");
|
|
26
26
|
|
|
27
27
|
class RealtimeModule {
|
|
28
|
-
constructor
|
|
28
|
+
constructor() {
|
|
29
29
|
this.notifier = new Notifier(this);
|
|
30
30
|
this.hotelClerk = new HotelClerk(this);
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
async init
|
|
33
|
+
async init() {
|
|
34
34
|
await this.notifier.init();
|
|
35
35
|
await this.hotelClerk.init();
|
|
36
36
|
}
|
|
@@ -19,33 +19,33 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const { InternalError } = require(
|
|
24
|
+
const { InternalError } = require("../../../kerror/errors");
|
|
25
25
|
|
|
26
|
-
function getEvent
|
|
26
|
+
function getEvent(action) {
|
|
27
27
|
switch (action) {
|
|
28
|
-
case
|
|
29
|
-
case
|
|
30
|
-
case
|
|
31
|
-
case
|
|
32
|
-
case
|
|
33
|
-
case
|
|
34
|
-
case
|
|
35
|
-
case
|
|
36
|
-
case
|
|
37
|
-
case
|
|
38
|
-
case
|
|
39
|
-
case
|
|
40
|
-
return
|
|
28
|
+
case "create":
|
|
29
|
+
case "mCreate":
|
|
30
|
+
case "createOrReplace":
|
|
31
|
+
case "mCreateOrReplace":
|
|
32
|
+
case "replace":
|
|
33
|
+
case "mReplace":
|
|
34
|
+
case "update":
|
|
35
|
+
case "updateByQuery":
|
|
36
|
+
case "mUpdate":
|
|
37
|
+
case "write":
|
|
38
|
+
case "mWrite":
|
|
39
|
+
case "upsert":
|
|
40
|
+
return "write";
|
|
41
41
|
|
|
42
|
-
case
|
|
43
|
-
case
|
|
44
|
-
case
|
|
45
|
-
return
|
|
42
|
+
case "delete":
|
|
43
|
+
case "deleteByQuery":
|
|
44
|
+
case "mDelete":
|
|
45
|
+
return "delete";
|
|
46
46
|
|
|
47
|
-
case
|
|
48
|
-
return
|
|
47
|
+
case "publish":
|
|
48
|
+
return "publish";
|
|
49
49
|
|
|
50
50
|
default:
|
|
51
51
|
throw new InternalError(`Unknown event type for action "${action}"`);
|
|
@@ -57,8 +57,8 @@ function getEvent (action) {
|
|
|
57
57
|
* @class DocumentNotification
|
|
58
58
|
*/
|
|
59
59
|
class DocumentNotification {
|
|
60
|
-
constructor
|
|
61
|
-
this.type =
|
|
60
|
+
constructor(opts) {
|
|
61
|
+
this.type = "document";
|
|
62
62
|
|
|
63
63
|
this.status = opts.status;
|
|
64
64
|
this.action = opts.action;
|
|
@@ -87,7 +87,7 @@ class DocumentNotification {
|
|
|
87
87
|
* @param {result} content - Notification content
|
|
88
88
|
* @returns {DocumentNotification}
|
|
89
89
|
*/
|
|
90
|
-
static fromRequest
|
|
90
|
+
static fromRequest(request, scope, action, result) {
|
|
91
91
|
return new DocumentNotification({
|
|
92
92
|
action,
|
|
93
93
|
collection: request.input.resource.collection,
|
|
@@ -19,10 +19,10 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
24
|
module.exports = {
|
|
25
|
-
DocumentNotification: require(
|
|
26
|
-
ServerNotification: require(
|
|
27
|
-
UserNotification: require(
|
|
25
|
+
DocumentNotification: require("./document"),
|
|
26
|
+
ServerNotification: require("./server"),
|
|
27
|
+
UserNotification: require("./user"),
|
|
28
28
|
};
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
25
|
* Creates a notification response from a given room, request object, and content.
|
|
@@ -30,9 +30,9 @@
|
|
|
30
30
|
* @param {string} message - Notification message
|
|
31
31
|
*/
|
|
32
32
|
class ServerNotification {
|
|
33
|
-
constructor
|
|
33
|
+
constructor(type, message) {
|
|
34
34
|
this.status = 200;
|
|
35
|
-
this.info =
|
|
35
|
+
this.info = "This is an automated server notification";
|
|
36
36
|
this.message = message;
|
|
37
37
|
this.type = type;
|
|
38
38
|
this.node = global.kuzzle.id;
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
25
|
* User notification document
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
* @class UserNotification
|
|
28
28
|
*/
|
|
29
29
|
class UserNotification {
|
|
30
|
-
constructor
|
|
31
|
-
this.type =
|
|
30
|
+
constructor(opts) {
|
|
31
|
+
this.type = "user";
|
|
32
32
|
|
|
33
33
|
this.status = opts.status;
|
|
34
34
|
this.user = opts.user;
|
|
@@ -50,7 +50,7 @@ class UserNotification {
|
|
|
50
50
|
* @param {object} content - Notification content
|
|
51
51
|
* returns {UserNotification}
|
|
52
52
|
*/
|
|
53
|
-
static fromRequest
|
|
53
|
+
static fromRequest(request, user, result) {
|
|
54
54
|
return new UserNotification({
|
|
55
55
|
action: request.input.action,
|
|
56
56
|
collection: request.input.resource.collection,
|