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,26 +19,26 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const { difference } = require(
|
|
25
|
-
const Bluebird = require(
|
|
24
|
+
const { difference } = require("lodash");
|
|
25
|
+
const Bluebird = require("bluebird");
|
|
26
26
|
|
|
27
|
-
const kerror = require(
|
|
28
|
-
const actionEnum = require(
|
|
29
|
-
const { koncordeTest } = require(
|
|
27
|
+
const kerror = require("../../kerror");
|
|
28
|
+
const actionEnum = require("./actionEnum");
|
|
29
|
+
const { koncordeTest } = require("../../util/koncordeCompat");
|
|
30
30
|
const {
|
|
31
31
|
DocumentNotification,
|
|
32
32
|
ServerNotification,
|
|
33
33
|
UserNotification,
|
|
34
|
-
} = require(
|
|
34
|
+
} = require("./notification");
|
|
35
35
|
|
|
36
36
|
/**
|
|
37
37
|
* Notification are meant to be dispatched on "channels" created when subscribing.
|
|
38
38
|
* But some notification like TokenExpired don't have a specific channel to be received on,
|
|
39
39
|
* so we need a constant channel name to send Kuzzle notification without having to subscribe.
|
|
40
40
|
*/
|
|
41
|
-
const KUZZLE_NOTIFICATION_CHANNEL =
|
|
41
|
+
const KUZZLE_NOTIFICATION_CHANNEL = "kuzzle:notification:server";
|
|
42
42
|
|
|
43
43
|
/**
|
|
44
44
|
* @typedef {Object} DocumentChanges
|
|
@@ -53,12 +53,12 @@ const KUZZLE_NOTIFICATION_CHANNEL = 'kuzzle:notification:server';
|
|
|
53
53
|
* @class NotifierController
|
|
54
54
|
*/
|
|
55
55
|
class NotifierController {
|
|
56
|
-
constructor
|
|
56
|
+
constructor(realtimeModule) {
|
|
57
57
|
this.module = realtimeModule;
|
|
58
58
|
this.ttl = global.kuzzle.config.limits.subscriptionDocumentTTL;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
async init
|
|
61
|
+
async init() {
|
|
62
62
|
/**
|
|
63
63
|
* Low-level document notification method, allocating a new Notification
|
|
64
64
|
* message and dispatching it to a precomputed list of rooms.
|
|
@@ -67,11 +67,11 @@ class NotifierController {
|
|
|
67
67
|
* @param {Object} [opts]
|
|
68
68
|
*/
|
|
69
69
|
global.kuzzle.onAsk(
|
|
70
|
-
|
|
70
|
+
"core:realtime:document:dispatch",
|
|
71
71
|
(rooms, notification, opts) => {
|
|
72
72
|
return this._notifyDocument(rooms, notification, opts);
|
|
73
|
-
}
|
|
74
|
-
|
|
73
|
+
}
|
|
74
|
+
);
|
|
75
75
|
|
|
76
76
|
/**
|
|
77
77
|
* Low-level user notification method, allocating a new Notification
|
|
@@ -81,10 +81,11 @@ class NotifierController {
|
|
|
81
81
|
* @param {Object} [opts]
|
|
82
82
|
*/
|
|
83
83
|
global.kuzzle.onAsk(
|
|
84
|
-
|
|
84
|
+
"core:realtime:user:sendMessage",
|
|
85
85
|
(room, notification, opts) => {
|
|
86
86
|
return this._notifyUser(room, notification, opts);
|
|
87
|
-
}
|
|
87
|
+
}
|
|
88
|
+
);
|
|
88
89
|
|
|
89
90
|
/**
|
|
90
91
|
* Notify about document creations, updates, replacements or deletions
|
|
@@ -93,8 +94,9 @@ class NotifierController {
|
|
|
93
94
|
* @param {Array.<DocumentChanges>} docs
|
|
94
95
|
*/
|
|
95
96
|
global.kuzzle.onAsk(
|
|
96
|
-
|
|
97
|
-
(request, action, docs) => this.notifyDocuments(request, action, docs)
|
|
97
|
+
"core:realtime:document:mNotify",
|
|
98
|
+
(request, action, docs) => this.notifyDocuments(request, action, docs)
|
|
99
|
+
);
|
|
98
100
|
|
|
99
101
|
/**
|
|
100
102
|
* Notify about document creations, updates, replacements or deletions
|
|
@@ -103,23 +105,25 @@ class NotifierController {
|
|
|
103
105
|
* @param {DocumentChanges} doc
|
|
104
106
|
*/
|
|
105
107
|
global.kuzzle.onAsk(
|
|
106
|
-
|
|
107
|
-
(request, action, doc) => this.notifyDocuments(request, action, [doc])
|
|
108
|
-
|
|
108
|
+
"core:realtime:document:notify",
|
|
109
|
+
(request, action, doc) => this.notifyDocuments(request, action, [doc])
|
|
110
|
+
);
|
|
109
111
|
|
|
110
112
|
/**
|
|
111
113
|
* Send a "token expired" notification to the target user
|
|
112
114
|
* @param {string} connectionId
|
|
113
115
|
*/
|
|
114
|
-
global.kuzzle.onAsk(
|
|
115
|
-
|
|
116
|
-
|
|
116
|
+
global.kuzzle.onAsk("core:realtime:tokenExpired:notify", (connectionId) =>
|
|
117
|
+
this.notifyTokenExpired(connectionId)
|
|
118
|
+
);
|
|
117
119
|
|
|
118
120
|
/**
|
|
119
121
|
* Publish the provided request content to listening subscribers
|
|
120
122
|
* @param {Request} request
|
|
121
123
|
*/
|
|
122
|
-
global.kuzzle.onAsk(
|
|
124
|
+
global.kuzzle.onAsk("core:realtime:publish", (request) =>
|
|
125
|
+
this.publish(request)
|
|
126
|
+
);
|
|
123
127
|
}
|
|
124
128
|
|
|
125
129
|
/**
|
|
@@ -133,7 +137,7 @@ class NotifierController {
|
|
|
133
137
|
*
|
|
134
138
|
* @returns {Promise}
|
|
135
139
|
*/
|
|
136
|
-
async notifyDocument
|
|
140
|
+
async notifyDocument(rooms, request, scope, action, content) {
|
|
137
141
|
if (rooms.length === 0) {
|
|
138
142
|
return;
|
|
139
143
|
}
|
|
@@ -142,15 +146,16 @@ class NotifierController {
|
|
|
142
146
|
request,
|
|
143
147
|
scope,
|
|
144
148
|
action,
|
|
145
|
-
content
|
|
149
|
+
content
|
|
150
|
+
);
|
|
146
151
|
|
|
147
|
-
global.kuzzle.emit(
|
|
152
|
+
global.kuzzle.emit("core:notify:document", {
|
|
148
153
|
notification,
|
|
149
154
|
rooms,
|
|
150
155
|
});
|
|
151
156
|
|
|
152
157
|
await this._notifyDocument(rooms, notification, {
|
|
153
|
-
fromCluster: false
|
|
158
|
+
fromCluster: false,
|
|
154
159
|
});
|
|
155
160
|
}
|
|
156
161
|
|
|
@@ -165,16 +170,16 @@ class NotifierController {
|
|
|
165
170
|
*
|
|
166
171
|
* @returns {Promise}
|
|
167
172
|
*/
|
|
168
|
-
notifyUser
|
|
173
|
+
notifyUser(room, request, scope, content) {
|
|
169
174
|
const notification = UserNotification.fromRequest(request, scope, content);
|
|
170
175
|
|
|
171
|
-
global.kuzzle.emit(
|
|
176
|
+
global.kuzzle.emit("core:notify:user", {
|
|
172
177
|
notification,
|
|
173
178
|
room,
|
|
174
179
|
});
|
|
175
180
|
|
|
176
181
|
return this._notifyUser(room, notification, {
|
|
177
|
-
fromCluster: false
|
|
182
|
+
fromCluster: false,
|
|
178
183
|
});
|
|
179
184
|
}
|
|
180
185
|
|
|
@@ -184,13 +189,13 @@ class NotifierController {
|
|
|
184
189
|
* @param {string} connectionId - User's connection identifier
|
|
185
190
|
* @returns {Promise}
|
|
186
191
|
*/
|
|
187
|
-
async notifyTokenExpired
|
|
188
|
-
|
|
192
|
+
async notifyTokenExpired(connectionId) {
|
|
189
193
|
await this._dispatch(
|
|
190
|
-
|
|
194
|
+
"notify:server",
|
|
191
195
|
[KUZZLE_NOTIFICATION_CHANNEL], // Sending notification on Kuzzle notification channel
|
|
192
|
-
new ServerNotification(
|
|
193
|
-
connectionId
|
|
196
|
+
new ServerNotification("TokenExpired", "Authentication Token Expired"),
|
|
197
|
+
connectionId
|
|
198
|
+
);
|
|
194
199
|
|
|
195
200
|
await this.module.hotelClerk.removeConnection(connectionId);
|
|
196
201
|
}
|
|
@@ -201,14 +206,14 @@ class NotifierController {
|
|
|
201
206
|
* @param {Request} request
|
|
202
207
|
* @returns {Promise.<Object>}
|
|
203
208
|
*/
|
|
204
|
-
publish
|
|
209
|
+
publish(request) {
|
|
205
210
|
const rooms = this._test(request);
|
|
206
211
|
|
|
207
212
|
if (rooms.length === 0) {
|
|
208
213
|
return Bluebird.resolve(null);
|
|
209
214
|
}
|
|
210
215
|
|
|
211
|
-
return this.notifyDocument(rooms, request,
|
|
216
|
+
return this.notifyDocument(rooms, request, "in", "publish", {
|
|
212
217
|
_id: request.input.args._id,
|
|
213
218
|
_source: request.input.body,
|
|
214
219
|
});
|
|
@@ -221,11 +226,11 @@ class NotifierController {
|
|
|
221
226
|
* @param {DocumentChanges} document created
|
|
222
227
|
* @returns {Promise.<Array.<string>>} list of matched rooms
|
|
223
228
|
*/
|
|
224
|
-
async notifyDocumentCreate
|
|
229
|
+
async notifyDocumentCreate(request, document) {
|
|
225
230
|
const rooms = this._test(request, document._source, document._id);
|
|
226
231
|
|
|
227
232
|
if (rooms.length > 0) {
|
|
228
|
-
await this.notifyDocument(rooms, request,
|
|
233
|
+
await this.notifyDocument(rooms, request, "in", "create", document);
|
|
229
234
|
}
|
|
230
235
|
|
|
231
236
|
return rooms;
|
|
@@ -239,17 +244,23 @@ class NotifierController {
|
|
|
239
244
|
* @param {string} cache notification content for that document
|
|
240
245
|
* @returns {Promise.<Array.<string>} list of matched rooms
|
|
241
246
|
*/
|
|
242
|
-
async notifyDocumentReplace
|
|
247
|
+
async notifyDocumentReplace(request, document, cache = null) {
|
|
243
248
|
const rooms = this._test(request, document._source, document._id);
|
|
244
249
|
|
|
245
250
|
if (rooms.length > 0) {
|
|
246
|
-
await this.notifyDocument(rooms, request,
|
|
251
|
+
await this.notifyDocument(rooms, request, "in", "replace", document);
|
|
247
252
|
}
|
|
248
253
|
|
|
249
254
|
if (cache !== null) {
|
|
250
255
|
const stopListening = difference(JSON.parse(cache), rooms);
|
|
251
256
|
|
|
252
|
-
await this.notifyDocument(
|
|
257
|
+
await this.notifyDocument(
|
|
258
|
+
stopListening,
|
|
259
|
+
request,
|
|
260
|
+
"out",
|
|
261
|
+
"replace",
|
|
262
|
+
document
|
|
263
|
+
);
|
|
253
264
|
}
|
|
254
265
|
|
|
255
266
|
return rooms;
|
|
@@ -262,12 +273,15 @@ class NotifierController {
|
|
|
262
273
|
* @param {Array.<DocumentChanges>} documents
|
|
263
274
|
* @return {Promise}
|
|
264
275
|
*/
|
|
265
|
-
async notifyDocuments
|
|
276
|
+
async notifyDocuments(request, action, documents) {
|
|
266
277
|
const prefix = getCachePrefix(request);
|
|
267
278
|
let cached = action === actionEnum.REPLACE || action === actionEnum.UPDATE;
|
|
268
279
|
|
|
269
|
-
const cacheIds = documents.map(doc => {
|
|
270
|
-
if (
|
|
280
|
+
const cacheIds = documents.map((doc) => {
|
|
281
|
+
if (
|
|
282
|
+
(action === actionEnum.WRITE || action === actionEnum.UPSERT) &&
|
|
283
|
+
!cached
|
|
284
|
+
) {
|
|
271
285
|
cached = doc.created !== true; // force a bool value if undefined
|
|
272
286
|
}
|
|
273
287
|
|
|
@@ -275,7 +289,7 @@ class NotifierController {
|
|
|
275
289
|
});
|
|
276
290
|
|
|
277
291
|
const cache = cached
|
|
278
|
-
? await global.kuzzle.ask(
|
|
292
|
+
? await global.kuzzle.ask("core:cache:internal:mget", cacheIds)
|
|
279
293
|
: [];
|
|
280
294
|
|
|
281
295
|
const result = await Bluebird.map(documents, (doc, index) => {
|
|
@@ -303,7 +317,12 @@ class NotifierController {
|
|
|
303
317
|
: this.notifyDocumentReplace(request, doc, cache[index]);
|
|
304
318
|
|
|
305
319
|
default:
|
|
306
|
-
throw kerror.get(
|
|
320
|
+
throw kerror.get(
|
|
321
|
+
"core",
|
|
322
|
+
"fatal",
|
|
323
|
+
"assertion_failed",
|
|
324
|
+
`unknown notify action "${doc.action}"`
|
|
325
|
+
);
|
|
307
326
|
}
|
|
308
327
|
});
|
|
309
328
|
|
|
@@ -312,10 +331,11 @@ class NotifierController {
|
|
|
312
331
|
await Bluebird.map(result, (rooms, index) => {
|
|
313
332
|
if (rooms.length > 0) {
|
|
314
333
|
return global.kuzzle.ask(
|
|
315
|
-
|
|
334
|
+
"core:cache:internal:store",
|
|
316
335
|
cacheIds[index],
|
|
317
336
|
JSON.stringify(rooms),
|
|
318
|
-
{ ttl: this.ttl }
|
|
337
|
+
{ ttl: this.ttl }
|
|
338
|
+
);
|
|
319
339
|
}
|
|
320
340
|
|
|
321
341
|
toDelete.push(cacheIds[index]);
|
|
@@ -323,7 +343,7 @@ class NotifierController {
|
|
|
323
343
|
});
|
|
324
344
|
|
|
325
345
|
if (toDelete.length > 0) {
|
|
326
|
-
await global.kuzzle.ask(
|
|
346
|
+
await global.kuzzle.ask("core:cache:internal:del", toDelete);
|
|
327
347
|
}
|
|
328
348
|
}
|
|
329
349
|
|
|
@@ -334,17 +354,23 @@ class NotifierController {
|
|
|
334
354
|
* @param {string} cache notification content for that document
|
|
335
355
|
* @returns {Promise.<Array.<string>} list of matched rooms
|
|
336
356
|
*/
|
|
337
|
-
async notifyDocumentUpdate
|
|
357
|
+
async notifyDocumentUpdate(request, document, cache = null) {
|
|
338
358
|
const rooms = this._test(request, document._source, document._id);
|
|
339
359
|
|
|
340
360
|
if (rooms.length > 0) {
|
|
341
|
-
await this.notifyDocument(rooms, request,
|
|
361
|
+
await this.notifyDocument(rooms, request, "in", "update", document);
|
|
342
362
|
}
|
|
343
363
|
|
|
344
364
|
if (cache !== null) {
|
|
345
365
|
const stopListening = difference(JSON.parse(cache), rooms);
|
|
346
366
|
|
|
347
|
-
await this.notifyDocument(
|
|
367
|
+
await this.notifyDocument(
|
|
368
|
+
stopListening,
|
|
369
|
+
request,
|
|
370
|
+
"out",
|
|
371
|
+
"update",
|
|
372
|
+
document
|
|
373
|
+
);
|
|
348
374
|
}
|
|
349
375
|
|
|
350
376
|
return rooms;
|
|
@@ -357,11 +383,11 @@ class NotifierController {
|
|
|
357
383
|
* @param {DocumentChanges} document
|
|
358
384
|
* @returns {Promise.<Array>} returns an empty array ("no room match anymore")
|
|
359
385
|
*/
|
|
360
|
-
async notifyDocumentDelete
|
|
386
|
+
async notifyDocumentDelete(request, document) {
|
|
361
387
|
const rooms = this._test(request, document._source, document._id);
|
|
362
388
|
|
|
363
389
|
if (rooms.length > 0) {
|
|
364
|
-
await this.notifyDocument(rooms, request,
|
|
390
|
+
await this.notifyDocument(rooms, request, "out", "delete", document);
|
|
365
391
|
}
|
|
366
392
|
|
|
367
393
|
return [];
|
|
@@ -379,20 +405,31 @@ class NotifierController {
|
|
|
379
405
|
*
|
|
380
406
|
* @returns {Promise}
|
|
381
407
|
*/
|
|
382
|
-
async _dispatch
|
|
408
|
+
async _dispatch(event, channels, notification, connectionId) {
|
|
383
409
|
try {
|
|
384
410
|
let updated = await global.kuzzle.pipe(event, notification);
|
|
385
|
-
|
|
411
|
+
/**
|
|
412
|
+
* @deprecated Should be replaced by `core:realtime:notification:dispatch`
|
|
413
|
+
*/
|
|
414
|
+
updated = await global.kuzzle.pipe("notify:dispatch", updated);
|
|
415
|
+
|
|
416
|
+
const updatedInfo = await global.kuzzle.pipe(
|
|
417
|
+
"core:realtime:notification:dispatch:before",
|
|
418
|
+
{
|
|
419
|
+
channels: channels,
|
|
420
|
+
connectionId: connectionId,
|
|
421
|
+
notification: updated,
|
|
422
|
+
}
|
|
423
|
+
);
|
|
386
424
|
|
|
387
|
-
const action = connectionId ?
|
|
425
|
+
const action = updatedInfo.connectionId ? "notify" : "broadcast";
|
|
388
426
|
|
|
389
427
|
global.kuzzle.entryPoint.dispatch(action, {
|
|
390
|
-
channels,
|
|
391
|
-
connectionId,
|
|
392
|
-
payload:
|
|
428
|
+
channels: updatedInfo.channels,
|
|
429
|
+
connectionId: updatedInfo.connectionId,
|
|
430
|
+
payload: updatedInfo.notification,
|
|
393
431
|
});
|
|
394
|
-
}
|
|
395
|
-
catch (error) {
|
|
432
|
+
} catch (error) {
|
|
396
433
|
global.kuzzle.log.error(error);
|
|
397
434
|
}
|
|
398
435
|
}
|
|
@@ -414,7 +451,7 @@ class NotifierController {
|
|
|
414
451
|
*
|
|
415
452
|
* @returns {Promise}
|
|
416
453
|
*/
|
|
417
|
-
_notifyDocument
|
|
454
|
+
_notifyDocument(rooms, notification, { fromCluster = true } = {}) {
|
|
418
455
|
const channels = [];
|
|
419
456
|
|
|
420
457
|
for (const room of rooms) {
|
|
@@ -426,8 +463,8 @@ class NotifierController {
|
|
|
426
463
|
|
|
427
464
|
for (const [channelId, channel] of hotelClerkRoom.channels.entries()) {
|
|
428
465
|
const executeOnNode = fromCluster ? channel.cluster : true;
|
|
429
|
-
const matchScope =
|
|
430
|
-
|| channel.scope === notification.scope;
|
|
466
|
+
const matchScope =
|
|
467
|
+
channel.scope === "all" || channel.scope === notification.scope;
|
|
431
468
|
|
|
432
469
|
if (matchScope && executeOnNode) {
|
|
433
470
|
channels.push(channelId);
|
|
@@ -439,7 +476,7 @@ class NotifierController {
|
|
|
439
476
|
return Bluebird.resolve();
|
|
440
477
|
}
|
|
441
478
|
|
|
442
|
-
return this._dispatch(
|
|
479
|
+
return this._dispatch("notify:document", channels, notification);
|
|
443
480
|
}
|
|
444
481
|
|
|
445
482
|
/**
|
|
@@ -452,14 +489,14 @@ class NotifierController {
|
|
|
452
489
|
*
|
|
453
490
|
* @returns {Promise}
|
|
454
491
|
*/
|
|
455
|
-
_notifyUser
|
|
492
|
+
_notifyUser(room, notification, { fromCluster = true } = {}) {
|
|
456
493
|
const channels = [];
|
|
457
494
|
const hotelClerkRoom = this.module.hotelClerk.rooms.get(room);
|
|
458
495
|
|
|
459
496
|
if (hotelClerkRoom !== undefined) {
|
|
460
497
|
for (const [id, channel] of hotelClerkRoom.channels.entries()) {
|
|
461
|
-
const match =
|
|
462
|
-
|| channel.users === notification.user;
|
|
498
|
+
const match =
|
|
499
|
+
channel.users === "all" || channel.users === notification.user;
|
|
463
500
|
const executeOnNode = fromCluster ? channel.cluster : true;
|
|
464
501
|
|
|
465
502
|
if (executeOnNode && match) {
|
|
@@ -472,7 +509,7 @@ class NotifierController {
|
|
|
472
509
|
return Bluebird.resolve();
|
|
473
510
|
}
|
|
474
511
|
|
|
475
|
-
return this._dispatch(
|
|
512
|
+
return this._dispatch("notify:user", channels, notification);
|
|
476
513
|
}
|
|
477
514
|
|
|
478
515
|
/**
|
|
@@ -483,17 +520,18 @@ class NotifierController {
|
|
|
483
520
|
*
|
|
484
521
|
* @returns {Array.<string>}
|
|
485
522
|
*/
|
|
486
|
-
_test
|
|
523
|
+
_test(request, source = null, id = null) {
|
|
487
524
|
return koncordeTest(
|
|
488
525
|
global.kuzzle.koncorde,
|
|
489
526
|
request.input.args.index,
|
|
490
527
|
request.input.args.collection,
|
|
491
528
|
source || request.input.body || {},
|
|
492
|
-
id || request.input.args._id
|
|
529
|
+
id || request.input.args._id
|
|
530
|
+
);
|
|
493
531
|
}
|
|
494
532
|
}
|
|
495
533
|
|
|
496
|
-
function getCachePrefix
|
|
534
|
+
function getCachePrefix(request) {
|
|
497
535
|
// use redis key hash tag
|
|
498
536
|
// (see https://redis.io/topics/cluster-spec#keys-distribution-model)
|
|
499
537
|
return `{notif/${request.input.args.index}/${request.input.args.collection}}/`;
|
|
@@ -19,16 +19,16 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const RoleRepository = require(
|
|
25
|
-
const { ProfileRepository } = require(
|
|
26
|
-
const TokenRepository = require(
|
|
27
|
-
const UserRepository = require(
|
|
28
|
-
const SecurityLoader = require(
|
|
24
|
+
const RoleRepository = require("./roleRepository");
|
|
25
|
+
const { ProfileRepository } = require("./profileRepository");
|
|
26
|
+
const TokenRepository = require("./tokenRepository");
|
|
27
|
+
const UserRepository = require("./userRepository");
|
|
28
|
+
const SecurityLoader = require("./securityLoader");
|
|
29
29
|
|
|
30
30
|
class SecurityModule {
|
|
31
|
-
constructor
|
|
31
|
+
constructor() {
|
|
32
32
|
this.role = new RoleRepository(this);
|
|
33
33
|
this.profile = new ProfileRepository(this);
|
|
34
34
|
this.token = new TokenRepository();
|
|
@@ -36,7 +36,7 @@ class SecurityModule {
|
|
|
36
36
|
this.loader = new SecurityLoader();
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
async init
|
|
39
|
+
async init() {
|
|
40
40
|
await this.role.init();
|
|
41
41
|
await this.profile.init();
|
|
42
42
|
await this.token.init();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <reference types="lodash" />
|
|
2
|
-
import { Profile } from
|
|
3
|
-
import Repository from
|
|
4
|
-
import { JSONObject } from
|
|
2
|
+
import { Profile } from "../../model/security/profile";
|
|
3
|
+
import Repository from "../shared/repository";
|
|
4
|
+
import { JSONObject } from "kuzzle-sdk";
|
|
5
5
|
/** @internal */
|
|
6
6
|
declare type CreateOrReplaceOptions = {
|
|
7
7
|
method?: string;
|
|
@@ -70,7 +70,7 @@ export declare class ProfileRepository extends Repository {
|
|
|
70
70
|
* @param {Object} [opts]
|
|
71
71
|
* @returns {Profile}
|
|
72
72
|
*/
|
|
73
|
-
_createOrReplace(id: string, content: JSONObject, { method, refresh, strict, userId }?: CreateOrReplaceOptions): Promise<Profile>;
|
|
73
|
+
_createOrReplace(id: string, content: JSONObject, { method, refresh, strict, userId, }?: CreateOrReplaceOptions): Promise<Profile>;
|
|
74
74
|
/**
|
|
75
75
|
* Creates a new profile
|
|
76
76
|
*
|
|
@@ -108,7 +108,7 @@ export declare class ProfileRepository extends Repository {
|
|
|
108
108
|
/**
|
|
109
109
|
* @override
|
|
110
110
|
*/
|
|
111
|
-
delete(profile: Profile, { refresh, onAssignedUsers, userId
|
|
111
|
+
delete(profile: Profile, { refresh, onAssignedUsers, userId }?: {
|
|
112
112
|
refresh?: string;
|
|
113
113
|
onAssignedUsers?: string;
|
|
114
114
|
userId?: string;
|
|
@@ -134,7 +134,7 @@ export declare class ProfileRepository extends Repository {
|
|
|
134
134
|
* applied on existing indexes/collections
|
|
135
135
|
* @returns {Promise<Profile>}
|
|
136
136
|
**/
|
|
137
|
-
validateAndSaveProfile(profile: Profile, { method, refresh, retryOnConflict, strict }?: ValidateAndSaveProfileOptions): Promise<Profile>;
|
|
137
|
+
validateAndSaveProfile(profile: Profile, { method, refresh, retryOnConflict, strict, }?: ValidateAndSaveProfileOptions): Promise<Profile>;
|
|
138
138
|
/**
|
|
139
139
|
* @param {object} dto
|
|
140
140
|
* @returns {Promise<Profile>}
|