kuzzle 2.56.0 → 2.57.0-beta.2
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/dist/bin/copy-binaries.js +71 -4
- package/dist/bin/start-kuzzle-server +191 -97
- package/dist/index.d.ts +31 -1
- package/dist/index.js +45 -2
- package/dist/lib/api/controllers/adminController.d.ts +4 -3
- package/dist/lib/api/controllers/adminController.js +1 -2
- package/dist/lib/api/controllers/authController.d.ts +37 -16
- package/dist/lib/api/controllers/authController.js +88 -39
- package/dist/lib/api/controllers/baseController.d.ts +10 -5
- package/dist/lib/api/controllers/baseController.js +36 -15
- package/dist/lib/api/controllers/bulkController.d.ts +11 -7
- package/dist/lib/api/controllers/bulkController.js +28 -5
- package/dist/lib/api/controllers/clusterController.d.ts +2 -2
- package/dist/lib/api/controllers/clusterController.js +3 -3
- package/dist/lib/api/controllers/collectionController.d.ts +57 -21
- package/dist/lib/api/controllers/collectionController.js +40 -11
- package/dist/lib/api/controllers/debugController.d.ts +1 -1
- package/dist/lib/api/controllers/documentController.d.ts +137 -28
- package/dist/lib/api/controllers/documentController.js +156 -125
- package/dist/lib/api/controllers/index.d.ts +27 -12
- package/dist/lib/api/controllers/index.js +28 -13
- package/dist/lib/api/controllers/indexController.d.ts +17 -10
- package/dist/lib/api/controllers/indexController.js +13 -11
- package/dist/lib/api/controllers/memoryStorageController.d.ts +2 -5
- package/dist/lib/api/controllers/memoryStorageController.js +199 -127
- package/dist/lib/api/controllers/realtimeController.d.ts +19 -9
- package/dist/lib/api/controllers/realtimeController.js +8 -4
- package/dist/lib/api/controllers/securityController.d.ts +42 -29
- package/dist/lib/api/controllers/securityController.js +35 -19
- package/dist/lib/api/controllers/serverController.d.ts +114 -19
- package/dist/lib/api/controllers/serverController.js +69 -29
- package/dist/lib/api/documentExtractor.d.ts +9 -7
- package/dist/lib/api/documentExtractor.js +105 -41
- package/dist/lib/api/funnel.d.ts +131 -29
- package/dist/lib/api/funnel.js +436 -225
- package/dist/lib/api/httpRoutes.d.ts +16 -11
- package/dist/lib/api/httpRoutes.js +272 -2
- package/dist/lib/api/openapi/OpenApiManager.d.ts +1 -1
- package/dist/lib/api/openapi/openApiGenerator.d.ts +1 -1
- package/dist/lib/api/rateLimiter.d.ts +15 -5
- package/dist/lib/api/rateLimiter.js +42 -14
- package/dist/lib/api/request/kuzzleRequest.d.ts +83 -12
- package/dist/lib/api/request/kuzzleRequest.js +88 -23
- package/dist/lib/api/request/requestContext.d.ts +20 -5
- package/dist/lib/api/request/requestContext.js +14 -4
- package/dist/lib/api/request/requestInput.d.ts +37 -6
- package/dist/lib/api/request/requestInput.js +22 -9
- package/dist/lib/api/request/requestResponse.d.ts +45 -9
- package/dist/lib/api/request/requestResponse.js +34 -3
- package/dist/lib/cluster/command.d.ts +131 -37
- package/dist/lib/cluster/command.js +243 -71
- package/dist/lib/cluster/idCardHandler.d.ts +18 -5
- package/dist/lib/cluster/idCardHandler.js +52 -19
- package/dist/lib/cluster/index.d.ts +8 -2
- package/dist/lib/cluster/index.js +6 -2
- package/dist/lib/cluster/node.d.ts +127 -49
- package/dist/lib/cluster/node.js +412 -179
- package/dist/lib/cluster/protobuf/command.proto +18 -0
- package/dist/lib/cluster/protobuf/commandMessages.d.ts +104 -0
- package/dist/lib/cluster/protobuf/commandMessages.js +30 -0
- package/dist/lib/cluster/protobuf/syncMessages.d.ts +184 -0
- package/dist/lib/cluster/protobuf/syncMessages.js +23 -0
- package/dist/lib/cluster/publisher.d.ts +118 -78
- package/dist/lib/cluster/publisher.js +174 -72
- package/dist/lib/cluster/state.d.ts +15 -9
- package/dist/lib/cluster/state.js +12 -8
- package/dist/lib/cluster/subscriber.d.ts +185 -131
- package/dist/lib/cluster/subscriber.js +357 -95
- package/dist/lib/cluster/workers/IDCardRenewer.d.ts +39 -8
- package/dist/lib/cluster/workers/IDCardRenewer.js +88 -23
- package/dist/lib/config/default.config.d.ts +2 -2
- package/dist/lib/config/default.config.js +10 -3
- package/dist/lib/config/documentEventAliases.d.ts +1 -1
- package/dist/lib/config/index.d.ts +2 -5
- package/dist/lib/config/index.js +30 -17
- package/dist/lib/core/auth/formatProcessing.d.ts +3 -3
- package/dist/lib/core/auth/passportResponse.d.ts +1 -1
- package/dist/lib/core/auth/passportWrapper.d.ts +1 -1
- package/dist/lib/core/auth/passportWrapper.js +14 -13
- package/dist/lib/core/auth/tokenManager.d.ts +24 -3
- package/dist/lib/core/auth/tokenManager.js +47 -19
- package/dist/lib/core/backend/applicationManager.d.ts +2 -2
- package/dist/lib/core/backend/backend.d.ts +16 -5
- package/dist/lib/core/backend/backend.js +14 -6
- package/dist/lib/core/backend/backendCluster.d.ts +1 -1
- package/dist/lib/core/backend/backendConfig.d.ts +17 -5
- package/dist/lib/core/backend/backendConfig.js +1 -0
- package/dist/lib/core/backend/backendController.d.ts +1 -1
- package/dist/lib/core/backend/backendController.js +8 -1
- package/dist/lib/core/backend/backendErrors.d.ts +15 -8
- package/dist/lib/core/backend/backendErrors.js +5 -0
- package/dist/lib/core/backend/backendHook.d.ts +1 -1
- package/dist/lib/core/backend/backendImport.d.ts +1 -1
- package/dist/lib/core/backend/backendOpenApi.d.ts +3 -2
- package/dist/lib/core/backend/backendPipe.d.ts +1 -1
- package/dist/lib/core/backend/backendPipe.js +9 -1
- package/dist/lib/core/backend/backendPlugin.d.ts +2 -2
- package/dist/lib/core/backend/backendSubscription.d.ts +2 -2
- package/dist/lib/core/backend/backendVault.d.ts +1 -1
- package/dist/lib/core/backend/backendVault.js +8 -1
- package/dist/lib/core/cache/cacheEngine.d.ts +7 -4
- package/dist/lib/core/cache/cacheEngine.js +25 -8
- package/dist/lib/core/debug/kuzzleDebugger.d.ts +2 -1
- package/dist/lib/core/debug/kuzzleDebugger.js +31 -17
- package/dist/lib/core/network/accessLogger.d.ts +33 -18
- package/dist/lib/core/network/accessLogger.js +135 -73
- package/dist/lib/core/network/clientConnection.d.ts +13 -11
- package/dist/lib/core/network/clientConnection.js +33 -9
- package/dist/lib/core/network/context.d.ts +17 -22
- package/dist/lib/core/network/context.js +43 -26
- package/dist/lib/core/network/entryPoint.d.ts +38 -16
- package/dist/lib/core/network/entryPoint.js +119 -48
- package/dist/lib/core/network/httpRouter/index.d.ts +20 -50
- package/dist/lib/core/network/httpRouter/index.js +61 -75
- package/dist/lib/core/network/httpRouter/routeHandler.d.ts +17 -32
- package/dist/lib/core/network/httpRouter/routeHandler.js +26 -36
- package/dist/lib/core/network/httpRouter/routePart.d.ts +9 -18
- package/dist/lib/core/network/httpRouter/routePart.js +61 -43
- package/dist/lib/core/network/httpRouter/routeTypes.d.ts +3 -0
- package/dist/lib/core/network/httpRouter/routeTypes.js +23 -0
- package/dist/lib/core/network/networkEntryPoint.d.ts +20 -0
- package/dist/lib/core/network/networkEntryPoint.js +23 -0
- package/dist/lib/core/network/protocolManifest.d.ts +5 -4
- package/dist/lib/core/network/protocolManifest.js +6 -3
- package/dist/lib/core/network/protocols/httpMessage.d.ts +25 -18
- package/dist/lib/core/network/protocols/httpMessage.js +14 -11
- package/dist/lib/core/network/protocols/httpwsProtocol.d.ts +84 -93
- package/dist/lib/core/network/protocols/httpwsProtocol.js +284 -129
- package/dist/lib/core/network/protocols/internalProtocol.d.ts +26 -15
- package/dist/lib/core/network/protocols/internalProtocol.js +17 -16
- package/dist/lib/core/network/protocols/mqttProtocol.d.ts +56 -32
- package/dist/lib/core/network/protocols/mqttProtocol.js +91 -44
- package/dist/lib/core/network/protocols/protocol.d.ts +85 -21
- package/dist/lib/core/network/protocols/protocol.js +83 -27
- package/dist/lib/core/network/router.d.ts +13 -22
- package/dist/lib/core/network/router.js +59 -46
- package/dist/lib/core/plugin/plugin.d.ts +57 -51
- package/dist/lib/core/plugin/plugin.js +218 -103
- package/dist/lib/core/plugin/pluginContext.d.ts +54 -11
- package/dist/lib/core/plugin/pluginContext.js +99 -58
- package/dist/lib/core/plugin/pluginManifest.d.ts +6 -2
- package/dist/lib/core/plugin/pluginManifest.js +18 -11
- package/dist/lib/core/plugin/pluginRepository.d.ts +35 -44
- package/dist/lib/core/plugin/pluginRepository.js +35 -50
- package/dist/lib/core/plugin/pluginsManager.d.ts +128 -46
- package/dist/lib/core/plugin/pluginsManager.js +468 -231
- package/dist/lib/core/plugin/privilegedContext.d.ts +4 -9
- package/dist/lib/core/plugin/privilegedContext.js +5 -10
- package/dist/lib/core/realtime/actionEnum.d.ts +12 -21
- package/dist/lib/core/realtime/actionEnum.js +6 -7
- package/dist/lib/core/realtime/channel.d.ts +11 -5
- package/dist/lib/core/realtime/channel.js +17 -2
- package/dist/lib/core/realtime/connectionRooms.d.ts +2 -2
- package/dist/lib/core/realtime/hotelClerk.d.ts +12 -6
- package/dist/lib/core/realtime/hotelClerk.js +29 -11
- package/dist/lib/core/realtime/index.d.ts +8 -3
- package/dist/lib/core/realtime/index.js +12 -5
- package/dist/lib/core/realtime/notification/document.d.ts +54 -25
- package/dist/lib/core/realtime/notification/document.js +10 -13
- package/dist/lib/core/realtime/notification/index.d.ts +9 -3
- package/dist/lib/core/realtime/notification/index.js +10 -4
- package/dist/lib/core/realtime/notification/server.d.ts +7 -10
- package/dist/lib/core/realtime/notification/server.js +4 -7
- package/dist/lib/core/realtime/notification/user.d.ts +45 -21
- package/dist/lib/core/realtime/notification/user.js +8 -9
- package/dist/lib/core/realtime/notifier.d.ts +52 -40
- package/dist/lib/core/realtime/notifier.js +60 -25
- package/dist/lib/core/realtime/room.d.ts +1 -1
- package/dist/lib/core/realtime/subscription.d.ts +11 -6
- package/dist/lib/core/realtime/subscription.js +5 -1
- package/dist/lib/core/security/index.d.ts +14 -6
- package/dist/lib/core/security/index.js +27 -13
- package/dist/lib/core/security/profileRepository.d.ts +24 -19
- package/dist/lib/core/security/profileRepository.js +23 -10
- package/dist/lib/core/security/roleRepository.d.ts +60 -23
- package/dist/lib/core/security/roleRepository.js +122 -53
- package/dist/lib/core/security/securityLoader.d.ts +33 -18
- package/dist/lib/core/security/securityLoader.js +43 -16
- package/dist/lib/core/security/tokenRepository.d.ts +21 -7
- package/dist/lib/core/security/tokenRepository.js +50 -23
- package/dist/lib/core/security/userRepository.d.ts +44 -21
- package/dist/lib/core/security/userRepository.js +59 -19
- package/dist/lib/core/shared/KoncordeWrapper.d.ts +1 -1
- package/dist/lib/core/shared/ObjectRepository.d.ts +80 -18
- package/dist/lib/core/shared/ObjectRepository.js +57 -29
- package/dist/lib/core/shared/abstractManifest.d.ts +21 -8
- package/dist/lib/core/shared/abstractManifest.js +57 -17
- package/dist/lib/core/shared/sdk/embeddedSdk.d.ts +3 -1
- package/dist/lib/core/shared/sdk/embeddedSdk.js +8 -7
- package/dist/lib/core/shared/sdk/funnelProtocol.d.ts +2 -1
- package/dist/lib/core/shared/sdk/funnelProtocol.js +12 -3
- package/dist/lib/core/shared/sdk/impersonatedSdk.d.ts +11 -5
- package/dist/lib/core/shared/sdk/impersonatedSdk.js +22 -9
- package/dist/lib/core/shared/store.d.ts +45 -29
- package/dist/lib/core/shared/store.js +48 -27
- package/dist/lib/core/statistics/statistics.d.ts +1 -1
- package/dist/lib/core/storage/clientAdapter.d.ts +39 -21
- package/dist/lib/core/storage/clientAdapter.js +88 -48
- package/dist/lib/core/storage/indexCache.d.ts +8 -0
- package/dist/lib/core/storage/indexCache.js +16 -7
- package/dist/lib/core/storage/storageEngine.d.ts +7 -6
- package/dist/lib/core/storage/storageEngine.js +11 -8
- package/dist/lib/core/validation/baseType.d.ts +22 -22
- package/dist/lib/core/validation/baseType.js +11 -26
- package/dist/lib/core/validation/specification.d.ts +148 -0
- package/dist/lib/core/validation/specification.js +34 -0
- package/dist/lib/core/validation/typeOptions.d.ts +62 -0
- package/dist/lib/core/validation/typeOptions.js +23 -0
- package/dist/lib/core/validation/types/anything.d.ts +3 -6
- package/dist/lib/core/validation/types/anything.js +7 -7
- package/dist/lib/core/validation/types/boolean.d.ts +5 -12
- package/dist/lib/core/validation/types/boolean.js +7 -12
- package/dist/lib/core/validation/types/date.d.ts +19 -11
- package/dist/lib/core/validation/types/date.js +212 -161
- package/dist/lib/core/validation/types/email.d.ts +7 -11
- package/dist/lib/core/validation/types/email.js +13 -17
- package/dist/lib/core/validation/types/enum.d.ts +7 -11
- package/dist/lib/core/validation/types/enum.js +39 -20
- package/dist/lib/core/validation/types/geoPoint.d.ts +5 -13
- package/dist/lib/core/validation/types/geoPoint.js +10 -15
- package/dist/lib/core/validation/types/geoShape.d.ts +22 -21
- package/dist/lib/core/validation/types/geoShape.js +113 -129
- package/dist/lib/core/validation/types/geoShapeUtils.d.ts +15 -0
- package/dist/lib/core/validation/types/geoShapeUtils.js +75 -0
- package/dist/lib/core/validation/types/integer.d.ts +7 -5
- package/dist/lib/core/validation/types/integer.js +7 -13
- package/dist/lib/core/validation/types/ipAddress.d.ts +7 -11
- package/dist/lib/core/validation/types/ipAddress.js +13 -17
- package/dist/lib/core/validation/types/numeric.d.ts +7 -11
- package/dist/lib/core/validation/types/numeric.js +22 -29
- package/dist/lib/core/validation/types/object.d.ts +8 -15
- package/dist/lib/core/validation/types/object.js +12 -21
- package/dist/lib/core/validation/types/string.d.ts +7 -11
- package/dist/lib/core/validation/types/string.js +22 -29
- package/dist/lib/core/validation/types/url.d.ts +7 -11
- package/dist/lib/core/validation/types/url.js +14 -18
- package/dist/lib/core/validation/validation.d.ts +119 -80
- package/dist/lib/core/validation/validation.js +470 -412
- package/dist/lib/core/validation/validationUtils.d.ts +31 -0
- package/dist/lib/core/validation/validationUtils.js +190 -0
- package/dist/lib/kerror/codes/4-plugin.json +0 -12
- package/dist/lib/kerror/codes/index.d.ts +12 -2
- package/dist/lib/kerror/codes/index.js +5 -4
- package/dist/lib/kerror/errors/badRequestError.d.ts +1 -1
- package/dist/lib/kerror/errors/badRequestError.js +1 -1
- package/dist/lib/kerror/errors/externalServiceError.d.ts +1 -1
- package/dist/lib/kerror/errors/externalServiceError.js +1 -1
- package/dist/lib/kerror/errors/forbiddenError.d.ts +1 -1
- package/dist/lib/kerror/errors/forbiddenError.js +1 -1
- package/dist/lib/kerror/errors/gatewayTimeoutError.d.ts +1 -1
- package/dist/lib/kerror/errors/gatewayTimeoutError.js +1 -1
- package/dist/lib/kerror/errors/internalError.d.ts +1 -1
- package/dist/lib/kerror/errors/internalError.js +1 -1
- package/dist/lib/kerror/errors/kuzzleError.d.ts +32 -3
- package/dist/lib/kerror/errors/kuzzleError.js +21 -7
- package/dist/lib/kerror/errors/multipleErrorsError.d.ts +2 -2
- package/dist/lib/kerror/errors/multipleErrorsError.js +2 -2
- package/dist/lib/kerror/errors/notFoundError.d.ts +1 -1
- package/dist/lib/kerror/errors/notFoundError.js +1 -1
- package/dist/lib/kerror/errors/partialError.d.ts +8 -2
- package/dist/lib/kerror/errors/partialError.js +22 -9
- package/dist/lib/kerror/errors/pluginImplementationError.d.ts +9 -1
- package/dist/lib/kerror/errors/pluginImplementationError.js +9 -3
- package/dist/lib/kerror/errors/preconditionError.d.ts +1 -1
- package/dist/lib/kerror/errors/preconditionError.js +1 -1
- package/dist/lib/kerror/errors/serviceUnavailableError.d.ts +1 -1
- package/dist/lib/kerror/errors/serviceUnavailableError.js +1 -1
- package/dist/lib/kerror/errors/sizeLimitError.d.ts +1 -1
- package/dist/lib/kerror/errors/sizeLimitError.js +1 -1
- package/dist/lib/kerror/errors/tooManyRequestsError.d.ts +1 -1
- package/dist/lib/kerror/errors/tooManyRequestsError.js +1 -1
- package/dist/lib/kerror/errors/unauthorizedError.d.ts +1 -1
- package/dist/lib/kerror/errors/unauthorizedError.js +1 -1
- package/dist/lib/kerror/index.d.ts +19 -13
- package/dist/lib/kerror/index.js +60 -19
- package/dist/lib/kuzzle/Logger.d.ts +2 -2
- package/dist/lib/kuzzle/dumpGenerator.d.ts +12 -8
- package/dist/lib/kuzzle/dumpGenerator.js +130 -62
- package/dist/lib/kuzzle/event/KuzzleEventEmitter.d.ts +18 -9
- package/dist/lib/kuzzle/event/KuzzleEventEmitter.js +45 -18
- package/dist/lib/kuzzle/event/pipeRunner.d.ts +37 -16
- package/dist/lib/kuzzle/event/pipeRunner.js +73 -26
- package/dist/lib/kuzzle/event/waterfall.d.ts +11 -1
- package/dist/lib/kuzzle/event/waterfall.js +38 -13
- package/dist/lib/kuzzle/internalIndexHandler.d.ts +11 -174
- package/dist/lib/kuzzle/internalIndexHandler.js +58 -29
- package/dist/lib/kuzzle/kuzzle.d.ts +25 -10
- package/dist/lib/kuzzle/kuzzle.js +74 -17
- package/dist/lib/kuzzle/kuzzleStateEnum.d.ts +16 -12
- package/dist/lib/kuzzle/kuzzleStateEnum.js +5 -7
- package/dist/lib/kuzzle/vault.d.ts +5 -1
- package/dist/lib/kuzzle/vault.js +29 -17
- package/dist/lib/model/security/profile.d.ts +34 -5
- package/dist/lib/model/security/profile.js +6 -5
- package/dist/lib/model/security/rights.d.ts +12 -4
- package/dist/lib/model/security/rights.js +7 -6
- package/dist/lib/model/security/role.d.ts +8 -4
- package/dist/lib/model/security/role.js +12 -6
- package/dist/lib/model/security/token.d.ts +8 -0
- package/dist/lib/model/security/user.d.ts +8 -2
- package/dist/lib/model/security/user.js +7 -4
- package/dist/lib/model/storage/apiKey.d.ts +55 -26
- package/dist/lib/model/storage/apiKey.js +97 -24
- package/dist/lib/model/storage/baseModel.d.ts +77 -66
- package/dist/lib/model/storage/baseModel.js +21 -34
- package/dist/lib/service/cache/redis.d.ts +53 -36
- package/dist/lib/service/cache/redis.js +148 -71
- package/dist/lib/service/service.d.ts +14 -19
- package/dist/lib/service/service.js +41 -22
- package/dist/lib/service/storage/7/elasticsearch.d.ts +136 -93
- package/dist/lib/service/storage/7/elasticsearch.js +218 -165
- package/dist/lib/service/storage/7/esWrapper.d.ts +30 -13
- package/dist/lib/service/storage/7/esWrapper.js +58 -37
- package/dist/lib/service/storage/8/elasticsearch.d.ts +153 -119
- package/dist/lib/service/storage/8/elasticsearch.js +286 -213
- package/dist/lib/service/storage/8/esWrapper.d.ts +30 -13
- package/dist/lib/service/storage/8/esWrapper.js +59 -38
- package/dist/lib/service/storage/commons/queryTranslator.d.ts +3 -3
- package/dist/lib/service/storage/commons/queryTranslator.js +71 -35
- package/dist/lib/types/ApiRoute.d.ts +12 -0
- package/dist/lib/types/ApiRoute.js +23 -0
- package/dist/lib/types/ClientConnection.d.ts +1 -1
- package/dist/lib/types/EventHandler.d.ts +10 -0
- package/dist/lib/types/Global.d.ts +8 -3
- package/dist/lib/types/HttpMessage.d.ts +2 -2
- package/dist/lib/types/HttpStream.d.ts +1 -1
- package/dist/lib/types/HttpStream.js +3 -1
- package/dist/lib/types/JSONObject.d.ts +9 -0
- package/dist/lib/types/JSONObject.js +23 -0
- package/dist/lib/types/Kuzzle.d.ts +5 -3
- package/dist/lib/types/KuzzleDocument.d.ts +1 -1
- package/dist/lib/types/KuzzleWebSocket.d.ts +24 -0
- package/dist/lib/types/KuzzleWebSocket.js +23 -0
- package/dist/lib/types/OpenApiDefinition.d.ts +1 -1
- package/dist/lib/types/Plugin.d.ts +33 -8
- package/dist/lib/types/PluginInstance.d.ts +67 -0
- package/dist/lib/types/PluginInstance.js +23 -0
- package/dist/lib/types/Policy.d.ts +1 -1
- package/dist/lib/types/Target.d.ts +8 -0
- package/dist/lib/types/Token.d.ts +14 -2
- package/dist/lib/types/config/HttpConfiguration.d.ts +5 -0
- package/dist/lib/types/config/KuzzleConfiguration.d.ts +102 -1
- package/dist/lib/types/config/PluginsConfiguration.d.ts +3 -2
- package/dist/lib/types/config/SecurityConfiguration.d.ts +6 -2
- package/dist/lib/types/config/ServerConfiguration.d.ts +2 -2
- package/dist/lib/types/config/ServicesConfiguration.d.ts +1 -1
- package/dist/lib/types/config/cache/BaseCacheRedisConfiguration.d.ts +131 -0
- package/dist/lib/types/config/cache/BaseCacheRedisConfiguration.js +3 -0
- package/dist/lib/types/config/internalCache/InternalCacheRedisConfiguration.d.ts +2 -106
- package/dist/lib/types/config/publicCache/PublicCacheRedisConfiguration.d.ts +2 -26
- package/dist/lib/types/config/storageEngine/StorageEngineElasticsearchConfiguration.d.ts +3 -0
- package/dist/lib/types/controllers/Controller.d.ts +12 -3
- package/dist/lib/types/controllers/ControllerDefinition.d.ts +2 -2
- package/dist/lib/types/controllers/{adminControlller.type.js → adminController.type.js} +1 -1
- package/dist/lib/types/controllers/authController.type.d.ts +2 -2
- package/dist/lib/types/core/auth/formatProcessing.type.d.ts +7 -1
- package/dist/lib/types/errors/ErrorDomains.d.ts +1 -1
- package/dist/lib/types/events/EventGenericDocument.d.ts +10 -9
- package/dist/lib/types/events/EventProtocol.d.ts +4 -4
- package/dist/lib/types/index.d.ts +7 -0
- package/dist/lib/types/index.js +7 -0
- package/dist/lib/types/shared/StoreCollectionsDefinition.d.ts +1 -1
- package/dist/lib/types/storage/7/Elasticsearch.d.ts +62 -13
- package/dist/lib/types/storage/8/Elasticsearch.d.ts +62 -13
- package/dist/lib/util/Inflector.d.ts +4 -1
- package/dist/lib/util/Inflector.js +0 -3
- package/dist/lib/util/assertType.d.ts +24 -27
- package/dist/lib/util/assertType.js +28 -39
- package/dist/lib/util/async.js +19 -6
- package/dist/lib/util/asyncStore.js +1 -1
- package/dist/lib/util/bufferedPassThrough.d.ts +9 -0
- package/dist/lib/util/bufferedPassThrough.js +27 -13
- package/dist/lib/util/bytes.d.ts +1 -1
- package/dist/lib/util/bytes.js +6 -2
- package/dist/lib/util/debug.d.ts +3 -1
- package/dist/lib/util/debug.js +42 -10
- package/dist/lib/util/deprecate.d.ts +9 -1
- package/dist/lib/util/deprecate.js +10 -6
- package/dist/lib/util/didYouMean.d.ts +2 -1
- package/dist/lib/util/didYouMean.js +8 -4
- package/dist/lib/util/distributedLock.d.ts +56 -0
- package/dist/lib/util/distributedLock.js +166 -0
- package/dist/lib/util/dump-collection.d.ts +1 -1
- package/dist/lib/util/dump-collection.js +4 -5
- package/dist/lib/util/extractFields.d.ts +15 -11
- package/dist/lib/util/extractFields.js +8 -9
- package/dist/lib/util/koncordeCompat.d.ts +2 -2
- package/dist/lib/util/koncordeCompat.js +33 -0
- package/dist/lib/util/memoize.d.ts +7 -6
- package/dist/lib/util/memoize.js +3 -3
- package/dist/lib/util/mutex.d.ts +22 -2
- package/dist/lib/util/mutex.js +39 -1
- package/dist/lib/util/name-generator.js +14 -2
- package/dist/lib/util/promback.d.ts +20 -11
- package/dist/lib/util/promback.js +14 -7
- package/dist/lib/util/requestAssertions.d.ts +30 -10
- package/dist/lib/util/requestAssertions.js +125 -121
- package/dist/lib/util/safeObject.d.ts +3 -3
- package/dist/lib/util/safeObject.js +7 -3
- package/dist/lib/util/stackTrace.d.ts +13 -5
- package/dist/lib/util/stackTrace.js +17 -12
- package/dist/lib/util/thrown.d.ts +13 -0
- package/dist/lib/util/thrown.js +46 -0
- package/dist/package.json +26 -19
- package/package.json +26 -19
- package/dist/lib/util/wildcard.d.ts +0 -1
- package/dist/lib/util/wildcard.js +0 -46
- /package/dist/lib/types/controllers/{adminControlller.type.d.ts → adminController.type.d.ts} +0 -0
|
@@ -29,6 +29,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
29
29
|
exports.KuzzleDebugger = void 0;
|
|
30
30
|
const inspector_1 = __importDefault(require("inspector"));
|
|
31
31
|
const kerror = __importStar(require("../../kerror"));
|
|
32
|
+
/**
|
|
33
|
+
* A declared narrowing, not an assertion: `entryPoint.protocols` is typed by
|
|
34
|
+
* the base `Protocol`, and this is what makes the one member the debugger uses
|
|
35
|
+
* reachable without an `as`.
|
|
36
|
+
*/
|
|
37
|
+
function isSocketRegistry(protocol) {
|
|
38
|
+
return (typeof protocol === "object" &&
|
|
39
|
+
protocol !== null &&
|
|
40
|
+
"socketByConnectionId" in protocol &&
|
|
41
|
+
protocol.socketByConnectionId instanceof Map);
|
|
42
|
+
}
|
|
32
43
|
const DEBUGGER_EVENT = "kuzzle-debugger-event";
|
|
33
44
|
class KuzzleDebugger {
|
|
34
45
|
constructor() {
|
|
@@ -39,7 +50,11 @@ class KuzzleDebugger {
|
|
|
39
50
|
this.events = new Map();
|
|
40
51
|
}
|
|
41
52
|
async init() {
|
|
42
|
-
|
|
53
|
+
const protocol = global.kuzzle.entryPoint.protocols.get("websocket");
|
|
54
|
+
// Narrowed with `in` rather than `instanceof`: `protocols` is typed by the
|
|
55
|
+
// base class, and importing the concrete one as a *value* would add a
|
|
56
|
+
// runtime edge to the graph — the shape TD-49 spent a PR removing.
|
|
57
|
+
this.httpWsProtocol = isSocketRegistry(protocol) ? protocol : undefined;
|
|
43
58
|
this.inspector = new inspector_1.default.Session();
|
|
44
59
|
// Remove connection id from the list of listeners for each event
|
|
45
60
|
global.kuzzle.on("connection:remove", (connectionId) => {
|
|
@@ -102,8 +117,9 @@ class KuzzleDebugger {
|
|
|
102
117
|
await global.kuzzle.ask("cluster:node:preventEviction", false);
|
|
103
118
|
// Disable debug mode for all connected sockets that still have listeners
|
|
104
119
|
if (this.httpWsProtocol) {
|
|
105
|
-
|
|
106
|
-
|
|
120
|
+
// `values()`: the key was read only to index the map back with it.
|
|
121
|
+
for (const connectionIds of this.events.values()) {
|
|
122
|
+
for (const connectionId of connectionIds) {
|
|
107
123
|
const socket = this.httpWsProtocol.socketByConnectionId.get(connectionId);
|
|
108
124
|
if (socket) {
|
|
109
125
|
socket.internal.debugSession = false;
|
|
@@ -220,21 +236,19 @@ class KuzzleDebugger {
|
|
|
220
236
|
if (!this.debuggerStatus) {
|
|
221
237
|
throw kerror.get("core", "debugger", "not_enabled");
|
|
222
238
|
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
}
|
|
239
|
+
return new Promise((resolve) => {
|
|
240
|
+
this.inspector.post(method, params, (err, res) => {
|
|
241
|
+
if (err) {
|
|
242
|
+
resolve({
|
|
243
|
+
error: JSON.stringify(Object.getOwnPropertyDescriptors(err)),
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
// The inspector answers `undefined` for a method with no result.
|
|
248
|
+
resolve(res ?? {});
|
|
249
|
+
}
|
|
250
|
+
});
|
|
236
251
|
});
|
|
237
|
-
return promise;
|
|
238
252
|
}
|
|
239
253
|
/**
|
|
240
254
|
* Sends a direct notification to a websocket connection without having to listen to a specific room
|
|
@@ -1,29 +1,44 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
|
|
2
|
+
import { Worker } from "node:worker_threads";
|
|
3
|
+
import * as pino from "pino";
|
|
4
|
+
import { KuzzleRequest } from "../../api/request";
|
|
5
|
+
import type { ServerConfiguration } from "../../types";
|
|
6
|
+
import type ClientConnection from "./clientConnection";
|
|
7
|
+
/** What a protocol adds to an HTTP access log line */
|
|
8
|
+
export interface AccessLogExtra {
|
|
9
|
+
method: string;
|
|
10
|
+
url: string;
|
|
11
|
+
}
|
|
12
|
+
declare class AccessLogger {
|
|
3
13
|
isActive: boolean;
|
|
4
|
-
worker: Worker;
|
|
5
|
-
logger
|
|
14
|
+
worker: Worker | null;
|
|
15
|
+
private readonly logger;
|
|
6
16
|
init(): Promise<void>;
|
|
7
|
-
log(connection:
|
|
17
|
+
log(connection: ClientConnection, request: KuzzleRequest, extra?: AccessLogExtra | null): void;
|
|
8
18
|
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
anonymousUserId:
|
|
19
|
+
declare class AccessLoggerWorker {
|
|
20
|
+
config: ServerConfiguration;
|
|
21
|
+
private _logger;
|
|
22
|
+
anonymousUserId: string;
|
|
23
|
+
constructor(config: ServerConfiguration, anonymousUserId: string);
|
|
24
|
+
/**
|
|
25
|
+
* The pino transport, built by `initTransport()` — which `init()` calls
|
|
26
|
+
* before anything is listening. The three writes below read it unchecked.
|
|
27
|
+
*/
|
|
28
|
+
get logger(): pino.Logger;
|
|
29
|
+
set logger(logger: pino.Logger);
|
|
14
30
|
init(): void;
|
|
15
31
|
initTransport(): void;
|
|
16
32
|
/**
|
|
17
|
-
* @param
|
|
18
|
-
* @param {Request} request
|
|
19
|
-
* @param {String} size - response size, in bytes
|
|
20
|
-
* @param {Object} [extra]
|
|
33
|
+
* @param size - response size, in bytes
|
|
21
34
|
*/
|
|
22
|
-
logAccess(connection: ClientConnection, request:
|
|
35
|
+
logAccess(connection: ClientConnection, request: KuzzleRequest, size: string, extra?: AccessLogExtra | null): void;
|
|
23
36
|
/**
|
|
24
|
-
*
|
|
37
|
+
* The user the access log line is attributed to: the already decoded and
|
|
38
|
+
* verified token stored in the request is preferred; without one, we have no
|
|
39
|
+
* verified identity to report.
|
|
25
40
|
*/
|
|
26
|
-
|
|
41
|
+
private resolveUser;
|
|
42
|
+
getIP(connection: ClientConnection): string;
|
|
27
43
|
}
|
|
28
|
-
|
|
29
|
-
import pino = require("pino");
|
|
44
|
+
export { AccessLogger, AccessLoggerWorker };
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/*
|
|
2
3
|
* Kuzzle, a backend software, self-hostable and ready to use
|
|
3
4
|
* to power modern apps
|
|
@@ -18,14 +19,47 @@
|
|
|
18
19
|
* See the License for the specific language governing permissions and
|
|
19
20
|
* limitations under the License.
|
|
20
21
|
*/
|
|
21
|
-
|
|
22
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
25
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
26
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
27
|
+
}
|
|
28
|
+
Object.defineProperty(o, k2, desc);
|
|
29
|
+
}) : (function(o, m, k, k2) {
|
|
30
|
+
if (k2 === undefined) k2 = k;
|
|
31
|
+
o[k2] = m[k];
|
|
32
|
+
}));
|
|
33
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
34
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
35
|
+
}) : function(o, v) {
|
|
36
|
+
o["default"] = v;
|
|
37
|
+
});
|
|
38
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
39
|
+
if (mod && mod.__esModule) return mod;
|
|
40
|
+
var result = {};
|
|
41
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
42
|
+
__setModuleDefault(result, mod);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
46
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
47
|
+
};
|
|
48
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
+
exports.AccessLoggerWorker = exports.AccessLogger = void 0;
|
|
22
50
|
// winston is CPU-hungry: isolating it in a worker thread allows for a more
|
|
23
51
|
// efficient CPU resources management, and more performances in the end
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
-
const
|
|
52
|
+
const node_worker_threads_1 = require("node:worker_threads");
|
|
53
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
54
|
+
const moment_1 = __importDefault(require("moment"));
|
|
55
|
+
const pino = __importStar(require("pino"));
|
|
56
|
+
const request_1 = require("../../api/request");
|
|
57
|
+
const ALLOWED_TRANSPORTS = new Set([
|
|
58
|
+
"console",
|
|
59
|
+
"elasticsearch",
|
|
60
|
+
"file",
|
|
61
|
+
"syslog",
|
|
62
|
+
]);
|
|
29
63
|
class AccessLogger {
|
|
30
64
|
constructor() {
|
|
31
65
|
this.isActive = false;
|
|
@@ -35,7 +69,7 @@ class AccessLogger {
|
|
|
35
69
|
async init() {
|
|
36
70
|
const config = global.kuzzle.config.server;
|
|
37
71
|
for (const out of config.logs.transports) {
|
|
38
|
-
if (out.transport && !ALLOWED_TRANSPORTS.
|
|
72
|
+
if (out.transport && !ALLOWED_TRANSPORTS.has(out.transport)) {
|
|
39
73
|
this.logger.error(`Failed to initialize logger transport "${out.transport}": unsupported transport. Skipped.`);
|
|
40
74
|
}
|
|
41
75
|
else {
|
|
@@ -46,7 +80,7 @@ class AccessLogger {
|
|
|
46
80
|
return;
|
|
47
81
|
}
|
|
48
82
|
const anonymous = await global.kuzzle.ask("core:security:user:anonymous:get");
|
|
49
|
-
this.worker = new Worker(__filename, {
|
|
83
|
+
this.worker = new node_worker_threads_1.Worker(__filename, {
|
|
50
84
|
workerData: {
|
|
51
85
|
anonymousUserId: anonymous._id,
|
|
52
86
|
config,
|
|
@@ -69,6 +103,12 @@ class AccessLogger {
|
|
|
69
103
|
const size = request.response
|
|
70
104
|
? Buffer.byteLength(JSON.stringify(request.response)).toString()
|
|
71
105
|
: "-";
|
|
106
|
+
// `isActive` is what `init()` sets before building the worker, so a
|
|
107
|
+
// worker that is missing here means `init()` never ran — the same
|
|
108
|
+
// condition the early return above is for, said where it can be seen.
|
|
109
|
+
if (this.worker === null) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
72
112
|
try {
|
|
73
113
|
this.worker.postMessage({
|
|
74
114
|
connection,
|
|
@@ -82,20 +122,37 @@ class AccessLogger {
|
|
|
82
122
|
}
|
|
83
123
|
}
|
|
84
124
|
}
|
|
125
|
+
exports.AccessLogger = AccessLogger;
|
|
85
126
|
class AccessLoggerWorker {
|
|
86
127
|
constructor(config, anonymousUserId) {
|
|
87
128
|
this.config = config;
|
|
88
|
-
this.
|
|
129
|
+
this._logger = null;
|
|
89
130
|
this.anonymousUserId = anonymousUserId;
|
|
90
131
|
}
|
|
132
|
+
/**
|
|
133
|
+
* The pino transport, built by `initTransport()` — which `init()` calls
|
|
134
|
+
* before anything is listening. The three writes below read it unchecked.
|
|
135
|
+
*/
|
|
136
|
+
get logger() {
|
|
137
|
+
if (this._logger === null) {
|
|
138
|
+
throw new Error("[network] access logger used before init()");
|
|
139
|
+
}
|
|
140
|
+
return this._logger;
|
|
141
|
+
}
|
|
142
|
+
set logger(logger) {
|
|
143
|
+
this._logger = logger;
|
|
144
|
+
}
|
|
91
145
|
init() {
|
|
92
146
|
this.initTransport();
|
|
93
|
-
|
|
94
|
-
|
|
147
|
+
// This module is the worker's entry point: it only runs as a worker
|
|
148
|
+
// thread, and `parentPort` is null only in the thread that spawned one.
|
|
149
|
+
(0, node_assert_1.default)(node_worker_threads_1.parentPort !== null, "[network] the access logger worker has no parent port");
|
|
150
|
+
node_worker_threads_1.parentPort.on("message", ({ connection, extra, request, size }) => {
|
|
151
|
+
this.logAccess(connection, new request_1.KuzzleRequest(request.data, request.options), size, extra);
|
|
95
152
|
});
|
|
96
153
|
}
|
|
97
154
|
initTransport() {
|
|
98
|
-
const
|
|
155
|
+
const targets = [];
|
|
99
156
|
for (const conf of this.config.logs.transports) {
|
|
100
157
|
if (conf.silent === true) {
|
|
101
158
|
continue;
|
|
@@ -103,7 +160,7 @@ class AccessLoggerWorker {
|
|
|
103
160
|
// Guarantee default transport is 'console' and retro compatibility with winston options
|
|
104
161
|
switch (conf.transport || conf.preset || "console") {
|
|
105
162
|
case "console":
|
|
106
|
-
|
|
163
|
+
targets.push({
|
|
107
164
|
level: conf.level || "info",
|
|
108
165
|
options: {
|
|
109
166
|
destination: 1,
|
|
@@ -112,14 +169,14 @@ class AccessLoggerWorker {
|
|
|
112
169
|
});
|
|
113
170
|
break;
|
|
114
171
|
case "elasticsearch":
|
|
115
|
-
|
|
172
|
+
targets.push({
|
|
116
173
|
level: conf.level || "info",
|
|
117
|
-
options:
|
|
174
|
+
options: { ...conf.options },
|
|
118
175
|
target: "pino-elasticsearch",
|
|
119
176
|
});
|
|
120
177
|
break;
|
|
121
178
|
case "file":
|
|
122
|
-
|
|
179
|
+
targets.push({
|
|
123
180
|
level: conf.level || "info",
|
|
124
181
|
options: {
|
|
125
182
|
append: conf.options?.append ?? true,
|
|
@@ -135,20 +192,17 @@ class AccessLoggerWorker {
|
|
|
135
192
|
// If a pino transport configuration is used, we'll try to use it as-is and
|
|
136
193
|
// assume the user installed the necessary dependencies in his Kuzzle application
|
|
137
194
|
if (typeof conf.target === "string" && conf.target !== "") {
|
|
138
|
-
|
|
195
|
+
targets.push({
|
|
139
196
|
level: conf.level || "info",
|
|
140
197
|
options: conf.options || {},
|
|
141
198
|
target: conf.target,
|
|
142
199
|
});
|
|
143
200
|
}
|
|
144
201
|
}
|
|
145
|
-
this.logger = pino.pino(pino.transport(
|
|
202
|
+
this.logger = pino.pino(pino.transport({ targets }));
|
|
146
203
|
}
|
|
147
204
|
/**
|
|
148
|
-
* @param
|
|
149
|
-
* @param {Request} request
|
|
150
|
-
* @param {String} size - response size, in bytes
|
|
151
|
-
* @param {Object} [extra]
|
|
205
|
+
* @param size - response size, in bytes
|
|
152
206
|
*/
|
|
153
207
|
logAccess(connection, request, size, extra = null) {
|
|
154
208
|
if (this.config.logs.accessLogFormat === "logstash") {
|
|
@@ -164,57 +218,23 @@ class AccessLoggerWorker {
|
|
|
164
218
|
});
|
|
165
219
|
return;
|
|
166
220
|
}
|
|
167
|
-
|
|
168
|
-
// the request
|
|
169
|
-
// If not available, then that may mean that we didn't verify the user yet,
|
|
170
|
-
// so we have to decode any provided token
|
|
171
|
-
let user = null;
|
|
172
|
-
if (request.context.token !== null) {
|
|
173
|
-
user =
|
|
174
|
-
request.context.token.userId === this.anonymousUserId
|
|
175
|
-
? "(anonymous)"
|
|
176
|
-
: request.context.token.userId;
|
|
177
|
-
}
|
|
221
|
+
const user = this.resolveUser(request);
|
|
178
222
|
// = apache combined
|
|
179
223
|
const protocol = connection.protocol.toUpperCase();
|
|
180
224
|
let url;
|
|
181
225
|
let verb = "DO";
|
|
182
|
-
|
|
226
|
+
// `extra` carries the HTTP method and url, and only an HTTP connection
|
|
227
|
+
// has one: the two were read on the strength of the protocol name alone.
|
|
228
|
+
if (connection.protocol.startsWith("HTTP/") && extra !== null) {
|
|
183
229
|
verb = extra.method;
|
|
184
230
|
url = extra.url;
|
|
185
231
|
}
|
|
186
232
|
// for other protocols than http, we rebuild a pseudo url
|
|
187
233
|
else {
|
|
188
|
-
url =
|
|
189
|
-
if (request.input.args.index) {
|
|
190
|
-
url += `/${request.input.args.index}`;
|
|
191
|
-
}
|
|
192
|
-
if (request.input.args.collection) {
|
|
193
|
-
url += `/${request.input.args.collection}`;
|
|
194
|
-
}
|
|
195
|
-
if (request.input.args._id) {
|
|
196
|
-
url += `/${request.input.args._id}`;
|
|
197
|
-
}
|
|
198
|
-
let queryString = "";
|
|
199
|
-
for (const k of Object.keys(request.input.args)) {
|
|
200
|
-
if (k === "_id" || k === "index" || k === "collection") {
|
|
201
|
-
continue;
|
|
202
|
-
}
|
|
203
|
-
const val = request.input.args[k];
|
|
204
|
-
if (queryString.length > 0) {
|
|
205
|
-
queryString += "&";
|
|
206
|
-
}
|
|
207
|
-
queryString += `${k}=${typeof val === "object" ? JSON.stringify(val) : val}`;
|
|
208
|
-
}
|
|
209
|
-
if (queryString.length > 0) {
|
|
210
|
-
url += `?${queryString}`;
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
if (user === null) {
|
|
214
|
-
user = "(unknown)";
|
|
234
|
+
url = buildPseudoUrl(request);
|
|
215
235
|
}
|
|
216
236
|
const ip = this.getIP(connection);
|
|
217
|
-
const when =
|
|
237
|
+
const when = (0, moment_1.default)().format("DD/MMM/YYYY:HH:mm:ss ZZ");
|
|
218
238
|
const status = request.status || "-";
|
|
219
239
|
const referer = connection.headers.referer
|
|
220
240
|
? `"${connection.headers.referer}"`
|
|
@@ -225,26 +245,68 @@ class AccessLoggerWorker {
|
|
|
225
245
|
this.logger.info({ namespace: "kuzzle:accessLogs", nodeId: global.kuzzle.id }, `${ip} - ${user} [${when}] "${verb} ${url} ${protocol}" ${status} ${size} ${referer} ${agent}`);
|
|
226
246
|
}
|
|
227
247
|
/**
|
|
228
|
-
*
|
|
248
|
+
* The user the access log line is attributed to: the already decoded and
|
|
249
|
+
* verified token stored in the request is preferred; without one, we have no
|
|
250
|
+
* verified identity to report.
|
|
229
251
|
*/
|
|
252
|
+
resolveUser(request) {
|
|
253
|
+
const { token } = request.context;
|
|
254
|
+
if (token === null) {
|
|
255
|
+
return "(unknown)";
|
|
256
|
+
}
|
|
257
|
+
const user = token.userId === this.anonymousUserId ? "(anonymous)" : token.userId;
|
|
258
|
+
// `??` rather than a `=== null` test: a token with no userId at all used
|
|
259
|
+
// to log the string "undefined"
|
|
260
|
+
return user ?? "(unknown)";
|
|
261
|
+
}
|
|
230
262
|
getIP(connection) {
|
|
231
263
|
const { ips } = connection;
|
|
232
264
|
if (ips.length === 0) {
|
|
233
265
|
return "-";
|
|
234
266
|
}
|
|
235
267
|
const idx = Math.max(0, ips.length - 1 - this.config.logs.accessLogIpOffset);
|
|
236
|
-
|
|
268
|
+
// `ips` is non-empty here — the caller builds it from the connection —
|
|
269
|
+
// and an offset past its start is clamped to 0 above.
|
|
270
|
+
return ips[idx] ?? "";
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
exports.AccessLoggerWorker = AccessLoggerWorker;
|
|
274
|
+
/**
|
|
275
|
+
* For protocols other than http, we rebuild a pseudo url out of the request's
|
|
276
|
+
* controller, action and arguments.
|
|
277
|
+
*/
|
|
278
|
+
function buildPseudoUrl(request) {
|
|
279
|
+
let url = `/${request.input.controller}/${request.input.action}`;
|
|
280
|
+
if (request.input.args.index) {
|
|
281
|
+
url += `/${request.input.args.index}`;
|
|
282
|
+
}
|
|
283
|
+
if (request.input.args.collection) {
|
|
284
|
+
url += `/${request.input.args.collection}`;
|
|
285
|
+
}
|
|
286
|
+
if (request.input.args._id) {
|
|
287
|
+
url += `/${request.input.args._id}`;
|
|
288
|
+
}
|
|
289
|
+
let queryString = "";
|
|
290
|
+
for (const k of Object.keys(request.input.args)) {
|
|
291
|
+
if (k === "_id" || k === "index" || k === "collection") {
|
|
292
|
+
continue;
|
|
293
|
+
}
|
|
294
|
+
const val = request.input.args[k];
|
|
295
|
+
if (queryString.length > 0) {
|
|
296
|
+
queryString += "&";
|
|
297
|
+
}
|
|
298
|
+
queryString += `${k}=${typeof val === "object" ? JSON.stringify(val) : val}`;
|
|
299
|
+
}
|
|
300
|
+
if (queryString.length > 0) {
|
|
301
|
+
url += `?${queryString}`;
|
|
237
302
|
}
|
|
303
|
+
return url;
|
|
238
304
|
}
|
|
239
|
-
if (!isMainThread) {
|
|
240
|
-
// Needed for instantiating a serialized KuzzleRequest object
|
|
241
|
-
|
|
242
|
-
|
|
305
|
+
if (!node_worker_threads_1.isMainThread) {
|
|
306
|
+
// Needed for instantiating a serialized KuzzleRequest object: the worker
|
|
307
|
+
// thread has no Kuzzle instance of its own, only the node id.
|
|
308
|
+
global.kuzzle = { id: node_worker_threads_1.workerData.kuzzleId };
|
|
309
|
+
const worker = new AccessLoggerWorker(node_worker_threads_1.workerData.config, node_worker_threads_1.workerData.anonymousUserId);
|
|
243
310
|
worker.init();
|
|
244
311
|
}
|
|
245
|
-
// Exposing the worker isn't necessary for production code: this is only
|
|
246
|
-
// useful to make this class testable. I usually don't like it when tests have a
|
|
247
|
-
// say in how the code should be written, but in this particular case, I see
|
|
248
|
-
// no other way to correctly test this.
|
|
249
|
-
module.exports = { AccessLogger, AccessLoggerWorker };
|
|
250
312
|
//# sourceMappingURL=accessLogger.js.map
|
|
@@ -1,15 +1,17 @@
|
|
|
1
|
-
|
|
1
|
+
import type { JSONObject } from "../../types/JSONObject";
|
|
2
2
|
/**
|
|
3
|
-
* @
|
|
4
|
-
* @param
|
|
5
|
-
*
|
|
6
|
-
* @param
|
|
3
|
+
* @param protocol - The protocol used (http, websocket, mqtt etc)
|
|
4
|
+
* @param ips - The list of forwarded ips (= X-Forwarded-For http header + the
|
|
5
|
+
* final ip, i.e. client, proxy1, proxy2, etc.)
|
|
6
|
+
* @param headers - Optional extra key-value object. I.e., for http, will
|
|
7
|
+
* receive the request headers
|
|
7
8
|
*/
|
|
8
9
|
declare class ClientConnection {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
ips:
|
|
10
|
+
readonly id: string;
|
|
11
|
+
readonly protocol: string;
|
|
12
|
+
readonly headers: JSONObject;
|
|
13
|
+
readonly internal: JSONObject;
|
|
14
|
+
readonly ips: string[];
|
|
15
|
+
constructor(protocol: string, ips: string[], headers?: JSONObject | null, internal?: JSONObject | null);
|
|
15
16
|
}
|
|
17
|
+
export = ClientConnection;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/*
|
|
2
3
|
* Kuzzle, a backend software, self-hostable and ready to use
|
|
3
4
|
* to power modern apps
|
|
@@ -18,14 +19,37 @@
|
|
|
18
19
|
* See the License for the specific language governing permissions and
|
|
19
20
|
* limitations under the License.
|
|
20
21
|
*/
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
25
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
26
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
27
|
+
}
|
|
28
|
+
Object.defineProperty(o, k2, desc);
|
|
29
|
+
}) : (function(o, m, k, k2) {
|
|
30
|
+
if (k2 === undefined) k2 = k;
|
|
31
|
+
o[k2] = m[k];
|
|
32
|
+
}));
|
|
33
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
34
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
35
|
+
}) : function(o, v) {
|
|
36
|
+
o["default"] = v;
|
|
37
|
+
});
|
|
38
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
39
|
+
if (mod && mod.__esModule) return mod;
|
|
40
|
+
var result = {};
|
|
41
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
42
|
+
__setModuleDefault(result, mod);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
const uuid = __importStar(require("uuid"));
|
|
46
|
+
const safeObject_1 = require("../../util/safeObject");
|
|
24
47
|
/**
|
|
25
|
-
* @
|
|
26
|
-
* @param
|
|
27
|
-
*
|
|
28
|
-
* @param
|
|
48
|
+
* @param protocol - The protocol used (http, websocket, mqtt etc)
|
|
49
|
+
* @param ips - The list of forwarded ips (= X-Forwarded-For http header + the
|
|
50
|
+
* final ip, i.e. client, proxy1, proxy2, etc.)
|
|
51
|
+
* @param headers - Optional extra key-value object. I.e., for http, will
|
|
52
|
+
* receive the request headers
|
|
29
53
|
*/
|
|
30
54
|
class ClientConnection {
|
|
31
55
|
constructor(protocol, ips, headers = null, internal = null) {
|
|
@@ -37,10 +61,10 @@ class ClientConnection {
|
|
|
37
61
|
throw new TypeError(`Expected ips to be an Array, got ${typeof ips}`);
|
|
38
62
|
}
|
|
39
63
|
this.ips = ips;
|
|
40
|
-
if (isPlainObject(headers)) {
|
|
64
|
+
if ((0, safeObject_1.isPlainObject)(headers)) {
|
|
41
65
|
this.headers = headers;
|
|
42
66
|
}
|
|
43
|
-
if (isPlainObject(internal)) {
|
|
67
|
+
if ((0, safeObject_1.isPlainObject)(internal)) {
|
|
44
68
|
this.internal = internal;
|
|
45
69
|
}
|
|
46
70
|
Object.freeze(this);
|
|
@@ -1,7 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
/// <reference types="lib/types/debug" />
|
|
2
|
+
import { BadRequestError, ExternalServiceError, ForbiddenError, GatewayTimeoutError, InternalError as KuzzleInternalError, KuzzleError, NotFoundError, PartialError, PluginImplementationError, PreconditionError, ServiceUnavailableError, SizeLimitError, TooManyRequestsError, UnauthorizedError } from "../../kerror/errors";
|
|
3
|
+
import { Request, RequestContext, RequestInput } from "../../api/request";
|
|
4
|
+
import ClientConnection from "./clientConnection";
|
|
5
|
+
import ProtocolBase from "./protocols/protocol";
|
|
6
|
+
type LogLevel = "silly" | "debug" | "verbose" | "info" | "warn" | "error";
|
|
7
|
+
/**
|
|
8
|
+
* The object a protocol plugin is initialized with: the constructors and the
|
|
9
|
+
* loggers it is allowed to reach, rather than the Kuzzle instance itself.
|
|
10
|
+
*/
|
|
2
11
|
declare class Context {
|
|
3
12
|
ClientConnection: typeof ClientConnection;
|
|
4
|
-
debug:
|
|
13
|
+
debug: import("debug").Debugger;
|
|
5
14
|
errors: {
|
|
6
15
|
BadRequestError: typeof BadRequestError;
|
|
7
16
|
ExternalServiceError: typeof ExternalServiceError;
|
|
@@ -19,24 +28,10 @@ declare class Context {
|
|
|
19
28
|
UnauthorizedError: typeof UnauthorizedError;
|
|
20
29
|
};
|
|
21
30
|
Protocol: typeof ProtocolBase;
|
|
22
|
-
Request:
|
|
23
|
-
RequestContext:
|
|
24
|
-
RequestInput:
|
|
25
|
-
log:
|
|
31
|
+
Request: typeof Request;
|
|
32
|
+
RequestContext: typeof RequestContext;
|
|
33
|
+
RequestInput: typeof RequestInput;
|
|
34
|
+
log: Record<LogLevel, (message: string, ...args: unknown[]) => void>;
|
|
35
|
+
constructor();
|
|
26
36
|
}
|
|
27
|
-
|
|
28
|
-
import { BadRequestError } from "../../kerror/errors/badRequestError";
|
|
29
|
-
import { ExternalServiceError } from "../../kerror/errors/externalServiceError";
|
|
30
|
-
import { ForbiddenError } from "../../kerror/errors/forbiddenError";
|
|
31
|
-
import { GatewayTimeoutError } from "../../kerror/errors/gatewayTimeoutError";
|
|
32
|
-
import { InternalError as KuzzleInternalError } from "../../kerror/errors/internalError";
|
|
33
|
-
import { KuzzleError } from "../../kerror/errors/kuzzleError";
|
|
34
|
-
import { NotFoundError } from "../../kerror/errors/notFoundError";
|
|
35
|
-
import { PartialError } from "../../kerror/errors/partialError";
|
|
36
|
-
import { PluginImplementationError } from "../../kerror/errors/pluginImplementationError";
|
|
37
|
-
import { PreconditionError } from "../../kerror/errors/preconditionError";
|
|
38
|
-
import { ServiceUnavailableError } from "../../kerror/errors/serviceUnavailableError";
|
|
39
|
-
import { SizeLimitError } from "../../kerror/errors/sizeLimitError";
|
|
40
|
-
import { TooManyRequestsError } from "../../kerror/errors/tooManyRequestsError";
|
|
41
|
-
import { UnauthorizedError } from "../../kerror/errors/unauthorizedError";
|
|
42
|
-
import ProtocolBase = require("./protocols/protocol");
|
|
37
|
+
export = Context;
|