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
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
import EventEmitter from "eventemitter3";
|
|
2
|
-
import { AskEventDefinition, AskEventHandler, CallEventHandler, EventDefinition, HookEventHandler, PipeEventHandler } from "../../types/EventHandler";
|
|
2
|
+
import type { AskEventDefinition, AskEventHandler, CallEventHandler, EventDefinition, HookEventHandler, PipeEventHandler, RegisteredPipeHandler } from "../../types/EventHandler";
|
|
3
3
|
declare class KuzzleEventEmitter extends EventEmitter {
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* The ask answerers, whatever event each was registered for.
|
|
6
|
+
*
|
|
7
|
+
* `onAsk` is generic over its event, and a handler's parameters are
|
|
8
|
+
* contravariant: a handler for one event is not assignable to the handler
|
|
9
|
+
* type of another, so the only thing the map can say about all of them
|
|
10
|
+
* together is that they are callable. `ask()` dispatches through
|
|
11
|
+
* `Reflect.apply`, which is what that costs.
|
|
12
|
+
*/
|
|
13
|
+
private readonly coreAnswerers;
|
|
5
14
|
private coreSyncedAnswerers;
|
|
6
|
-
private corePipes;
|
|
7
|
-
private pipeRunner;
|
|
8
|
-
private pluginPipes;
|
|
9
|
-
private pluginPipeDefinitions;
|
|
10
|
-
private superEmit;
|
|
15
|
+
private readonly corePipes;
|
|
16
|
+
private readonly pipeRunner;
|
|
17
|
+
private readonly pluginPipes;
|
|
18
|
+
private readonly pluginPipeDefinitions;
|
|
19
|
+
private readonly superEmit;
|
|
11
20
|
constructor(maxConcurrentPipes: number, pipesBufferSize: number);
|
|
12
21
|
/**
|
|
13
22
|
* Registers a core method on a pipe
|
|
@@ -59,8 +68,8 @@ declare class KuzzleEventEmitter extends EventEmitter {
|
|
|
59
68
|
* Registers a plugin hook.
|
|
60
69
|
* Catch any error in the handler and emit the hook:onError event.
|
|
61
70
|
*/
|
|
62
|
-
registerPluginHook<TEventDefinition extends EventDefinition = EventDefinition>(pluginName: string, event: TEventDefinition["name"], fn: HookEventHandler<TEventDefinition>): void;
|
|
63
|
-
registerPluginPipe<TEventDefinition extends EventDefinition = EventDefinition>(event: TEventDefinition["name"], handler:
|
|
71
|
+
registerPluginHook<TEventDefinition extends EventDefinition = EventDefinition>(pluginName: string, event: TEventDefinition["name"], fn: HookEventHandler<TEventDefinition> | ((...args: unknown[]) => unknown)): void;
|
|
72
|
+
registerPluginPipe<TEventDefinition extends EventDefinition = EventDefinition>(event: TEventDefinition["name"], handler: RegisteredPipeHandler<TEventDefinition>): string;
|
|
64
73
|
unregisterPluginPipe(pipeId: string): void;
|
|
65
74
|
/**
|
|
66
75
|
* Checks if an ask event has an answerer
|
|
@@ -89,10 +89,9 @@ class KuzzleEventEmitter extends eventemitter3_1.default {
|
|
|
89
89
|
*/
|
|
90
90
|
onPipe(event, fn) {
|
|
91
91
|
(0, assert_1.default)(typeof fn === "function", `Cannot listen to pipe event ${event}: "${fn}" is not a function`);
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
this.corePipes.get(event).push(fn);
|
|
92
|
+
const registered = this.corePipes.get(event) ?? [];
|
|
93
|
+
registered.push(fn);
|
|
94
|
+
this.corePipes.set(event, registered);
|
|
96
95
|
}
|
|
97
96
|
/**
|
|
98
97
|
* Registers a core 'ask' event answerer
|
|
@@ -101,6 +100,9 @@ class KuzzleEventEmitter extends eventemitter3_1.default {
|
|
|
101
100
|
onAsk(event, fn) {
|
|
102
101
|
(0, assert_1.default)(typeof fn === "function", `Cannot listen to ask event "${event}": "${fn}" is not a function`);
|
|
103
102
|
(0, assert_1.default)(!this.coreAnswerers.has(event), `Cannot add a listener to the ask event "${event}": event has already an answerer`);
|
|
103
|
+
// The map holds the un-parameterised handler: `onAsk` is generic over the
|
|
104
|
+
// event it registers, and what the map can say about all of them together
|
|
105
|
+
// is the base signature.
|
|
104
106
|
this.coreAnswerers.set(event, fn);
|
|
105
107
|
}
|
|
106
108
|
/**
|
|
@@ -152,7 +154,10 @@ class KuzzleEventEmitter extends eventemitter3_1.default {
|
|
|
152
154
|
typeof payload[payload.length - 1] === "function") {
|
|
153
155
|
callback = payload.pop();
|
|
154
156
|
}
|
|
155
|
-
|
|
157
|
+
// Named once: the event is the pipe's target and the seed of its
|
|
158
|
+
// wildcard list, and the callback context carries it too.
|
|
159
|
+
const eventName = event;
|
|
160
|
+
const events = getWildcardEvents(eventName);
|
|
156
161
|
const funcs = [];
|
|
157
162
|
for (const element of events) {
|
|
158
163
|
const targets = this.pluginPipes.get(element);
|
|
@@ -164,11 +169,18 @@ class KuzzleEventEmitter extends eventemitter3_1.default {
|
|
|
164
169
|
}
|
|
165
170
|
// Create a context for the emitPluginPipe callback
|
|
166
171
|
const promback = new promback_1.default(callback);
|
|
172
|
+
// What the callback needs, rather than the whole emitter: it is invoked
|
|
173
|
+
// with this object as its receiver, from `pipeRunner`, and reaching back
|
|
174
|
+
// into two private members through it was the only thing that asked for
|
|
175
|
+
// `instance`.
|
|
167
176
|
const callbackContext = {
|
|
177
|
+
corePipes: this.corePipes,
|
|
168
178
|
events,
|
|
169
|
-
instance: this,
|
|
170
179
|
promback,
|
|
171
|
-
|
|
180
|
+
superEmit: (ev, ...a) => {
|
|
181
|
+
this.superEmit(ev, ...a);
|
|
182
|
+
},
|
|
183
|
+
targetEvent: eventName,
|
|
172
184
|
};
|
|
173
185
|
if (funcs.length === 0) {
|
|
174
186
|
pipeCallback.call(callbackContext, null, ...payload);
|
|
@@ -187,7 +199,10 @@ class KuzzleEventEmitter extends eventemitter3_1.default {
|
|
|
187
199
|
if (!fn) {
|
|
188
200
|
throw kerror.get("core", "fatal", "assertion_failed", `the requested ask event '${event}' doesn't have an answerer`);
|
|
189
201
|
}
|
|
190
|
-
|
|
202
|
+
// `undefined` as the receiver, which is what `fn(...args)` passed: an
|
|
203
|
+
// answerer is registered as a bound function or an arrow, and handing it
|
|
204
|
+
// the emitter would be a new claim rather than a preserved one.
|
|
205
|
+
const response = await Reflect.apply(fn, undefined, args);
|
|
191
206
|
for (const ev of getWildcardEvents(event)) {
|
|
192
207
|
super.emit(ev, {
|
|
193
208
|
args,
|
|
@@ -218,11 +233,17 @@ class KuzzleEventEmitter extends eventemitter3_1.default {
|
|
|
218
233
|
* Registers a plugin hook.
|
|
219
234
|
* Catch any error in the handler and emit the hook:onError event.
|
|
220
235
|
*/
|
|
221
|
-
registerPluginHook(pluginName, event,
|
|
236
|
+
registerPluginHook(pluginName, event,
|
|
237
|
+
// Same as `registerPluginPipe`: a hook resolved from a plugin member is a
|
|
238
|
+
// function of unknown return, not necessarily `void | Promise<void>`.
|
|
239
|
+
fn) {
|
|
222
240
|
this.on(event, (...args) => {
|
|
223
241
|
try {
|
|
224
242
|
const ret = fn(...args, event);
|
|
225
|
-
if (typeof ret === "object" &&
|
|
243
|
+
if (typeof ret === "object" &&
|
|
244
|
+
ret !== null &&
|
|
245
|
+
"catch" in ret &&
|
|
246
|
+
typeof ret.catch === "function") {
|
|
226
247
|
ret.catch((error) => {
|
|
227
248
|
if (event !== "hook:onError") {
|
|
228
249
|
this.emit("hook:onError", { error, event, pluginName });
|
|
@@ -243,11 +264,14 @@ class KuzzleEventEmitter extends eventemitter3_1.default {
|
|
|
243
264
|
}
|
|
244
265
|
});
|
|
245
266
|
}
|
|
246
|
-
registerPluginPipe(event,
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
267
|
+
registerPluginPipe(event,
|
|
268
|
+
// A plugin pipe may answer a promise OR take a trailing callback — the
|
|
269
|
+
// runner supports both, and `PluginsManager.registerPipe` hands it the
|
|
270
|
+
// callback form. The promise-only type described half of what is accepted.
|
|
271
|
+
handler) {
|
|
272
|
+
const registered = this.pluginPipes.get(event) ?? [];
|
|
273
|
+
registered.push(handler);
|
|
274
|
+
this.pluginPipes.set(event, registered);
|
|
251
275
|
const definition = new PluginPipeDefinition(event, handler);
|
|
252
276
|
this.pluginPipeDefinitions.set(definition.pipeId, definition);
|
|
253
277
|
return definition.pipeId;
|
|
@@ -257,7 +281,7 @@ class KuzzleEventEmitter extends eventemitter3_1.default {
|
|
|
257
281
|
if (!definition) {
|
|
258
282
|
throw kerror.get("plugin", "runtime", "unknown_pipe", pipeId);
|
|
259
283
|
}
|
|
260
|
-
const handlers = this.pluginPipes.get(definition.event);
|
|
284
|
+
const handlers = this.pluginPipes.get(definition.event) ?? [];
|
|
261
285
|
handlers.splice(handlers.indexOf(definition.handler), 1);
|
|
262
286
|
if (handlers.length > 0) {
|
|
263
287
|
this.pluginPipes.set(definition.event, handlers);
|
|
@@ -281,6 +305,9 @@ class KuzzleEventEmitter extends eventemitter3_1.default {
|
|
|
281
305
|
* The context of this callback must be bound to this following object:
|
|
282
306
|
* { instance: (kuzzle instance), promback, events }
|
|
283
307
|
*
|
|
308
|
+
* Declared as `this`, rather than left implicit: the function is never called
|
|
309
|
+
* as a method, so the compiler has nothing else to read the receiver from.
|
|
310
|
+
*
|
|
284
311
|
* @warning Critical section of code
|
|
285
312
|
*/
|
|
286
313
|
async function pipeCallback(error, ...updated) {
|
|
@@ -289,12 +316,12 @@ async function pipeCallback(error, ...updated) {
|
|
|
289
316
|
this.promback.reject(error);
|
|
290
317
|
return;
|
|
291
318
|
}
|
|
292
|
-
const corePipes = this.
|
|
319
|
+
const corePipes = this.corePipes.get(this.targetEvent);
|
|
293
320
|
if (corePipes) {
|
|
294
321
|
await bluebird_1.default.map(corePipes, (fn) => fn(...updated));
|
|
295
322
|
}
|
|
296
323
|
for (const element of this.events) {
|
|
297
|
-
this.
|
|
324
|
+
this.superEmit(element, ...updated);
|
|
298
325
|
}
|
|
299
326
|
this.promback.resolve(updated[0]);
|
|
300
327
|
/* eslint-enable no-invalid-this */
|
|
@@ -1,30 +1,51 @@
|
|
|
1
|
-
|
|
1
|
+
import Denque from "denque";
|
|
2
|
+
/** A pipe in a chain: the payload, then the callback the pipe must call. */
|
|
3
|
+
type Pipe = (...args: unknown[]) => void;
|
|
4
|
+
/**
|
|
5
|
+
* How a pipe chain reports back to whoever asked for it to be run.
|
|
6
|
+
*
|
|
7
|
+
* The error is `unknown` for the same reason it is in `waterfall`: a pipe is
|
|
8
|
+
* plugin code and can call its callback with anything.
|
|
9
|
+
*/
|
|
10
|
+
type PipeCallback = (error?: unknown, ...results: unknown[]) => void;
|
|
11
|
+
/**
|
|
12
|
+
* @private
|
|
13
|
+
*/
|
|
14
|
+
declare class PipeChain {
|
|
15
|
+
readonly chain: Pipe[];
|
|
16
|
+
readonly args: unknown[];
|
|
17
|
+
readonly callback: PipeCallback;
|
|
18
|
+
readonly callbackContext: unknown;
|
|
19
|
+
constructor(chain: Pipe[], args: unknown[], callback: PipeCallback, callbackContext: unknown);
|
|
20
|
+
}
|
|
2
21
|
/**
|
|
3
|
-
* @class PipeRunner
|
|
4
22
|
* Runs pipe chains if the number of already running concurrent pipes allows it.
|
|
5
23
|
* Otherwise, delays the pipe chain until a slot is freed. If the storage
|
|
6
24
|
* buffer is full, rejects the provided callback and discard the pipe chain.
|
|
7
|
-
*
|
|
8
|
-
* @param {Number} concurrent - max number of concurrent pipes
|
|
9
|
-
* @param {Number} bufferSize - max number of delayed pipe chains
|
|
10
25
|
*/
|
|
11
26
|
declare class PipeRunner {
|
|
12
|
-
|
|
13
|
-
|
|
27
|
+
readonly maxConcurrent: number;
|
|
28
|
+
readonly maxBufferSize: number;
|
|
29
|
+
readonly buffer: Denque<PipeChain>;
|
|
30
|
+
/** Read and written by `waterfallCallback`, which runs outside the class. */
|
|
14
31
|
running: number;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
32
|
+
/** Same: `waterfallCallback` schedules it, so it cannot be private. */
|
|
33
|
+
readonly _boundRunNext: () => void;
|
|
34
|
+
/**
|
|
35
|
+
* @param concurrent - max number of concurrent pipes
|
|
36
|
+
* @param bufferSize - max number of delayed pipe chains
|
|
37
|
+
*/
|
|
38
|
+
constructor(concurrent: number, bufferSize: number);
|
|
18
39
|
/**
|
|
19
40
|
* @warning Critical code section
|
|
20
41
|
*
|
|
21
42
|
* Pipes can be run thousands of times per seconds
|
|
22
|
-
* @param
|
|
23
|
-
* @param
|
|
24
|
-
* @param
|
|
25
|
-
* @param
|
|
43
|
+
* @param chain - functions chain
|
|
44
|
+
* @param args - functions arguments
|
|
45
|
+
* @param callback - end-of-chain callback
|
|
46
|
+
* @param callbackContext - functions/callback context
|
|
26
47
|
*/
|
|
27
|
-
run(chain:
|
|
48
|
+
run(chain: Pipe[], args: unknown[], callback: PipeCallback, callbackContext: unknown): void;
|
|
28
49
|
_runNext(): void;
|
|
29
50
|
}
|
|
30
|
-
|
|
51
|
+
export = PipeRunner;
|
|
@@ -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,18 +19,48 @@
|
|
|
18
19
|
* See the License for the specific language governing permissions and
|
|
19
20
|
* limitations under the License.
|
|
20
21
|
*/
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
49
|
+
const denque_1 = __importDefault(require("denque"));
|
|
50
|
+
const kerrorLib = __importStar(require("../../kerror"));
|
|
51
|
+
const errors_1 = require("../../kerror/errors");
|
|
52
|
+
const thrown_1 = require("../../util/thrown");
|
|
53
|
+
const waterfall_1 = __importDefault(require("./waterfall"));
|
|
54
|
+
const kerror = kerrorLib.wrap("plugin", "runtime");
|
|
27
55
|
/**
|
|
28
56
|
* We declare the callback used by waterfall one time instead
|
|
29
57
|
* of redeclaring a closure each time we want to run the pipes.
|
|
30
58
|
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
59
|
+
* The declared `this` is what makes the accesses below check: the context is
|
|
60
|
+
* the object `run` builds.
|
|
61
|
+
*
|
|
62
|
+
* The suppression stays because it is ESLint's *core* `no-invalid-this`, which
|
|
63
|
+
* predates `this` parameters and cannot see the declaration.
|
|
33
64
|
*/
|
|
34
65
|
/* eslint-disable no-invalid-this */
|
|
35
66
|
function waterfallCallback(error, ...result) {
|
|
@@ -38,19 +69,28 @@ function waterfallCallback(error, ...result) {
|
|
|
38
69
|
setImmediate(this.instance._boundRunNext);
|
|
39
70
|
}
|
|
40
71
|
if (error) {
|
|
41
|
-
|
|
42
|
-
? error
|
|
43
|
-
: kerror.getFrom(error, "unexpected_error", error.message);
|
|
44
|
-
this.callback.call(this.callbackContext, cbError);
|
|
72
|
+
this.callback.call(this.callbackContext, toKuzzleError(error));
|
|
45
73
|
}
|
|
46
74
|
else {
|
|
47
75
|
this.callback.call(this.callbackContext, null, ...result);
|
|
48
76
|
}
|
|
49
77
|
}
|
|
50
78
|
/* eslint-enable no-invalid-this */
|
|
79
|
+
/**
|
|
80
|
+
* Wraps whatever a pipe rejected with into a `KuzzleError`.
|
|
81
|
+
*
|
|
82
|
+
* The message is the rejected value's own `message`, as the JavaScript read
|
|
83
|
+
* it: a plugin rejecting with `{ message: "oops" }` says "oops", and one
|
|
84
|
+
* calling `cb("oops")` still says "undefined".
|
|
85
|
+
*/
|
|
86
|
+
function toKuzzleError(error) {
|
|
87
|
+
if (error instanceof errors_1.KuzzleError) {
|
|
88
|
+
return error;
|
|
89
|
+
}
|
|
90
|
+
return kerror.getFrom(error, "unexpected_error", (0, thrown_1.causeOf)(error).message);
|
|
91
|
+
}
|
|
51
92
|
/**
|
|
52
93
|
* @private
|
|
53
|
-
* @class PipeChain
|
|
54
94
|
*/
|
|
55
95
|
class PipeChain {
|
|
56
96
|
constructor(chain, args, callback, callbackContext) {
|
|
@@ -61,32 +101,32 @@ class PipeChain {
|
|
|
61
101
|
}
|
|
62
102
|
}
|
|
63
103
|
/**
|
|
64
|
-
* @class PipeRunner
|
|
65
104
|
* Runs pipe chains if the number of already running concurrent pipes allows it.
|
|
66
105
|
* Otherwise, delays the pipe chain until a slot is freed. If the storage
|
|
67
106
|
* buffer is full, rejects the provided callback and discard the pipe chain.
|
|
68
|
-
*
|
|
69
|
-
* @param {Number} concurrent - max number of concurrent pipes
|
|
70
|
-
* @param {Number} bufferSize - max number of delayed pipe chains
|
|
71
107
|
*/
|
|
72
108
|
class PipeRunner {
|
|
109
|
+
/**
|
|
110
|
+
* @param concurrent - max number of concurrent pipes
|
|
111
|
+
* @param bufferSize - max number of delayed pipe chains
|
|
112
|
+
*/
|
|
73
113
|
constructor(concurrent, bufferSize) {
|
|
74
|
-
|
|
75
|
-
|
|
114
|
+
(0, node_assert_1.default)(typeof concurrent === "number" && concurrent > 0, "Cannot instantiate pipes executor: invalid maxConcurrentPipes parameter value");
|
|
115
|
+
(0, node_assert_1.default)(typeof bufferSize === "number" && bufferSize > 0, "Cannot instantiate pipes executor: invalid pipesBufferSize parameter value");
|
|
76
116
|
this.maxConcurrent = concurrent;
|
|
77
117
|
this.running = 0;
|
|
78
118
|
this.maxBufferSize = bufferSize;
|
|
79
|
-
this.buffer = new
|
|
119
|
+
this.buffer = new denque_1.default();
|
|
80
120
|
this._boundRunNext = this._runNext.bind(this);
|
|
81
121
|
}
|
|
82
122
|
/**
|
|
83
123
|
* @warning Critical code section
|
|
84
124
|
*
|
|
85
125
|
* Pipes can be run thousands of times per seconds
|
|
86
|
-
* @param
|
|
87
|
-
* @param
|
|
88
|
-
* @param
|
|
89
|
-
* @param
|
|
126
|
+
* @param chain - functions chain
|
|
127
|
+
* @param args - functions arguments
|
|
128
|
+
* @param callback - end-of-chain callback
|
|
129
|
+
* @param callbackContext - functions/callback context
|
|
90
130
|
*/
|
|
91
131
|
run(chain, args, callback, callbackContext) {
|
|
92
132
|
if (this.running >= this.maxConcurrent) {
|
|
@@ -105,13 +145,20 @@ class PipeRunner {
|
|
|
105
145
|
callbackContext,
|
|
106
146
|
instance: this,
|
|
107
147
|
};
|
|
108
|
-
|
|
148
|
+
(0, waterfall_1.default)(chain, args, waterfallCallback, waterfallCallbackCtx);
|
|
109
149
|
}
|
|
110
150
|
_runNext() {
|
|
111
|
-
if (this.
|
|
151
|
+
if (this.running >= this.maxConcurrent) {
|
|
112
152
|
return;
|
|
113
153
|
}
|
|
154
|
+
// One lookup rather than `isEmpty()` and then `shift()`: `shift()` on an
|
|
155
|
+
// empty Denque returns `undefined` and mutates nothing, so the two forms
|
|
156
|
+
// agree, and this one leaves no invariant for the compiler to take on
|
|
157
|
+
// trust.
|
|
114
158
|
const pipe = this.buffer.shift();
|
|
159
|
+
if (!pipe) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
115
162
|
this.run(pipe.chain, pipe.args, pipe.callback, pipe.callbackContext);
|
|
116
163
|
}
|
|
117
164
|
}
|
|
@@ -1,2 +1,12 @@
|
|
|
1
|
+
/** A step in the chain: the payload, then the callback the step must call. */
|
|
2
|
+
type WaterfallStep = (...args: unknown[]) => void;
|
|
3
|
+
/**
|
|
4
|
+
* How a step — and the waterfall itself — reports back.
|
|
5
|
+
*
|
|
6
|
+
* The error is `unknown`, not `Error`: a step is arbitrary plugin code and can
|
|
7
|
+
* call its callback with anything at all. `pipeRunner` is what turns whatever
|
|
8
|
+
* arrives into a `KuzzleError`.
|
|
9
|
+
*/
|
|
10
|
+
type WaterfallCallback = (error?: unknown, ...results: unknown[]) => void;
|
|
11
|
+
declare function waterfall(chain: WaterfallStep[], args: unknown[], cb: WaterfallCallback, context?: unknown): void;
|
|
1
12
|
export = waterfall;
|
|
2
|
-
declare function waterfall(chain: any, args: any, cb: any, context: any): void;
|
|
@@ -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,13 +19,12 @@
|
|
|
18
19
|
* See the License for the specific language governing permissions and
|
|
19
20
|
* limitations under the License.
|
|
20
21
|
*/
|
|
21
|
-
"use strict";
|
|
22
22
|
class WaterfallContext {
|
|
23
23
|
/**
|
|
24
|
-
* @param
|
|
25
|
-
* @param
|
|
26
|
-
* @param
|
|
27
|
-
* @param
|
|
24
|
+
* @param chain - list of functions to call
|
|
25
|
+
* @param args - function arguments
|
|
26
|
+
* @param cb - end of waterfall callback
|
|
27
|
+
* @param cbCtx - functions context
|
|
28
28
|
*/
|
|
29
29
|
constructor(chain, args, cb, cbCtx) {
|
|
30
30
|
this.chain = chain;
|
|
@@ -37,9 +37,6 @@ class WaterfallContext {
|
|
|
37
37
|
// sure that all pipe methods receive the same payload
|
|
38
38
|
this.args = args.length ? args : [null];
|
|
39
39
|
}
|
|
40
|
-
hasNext() {
|
|
41
|
-
return this.index < this.chain.length;
|
|
42
|
-
}
|
|
43
40
|
/**
|
|
44
41
|
* Each function in the waterfall chain returns a result. This result should
|
|
45
42
|
* always be the 1st payload argument (updated or left intact, it matters not)
|
|
@@ -47,9 +44,30 @@ class WaterfallContext {
|
|
|
47
44
|
set result(result) {
|
|
48
45
|
this.args[0] = result;
|
|
49
46
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
this.
|
|
47
|
+
/** Whether every step of the chain has been run. */
|
|
48
|
+
get exhausted() {
|
|
49
|
+
return this.index >= this.chain.length;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Runs the next step against the current payload and advances.
|
|
53
|
+
*
|
|
54
|
+
* The two questions this file asks are about different things: `exhausted`
|
|
55
|
+
* is about the *chain*, this is about the *value*. Collapsing them into one
|
|
56
|
+
* truthiness test — which is what the first conversion did — resolves the
|
|
57
|
+
* waterfall early on a chain entry that is not callable, silently skipping
|
|
58
|
+
* every remaining step (TD-55, #2758). A pipe chain is where a plugin denies
|
|
59
|
+
* a request, so the one outcome it must not have is a silent success.
|
|
60
|
+
*
|
|
61
|
+
* The JavaScript called `undefined(...)` and let the `TypeError` reach
|
|
62
|
+
* `waterfallNext`'s `try`. The throw below is that, spelled, because
|
|
63
|
+
* `noUncheckedIndexedAccess` does not let the call be written directly.
|
|
64
|
+
*/
|
|
65
|
+
invokeNext(cb) {
|
|
66
|
+
const step = this.chain[this.index++];
|
|
67
|
+
if (step === undefined) {
|
|
68
|
+
throw new TypeError(`waterfall: chain step ${this.index - 1} is not a function`);
|
|
69
|
+
}
|
|
70
|
+
step(...this.args, cb);
|
|
53
71
|
}
|
|
54
72
|
reject(error) {
|
|
55
73
|
this.cb.call(this.cbCtx, error);
|
|
@@ -59,6 +77,13 @@ class WaterfallContext {
|
|
|
59
77
|
this.cb.call(this.cbCtx, null, ...this.args);
|
|
60
78
|
}
|
|
61
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* The declared `this` is what makes the accesses below check: the context is
|
|
82
|
+
* always the `WaterfallContext` bound at the call site.
|
|
83
|
+
*
|
|
84
|
+
* The suppression stays because it is ESLint's *core* `no-invalid-this`, which
|
|
85
|
+
* predates `this` parameters and cannot see the declaration.
|
|
86
|
+
*/
|
|
62
87
|
/* eslint-disable no-invalid-this */
|
|
63
88
|
function waterfallCB(err, res) {
|
|
64
89
|
if (err) {
|
|
@@ -71,12 +96,12 @@ function waterfallCB(err, res) {
|
|
|
71
96
|
}
|
|
72
97
|
/* eslint-enable no-invalid-this */
|
|
73
98
|
function waterfallNext(ctx) {
|
|
74
|
-
if (
|
|
99
|
+
if (ctx.exhausted) {
|
|
75
100
|
ctx.resolve();
|
|
76
101
|
return;
|
|
77
102
|
}
|
|
78
103
|
try {
|
|
79
|
-
ctx.
|
|
104
|
+
ctx.invokeNext(waterfallCB.bind(ctx));
|
|
80
105
|
}
|
|
81
106
|
catch (error) {
|
|
82
107
|
ctx.reject(error);
|