@sap/cds 5.9.8 → 6.0.1
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/CHANGELOG.md +252 -20
- package/apis/services.d.ts +1 -1
- package/app/fiori/preview.js +2 -6
- package/app/index.js +3 -3
- package/bin/build/buildTaskEngine.js +17 -15
- package/bin/build/buildTaskFactory.js +29 -19
- package/bin/build/buildTaskHandler.js +27 -11
- package/bin/build/buildTaskProvider.js +2 -4
- package/bin/build/buildTaskProviderFactory.js +11 -16
- package/bin/build/constants.js +14 -6
- package/bin/build/csv-reader.js +2 -1
- package/bin/build/index.js +12 -18
- package/bin/build/provider/buildTaskHandlerEdmx.js +3 -39
- package/bin/build/provider/buildTaskHandlerFeatureToggles.js +149 -0
- package/bin/build/provider/buildTaskHandlerInternal.js +2 -3
- package/bin/build/provider/buildTaskProviderInternal.js +108 -239
- package/bin/build/provider/fiori/index.js +2 -2
- package/bin/build/provider/hana/2migration.js +11 -11
- package/bin/build/provider/hana/2tabledata.js +3 -3
- package/bin/build/provider/hana/index.js +89 -99
- package/bin/build/provider/hana/migrationtable.js +4 -3
- package/bin/build/provider/java/index.js +101 -0
- package/bin/build/provider/java-cf/index.js +1 -101
- package/bin/build/provider/mtx/index.js +83 -41
- package/bin/build/provider/mtx/resourcesTarBuilder.js +68 -0
- package/bin/build/provider/mtx-sidecar/index.js +80 -0
- package/bin/build/provider/node-cf/index.js +1 -308
- package/bin/build/provider/nodejs/index.js +189 -0
- package/bin/build/util.js +19 -31
- package/bin/cds.js +5 -3
- package/bin/deploy/to-hana/cfUtil.js +31 -6
- package/bin/deploy/to-hana/gitUtil.js +5 -3
- package/bin/deploy/to-hana/hana.js +9 -10
- package/bin/{build → deploy/to-hana}/mtaUtil.js +10 -9
- package/bin/mtx/in-cds.js +19 -7
- package/bin/serve.js +56 -21
- package/bin/utils/log.js +13 -30
- package/bin/version.js +4 -3
- package/common.cds +61 -16
- package/lib/compile/cdsc.js +3 -2
- package/lib/compile/etc/_localized.js +15 -14
- package/lib/compile/for/drafts.js +3 -4
- package/lib/compile/for/java.js +13 -10
- package/lib/compile/for/nodejs.js +8 -8
- package/lib/compile/for/odata.js +7 -12
- package/lib/compile/for/sql.js +5 -6
- package/lib/compile/index.js +5 -4
- package/lib/compile/load.js +9 -11
- package/lib/compile/minify.js +8 -5
- package/lib/compile/parse.js +4 -2
- package/lib/compile/resolve.js +18 -15
- package/lib/compile/to/edm.js +0 -1
- package/lib/compile/to/gql.js +3 -2
- package/lib/compile/to/json.js +24 -17
- package/lib/connect/bindings.js +3 -2
- package/lib/connect/index.js +5 -5
- package/lib/core/classes.js +74 -2
- package/lib/core/entities.js +52 -3
- package/lib/core/reflect.js +2 -1
- package/lib/deploy.js +11 -8
- package/lib/env/defaults.js +4 -3
- package/lib/env/index.js +71 -31
- package/lib/env/presets.js +1 -14
- package/lib/env/requires.js +70 -20
- package/lib/env/serviceBindings.js +147 -0
- package/lib/i18n/localize.js +22 -23
- package/lib/index.js +148 -144
- package/lib/log/errors.js +55 -12
- package/lib/log/format/kibana.js +1 -1
- package/lib/log/index.js +4 -0
- package/lib/ql/SELECT.js +7 -2
- package/lib/ql/Whereable.js +8 -2
- package/lib/ql/index.js +2 -2
- package/lib/req/assert.js +71 -0
- package/lib/req/cds-context.js +38 -70
- package/lib/req/context.js +34 -21
- package/lib/req/request.js +12 -18
- package/lib/req/response.js +6 -2
- package/lib/req/user.js +30 -22
- package/lib/serve/Service-api.js +17 -12
- package/lib/serve/Service-dispatch.js +5 -9
- package/lib/serve/Service-methods.js +4 -3
- package/lib/serve/Transaction.js +24 -21
- package/lib/serve/adapters.js +15 -5
- package/lib/serve/factory.js +23 -20
- package/lib/serve/index.js +51 -54
- package/lib/utils/axios.js +8 -12
- package/lib/utils/index.js +3 -3
- package/lib/utils/resources/index.js +1 -44
- package/lib/utils/resources/tar.js +2 -1
- package/lib/utils/tests.js +13 -15
- package/libx/_runtime/.eslintrc +1 -1
- package/libx/_runtime/audit/Service.js +6 -4
- package/libx/_runtime/audit/generic/personal/access.js +19 -43
- package/libx/_runtime/audit/generic/personal/index.js +40 -34
- package/libx/_runtime/audit/generic/personal/modification.js +11 -9
- package/libx/_runtime/audit/generic/personal/utils.js +13 -6
- package/libx/_runtime/audit/utils/v2.js +6 -3
- package/libx/_runtime/auth/index.js +71 -66
- package/libx/_runtime/auth/strategies/JWT.js +3 -2
- package/libx/_runtime/auth/strategies/mock.js +54 -53
- package/libx/_runtime/auth/strategies/xssecUtils.js +3 -4
- package/libx/_runtime/auth/strategies/xsuaa.js +3 -2
- package/libx/_runtime/auth/utils.js +2 -15
- package/libx/_runtime/cds-services/adapter/odata-v4/Dispatcher.js +127 -41
- package/libx/_runtime/cds-services/adapter/odata-v4/OData.js +6 -3
- package/libx/_runtime/cds-services/adapter/odata-v4/ODataRequest.js +93 -73
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/action.js +10 -45
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/create.js +5 -9
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/error.js +9 -5
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/metadata.js +4 -2
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/read.js +60 -53
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/request.js +1 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/handlers/update.js +15 -21
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/ExpressionToCQN.js +8 -15
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/expandToCQN.js +29 -41
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/index.js +1 -4
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/readToCQN.js +13 -13
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/selectToCQN.js +0 -7
- package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/utils.js +24 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/edm/EdmEntityContainer.js +1 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/uri/UriHelper.js +4 -3
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/utils/PrimitiveValueDecoder.js +4 -5
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/utils/ValueConverter.js +4 -3
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/validator/ValueValidator.js +5 -3
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/core/ResponseHeaderSetter.js +2 -0
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/DebugSerializingCommand.js +1 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/PresetResponseHeadersCommand.js +1 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/SerializingCommand.js +1 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/SetResponseHeadersCommand.js +1 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/ContextURLFactory.js +3 -2
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/ErrorJsonSerializer.js +3 -1
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/SerializerFactory.js +1 -0
- package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/TrustedResourceJsonSerializer.js +3 -3
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/data.js +36 -25
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/handlerUtils.js +100 -91
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/metaInfo.js +382 -0
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/oDataConfiguration.js +1 -4
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/omitValues.js +5 -6
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/readAfterWrite.js +77 -21
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/request.js +3 -11
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/result.js +91 -69
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/stream.js +27 -6
- package/libx/_runtime/cds-services/adapter/rest/utils/validation-checks.js +7 -17
- package/libx/_runtime/cds-services/services/Service.js +17 -76
- package/libx/_runtime/cds-services/services/utils/columns.js +6 -4
- package/libx/_runtime/cds-services/services/utils/compareJson.js +1 -53
- package/libx/_runtime/cds-services/services/utils/differ.js +15 -19
- package/libx/_runtime/cds-services/util/assert.js +107 -34
- package/libx/_runtime/cds.js +1 -31
- package/libx/_runtime/common/aspects/Association.js +40 -54
- package/libx/_runtime/common/aspects/any.js +61 -6
- package/libx/_runtime/common/aspects/entity.js +19 -79
- package/libx/_runtime/common/composition/data.js +2 -2
- package/libx/_runtime/common/composition/delete.js +8 -7
- package/libx/_runtime/common/composition/tree.js +10 -10
- package/libx/_runtime/common/composition/update.js +3 -2
- package/libx/_runtime/common/constants/events.js +15 -0
- package/libx/_runtime/common/error/entry.js +9 -3
- package/libx/_runtime/common/error/frontend.js +13 -19
- package/libx/_runtime/common/error/index.js +8 -3
- package/libx/_runtime/common/generic/auth/capabilities.js +2 -1
- package/libx/_runtime/common/generic/auth/constants.js +1 -4
- package/libx/_runtime/common/generic/auth/requires.js +1 -1
- package/libx/_runtime/common/generic/auth/restrict.js +12 -28
- package/libx/_runtime/common/generic/auth/restrictions.js +12 -4
- package/libx/_runtime/common/generic/auth/utils.js +2 -1
- package/libx/_runtime/common/generic/crud.js +9 -60
- package/libx/_runtime/common/generic/etag.js +41 -7
- package/libx/_runtime/common/generic/input.js +128 -66
- package/libx/_runtime/common/generic/paging.js +9 -3
- package/libx/_runtime/common/generic/put.js +2 -2
- package/libx/_runtime/common/generic/sorting.js +7 -3
- package/libx/_runtime/common/generic/temporal.js +0 -5
- package/libx/_runtime/common/i18n/messages.properties +2 -1
- package/libx/_runtime/common/utils/binary.js +69 -0
- package/libx/_runtime/common/utils/cqn.js +39 -14
- package/libx/_runtime/common/utils/cqn2cqn4sql.js +93 -59
- package/libx/_runtime/common/utils/csn.js +87 -85
- package/libx/_runtime/common/utils/dollar.js +8 -7
- package/libx/_runtime/common/utils/draft.js +1 -1
- package/libx/_runtime/common/utils/foreignKeyPropagations.js +23 -7
- package/libx/_runtime/common/utils/generateOnCond.js +2 -1
- package/libx/_runtime/common/utils/keys.js +30 -13
- package/libx/_runtime/common/utils/postProcessing.js +6 -1
- package/libx/_runtime/common/utils/quotingStyles.js +0 -23
- package/libx/_runtime/common/utils/resolveStructured.js +23 -26
- package/libx/_runtime/common/utils/resolveView.js +4 -1
- package/libx/_runtime/common/utils/rewriteAsterisks.js +3 -0
- package/libx/_runtime/common/utils/search2cqn4sql.js +4 -13
- package/libx/_runtime/common/utils/searchToLike.js +9 -13
- package/libx/_runtime/common/utils/streamProp.js +35 -0
- package/libx/_runtime/common/utils/structured.js +12 -18
- package/libx/_runtime/common/utils/template.js +3 -5
- package/libx/_runtime/common/utils/templateProcessor.js +22 -14
- package/libx/_runtime/common/utils/unionCqnTemplate.js +4 -14
- package/libx/_runtime/db/Service.js +2 -1
- package/libx/_runtime/db/expand/expand-v2.js +2 -2
- package/libx/_runtime/db/expand/expandCQNToJoin.js +7 -6
- package/libx/_runtime/db/generic/input.js +14 -17
- package/libx/_runtime/db/generic/integrity.js +1 -2
- package/libx/_runtime/db/generic/update.js +14 -1
- package/libx/_runtime/db/query/read.js +0 -1
- package/libx/_runtime/db/query/update.js +1 -1
- package/libx/_runtime/db/sql-builder/BaseBuilder.js +1 -1
- package/libx/_runtime/db/sql-builder/ExpressionBuilder.js +5 -31
- package/libx/_runtime/db/sql-builder/InsertBuilder.js +1 -1
- package/libx/_runtime/db/sql-builder/ReferenceBuilder.js +0 -9
- package/libx/_runtime/db/sql-builder/SelectBuilder.js +11 -10
- package/libx/_runtime/db/sql-builder/UpdateBuilder.js +2 -2
- package/libx/_runtime/db/sql-builder/annotations.js +1 -2
- package/libx/_runtime/db/utils/coloredTxCommands.js +5 -0
- package/libx/_runtime/db/utils/columns.js +1 -1
- package/libx/_runtime/db/utils/propagateForeignKeys.js +10 -2
- package/libx/_runtime/extensibility/activate.js +69 -0
- package/libx/_runtime/extensibility/add.js +41 -0
- package/libx/_runtime/extensibility/addExtension.js +68 -0
- package/libx/_runtime/extensibility/defaults.js +39 -0
- package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformREAD.js +0 -0
- package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformRESULT.js +2 -2
- package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformWRITE.js +2 -2
- package/libx/_runtime/extensibility/push.js +61 -0
- package/libx/_runtime/extensibility/service.js +21 -0
- package/libx/_runtime/extensibility/{uiflex/utils.js → utils.js} +39 -3
- package/libx/_runtime/extensibility/validation.js +53 -0
- package/libx/_runtime/extensibility/views.js +12 -0
- package/libx/_runtime/fiori/generic/activate.js +6 -4
- package/libx/_runtime/fiori/generic/before.js +17 -29
- package/libx/_runtime/fiori/generic/cancel.js +2 -4
- package/libx/_runtime/fiori/generic/delete.js +2 -4
- package/libx/_runtime/fiori/generic/edit.js +3 -7
- package/libx/_runtime/fiori/generic/index.js +31 -0
- package/libx/_runtime/fiori/generic/new.js +2 -4
- package/libx/_runtime/fiori/generic/patch.js +4 -8
- package/libx/_runtime/fiori/generic/prepare.js +2 -4
- package/libx/_runtime/fiori/generic/read.js +137 -162
- package/libx/_runtime/fiori/generic/readOverDraft.js +10 -4
- package/libx/_runtime/fiori/utils/handler.js +10 -5
- package/libx/_runtime/fiori/utils/where.js +1 -4
- package/libx/_runtime/hana/Service.js +14 -7
- package/libx/_runtime/hana/customBuilder/CustomSelectBuilder.js +1 -1
- package/libx/_runtime/hana/dynatrace.js +2 -2
- package/libx/_runtime/hana/localized.js +7 -6
- package/libx/_runtime/hana/pool.js +9 -6
- package/libx/_runtime/hana/search.js +2 -3
- package/libx/_runtime/hana/{searchToContains.js → search2Contains.js} +5 -2
- package/libx/_runtime/hana/search2cqn4sql.js +20 -17
- package/libx/_runtime/index.js +2 -6
- package/libx/_runtime/messaging/AMQPWebhookMessaging.js +11 -2
- package/libx/_runtime/messaging/common-utils/AMQPClient.js +4 -3
- package/libx/_runtime/messaging/common-utils/appId.js +9 -0
- package/libx/_runtime/messaging/common-utils/authorizedRequest.js +2 -18
- package/libx/_runtime/messaging/common-utils/connections.js +1 -1
- package/libx/_runtime/messaging/enterprise-messaging-shared.js +2 -2
- package/libx/_runtime/messaging/enterprise-messaging-utils/EMManagement.js +305 -231
- package/libx/_runtime/messaging/enterprise-messaging-utils/cloudEvents.js +2 -2
- package/libx/_runtime/messaging/enterprise-messaging-utils/options-management.js +15 -8
- package/libx/_runtime/messaging/enterprise-messaging-utils/options-messaging.js +57 -14
- package/libx/_runtime/messaging/enterprise-messaging.js +14 -19
- package/libx/_runtime/messaging/file-based.js +2 -1
- package/libx/_runtime/messaging/http-utils/token.js +18 -6
- package/libx/_runtime/messaging/message-queuing-utils/options-management.js +22 -12
- package/libx/_runtime/messaging/message-queuing-utils/options-messaging.js +27 -14
- package/libx/_runtime/messaging/message-queuing.js +138 -85
- package/libx/_runtime/messaging/outbox/utils.js +13 -7
- package/libx/_runtime/messaging/redis-messaging.js +0 -1
- package/libx/_runtime/messaging/service.js +4 -1
- package/libx/_runtime/remote/Service.js +24 -18
- package/libx/_runtime/remote/utils/client.js +84 -46
- package/libx/_runtime/remote/utils/data.js +23 -6
- package/libx/_runtime/sqlite/Service.js +14 -13
- package/libx/_runtime/sqlite/convertAssocToOneManaged.js +2 -0
- package/libx/_runtime/sqlite/customBuilder/CustomSelectBuilder.js +1 -0
- package/libx/_runtime/sqlite/execute.js +3 -9
- package/libx/_runtime/types/api.js +23 -11
- package/libx/common/utils/ucsn.js +15 -9
- package/libx/odata/afterburner.js +109 -29
- package/libx/odata/cqn2odata.js +48 -9
- package/libx/odata/grammar.pegjs +261 -157
- package/libx/odata/index.js +21 -9
- package/libx/odata/parseToCqn.js +8 -5
- package/libx/odata/parser.js +1 -1
- package/libx/odata/utils.js +13 -3
- package/libx/rest/RestAdapter.js +173 -113
- package/libx/rest/RestRequest.js +3 -2
- package/libx/rest/middleware/create.js +8 -6
- package/libx/rest/middleware/delete.js +6 -13
- package/libx/rest/middleware/error.js +1 -1
- package/libx/rest/middleware/input.js +6 -6
- package/libx/rest/middleware/operation.js +8 -3
- package/libx/rest/middleware/parse.js +3 -3
- package/libx/rest/middleware/payload.js +12 -0
- package/libx/rest/middleware/read.js +12 -2
- package/libx/rest/middleware/update.js +3 -3
- package/package.json +4 -6
- package/server.js +3 -44
- package/srv/extensibility-service.cds +56 -0
- package/srv/extensibility-service.js +1 -0
- package/srv/extensions.cds +8 -0
- package/srv/model-provider.cds +59 -0
- package/srv/model-provider.js +163 -0
- package/srv/mtx.cds +2 -0
- package/srv/mtx.js +22 -0
- package/srv/outbox.cds +2 -0
- package/tasks/enterprise-messaging-deploy.js +19 -12
- package/lib/serve/Service-compat.js +0 -36
- package/libx/_runtime/audit/generic/personal/constants.js +0 -4
- package/libx/_runtime/auth/strategies/dwc.js +0 -45
- package/libx/_runtime/cds-services/adapter/odata-v4/utils/dispatcherUtils.js +0 -56
- package/libx/_runtime/cds-services/adapter/rest/Rest.js +0 -183
- package/libx/_runtime/cds-services/adapter/rest/RestRequest.js +0 -67
- package/libx/_runtime/cds-services/adapter/rest/handlers/create.js +0 -82
- package/libx/_runtime/cds-services/adapter/rest/handlers/delete.js +0 -39
- package/libx/_runtime/cds-services/adapter/rest/handlers/operation.js +0 -63
- package/libx/_runtime/cds-services/adapter/rest/handlers/read.js +0 -52
- package/libx/_runtime/cds-services/adapter/rest/handlers/update.js +0 -81
- package/libx/_runtime/cds-services/adapter/rest/rest-to-cqn/index.js +0 -56
- package/libx/_runtime/cds-services/adapter/rest/rest-to-cqn/utils.js +0 -33
- package/libx/_runtime/cds-services/adapter/rest/to.js +0 -8
- package/libx/_runtime/cds-services/adapter/rest/utils/binary.js +0 -50
- package/libx/_runtime/cds-services/adapter/rest/utils/data.js +0 -117
- package/libx/_runtime/cds-services/adapter/rest/utils/header-checks.js +0 -14
- package/libx/_runtime/cds-services/adapter/rest/utils/key-value-utils.js +0 -30
- package/libx/_runtime/cds-services/adapter/rest/utils/parse-url.js +0 -250
- package/libx/_runtime/cds-services/adapter/rest/utils/result.js +0 -26
- package/libx/_runtime/cds-services/services/utils/handlerUtils.js +0 -200
- package/libx/_runtime/common/aspects/utils.js +0 -152
- package/libx/_runtime/common/toggles/handler.js +0 -21
- package/libx/_runtime/common/utils/extensibilityUtils.js +0 -18
- package/libx/_runtime/extensibility/mps/index.js +0 -5
- package/libx/_runtime/extensibility/mps/service.js +0 -111
- package/libx/_runtime/extensibility/mps/tar.js +0 -42
- package/libx/_runtime/extensibility/mps/utils.js +0 -11
- package/libx/_runtime/extensibility/uiflex/index.js +0 -54
- package/libx/_runtime/extensibility/uiflex/service.js +0 -276
- package/libx/_runtime/messaging/common-utils/naming-conventions.js +0 -20
- package/libx/_runtime/remote/utils/client-types.d.ts +0 -7
- package/libx/gql/GraphQLAdapter.js +0 -33
- package/libx/gql/constants/adapter.js +0 -69
- package/libx/gql/constants/cds.js +0 -18
- package/libx/gql/constants/graphql.js +0 -33
- package/libx/gql/readme.md +0 -1
- package/libx/gql/resolvers/crud/create.js +0 -20
- package/libx/gql/resolvers/crud/delete.js +0 -29
- package/libx/gql/resolvers/crud/index.js +0 -6
- package/libx/gql/resolvers/crud/read.js +0 -30
- package/libx/gql/resolvers/crud/update.js +0 -42
- package/libx/gql/resolvers/crud/utils/index.js +0 -36
- package/libx/gql/resolvers/field.js +0 -5
- package/libx/gql/resolvers/index.js +0 -7
- package/libx/gql/resolvers/mutation.js +0 -23
- package/libx/gql/resolvers/parse/ast/enrich.js +0 -52
- package/libx/gql/resolvers/parse/ast/fragment.js +0 -11
- package/libx/gql/resolvers/parse/ast/fromObject.js +0 -39
- package/libx/gql/resolvers/parse/ast/index.js +0 -3
- package/libx/gql/resolvers/parse/ast/meta.js +0 -4
- package/libx/gql/resolvers/parse/ast/variable.js +0 -7
- package/libx/gql/resolvers/parse/ast2cqn/columns.js +0 -44
- package/libx/gql/resolvers/parse/ast2cqn/entries.js +0 -31
- package/libx/gql/resolvers/parse/ast2cqn/index.js +0 -8
- package/libx/gql/resolvers/parse/ast2cqn/limit.js +0 -6
- package/libx/gql/resolvers/parse/ast2cqn/orderBy.js +0 -24
- package/libx/gql/resolvers/parse/ast2cqn/utils/index.js +0 -3
- package/libx/gql/resolvers/parse/ast2cqn/where.js +0 -70
- package/libx/gql/resolvers/parse/utils/index.js +0 -8
- package/libx/gql/resolvers/query.js +0 -13
- package/libx/gql/resolvers/root.js +0 -34
- package/libx/gql/schema/generate.js +0 -18
- package/libx/gql/schema/index.js +0 -5
- package/libx/gql/schema/mutation.js +0 -76
- package/libx/gql/schema/query.js +0 -108
- package/libx/gql/schema/typeDefMap.js +0 -45
- package/libx/gql/schema/utils/index.js +0 -54
- package/libx/gql/utils/index.js +0 -12
- package/libx/rest/middleware/auth.js +0 -20
- package/libx/rest/middleware/content.js +0 -19
- package/srv/flex.cds +0 -21
- package/srv/flex.js +0 -1
- package/srv/mps.cds +0 -23
- package/srv/mps.js +0 -1
- package/srv/outbox.js +0 -0
|
@@ -1,11 +1,18 @@
|
|
|
1
|
-
const _oa2 = management =>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
const _oa2 = (management, uaa) => {
|
|
2
|
+
const oa2 = {
|
|
3
|
+
...management,
|
|
4
|
+
oa2: {
|
|
5
|
+
client: management.oa2.clientid,
|
|
6
|
+
secret: management.oa2.clientsecret,
|
|
7
|
+
endpoint: management.oa2.tokenendpoint
|
|
8
|
+
}
|
|
7
9
|
}
|
|
8
|
-
|
|
10
|
+
if (uaa && uaa.certificate) {
|
|
11
|
+
oa2.oa2.mTLS = { cert: uaa.certificate, key: uaa.key }
|
|
12
|
+
oa2.oa2.endpoint = uaa.certurl
|
|
13
|
+
}
|
|
14
|
+
return oa2
|
|
15
|
+
}
|
|
9
16
|
|
|
10
17
|
module.exports = options => {
|
|
11
18
|
if (!options || !options.credentials || !options.credentials.management) {
|
|
@@ -13,5 +20,5 @@ module.exports = options => {
|
|
|
13
20
|
'No management credentials found. Hint: You need to bind your app to an Enterprise-Messaging service or provide the necessary credentials through environment variables.'
|
|
14
21
|
)
|
|
15
22
|
}
|
|
16
|
-
return _oa2(options.credentials.management[0])
|
|
23
|
+
return _oa2(options.credentials.management[0], options.credentials.uaa)
|
|
17
24
|
}
|
|
@@ -1,15 +1,25 @@
|
|
|
1
|
-
const _getOAuth2 = opts =>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
const _getOAuth2 = (opts, uaa) => {
|
|
2
|
+
const res = {
|
|
3
|
+
...opts,
|
|
4
|
+
oa2: {
|
|
5
|
+
client: opts.oa2.client || opts.oa2.clientid,
|
|
6
|
+
secret: opts.oa2.secret || opts.oa2.clientsecret,
|
|
7
|
+
endpoint: opts.oa2.endpoint || opts.oa2.tokenendpoint,
|
|
8
|
+
granttype: opts.oa2.granttype
|
|
9
|
+
}
|
|
8
10
|
}
|
|
9
|
-
|
|
11
|
+
if (uaa && uaa.certificate) {
|
|
12
|
+
res.oa2.endpoint = uaa.certurl + '/oauth/token'
|
|
13
|
+
res.oa2.mTLS = {
|
|
14
|
+
key: uaa.key,
|
|
15
|
+
cert: uaa.certificate
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return res
|
|
19
|
+
}
|
|
10
20
|
|
|
11
21
|
// protocols are: httprest or amqp10ws
|
|
12
|
-
const
|
|
22
|
+
const _getOpts = (options, protocol) => {
|
|
13
23
|
const opts =
|
|
14
24
|
options &&
|
|
15
25
|
options.credentials &&
|
|
@@ -19,12 +29,45 @@ const _optionsMessaging = (options, protocol) => {
|
|
|
19
29
|
throw new Error(
|
|
20
30
|
`No ${protocol} credentials found. Hint: You need to bind your app to an Enterprise-Messaging service or provide the necessary credentials through environment variables.`
|
|
21
31
|
)
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
32
|
+
return opts
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const optionsMessagingREST = options => {
|
|
36
|
+
const opts = _getOpts(options, 'httprest')
|
|
37
|
+
const res = _getOAuth2(opts, options.credentials.uaa)
|
|
38
|
+
return res
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const optionsMessagingAMQP = options => {
|
|
42
|
+
const res = _optionsMessagingAMQP(options)
|
|
43
|
+
if (options.amqp) res.amqp = options.amqp
|
|
44
|
+
return res
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const _optionsMessagingAMQP = options => {
|
|
48
|
+
const opts = _getOpts(options, 'amqp10ws')
|
|
49
|
+
if (options.credentials.uaa && options.credentials.uaa.certificate) {
|
|
50
|
+
// mTLS
|
|
51
|
+
const amqp = {
|
|
52
|
+
uri: opts.uri,
|
|
53
|
+
wss: {
|
|
54
|
+
key: Buffer.from(options.credentials.uaa.key),
|
|
55
|
+
cert: Buffer.from(options.credentials.uaa.certificate)
|
|
56
|
+
},
|
|
57
|
+
oa2: {
|
|
58
|
+
endpoint: options.credentials.uaa.certurl + '/oauth/token',
|
|
59
|
+
client: opts.oa2.client || opts.oa2.clientid,
|
|
60
|
+
secret: '',
|
|
61
|
+
request: {
|
|
62
|
+
key: Buffer.from(options.credentials.uaa.key),
|
|
63
|
+
cert: Buffer.from(options.credentials.uaa.certificate)
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return amqp
|
|
26
68
|
}
|
|
69
|
+
const res = _getOAuth2(opts, options.credentials.uaa)
|
|
27
70
|
return res
|
|
28
71
|
}
|
|
29
72
|
|
|
30
|
-
module.exports =
|
|
73
|
+
module.exports = { optionsMessagingREST, optionsMessagingAMQP }
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const cds = require('../cds.js')
|
|
2
2
|
const AMQPWebhookMessaging = require('./AMQPWebhookMessaging.js')
|
|
3
|
-
const
|
|
3
|
+
const { optionsMessagingREST } = require('./enterprise-messaging-utils/options-messaging.js')
|
|
4
4
|
const optionsManagement = require('./enterprise-messaging-utils/options-management.js')
|
|
5
5
|
const EMManagement = require('./enterprise-messaging-utils/EMManagement.js')
|
|
6
6
|
const optionsForSubdomain = require('./common-utils/optionsForSubdomain.js')
|
|
@@ -17,12 +17,12 @@ const BASE_PATH = '/messaging/enterprise-messaging'
|
|
|
17
17
|
const _checkAppURL = appURL => {
|
|
18
18
|
if (!appURL)
|
|
19
19
|
throw new Error(
|
|
20
|
-
'Enterprise Messaging: You need to provide an HTTPS endpoint to your application.\n\nHint: You can set the application URI in environment variable `VCAP_APPLICATION.application_uris[0]`. This is needed because incoming messages are delivered through HTTP via webhooks.\nExample: `{ ..., "VCAP_APPLICATION": { "application_uris": ["my-app.com"] } }`\nIn case you want to use Enterprise Messaging in shared (that means single-tenant) mode, you can use kind `enterprise-messaging-
|
|
20
|
+
'Enterprise Messaging: You need to provide an HTTPS endpoint to your application.\n\nHint: You can set the application URI in environment variable `VCAP_APPLICATION.application_uris[0]`. This is needed because incoming messages are delivered through HTTP via webhooks.\nExample: `{ ..., "VCAP_APPLICATION": { "application_uris": ["my-app.com"] } }`\nIn case you want to use Enterprise Messaging in shared (that means single-tenant) mode, you can use kind `enterprise-messaging-shared`.'
|
|
21
21
|
)
|
|
22
22
|
|
|
23
23
|
if (appURL.startsWith('https://localhost'))
|
|
24
24
|
throw new Error(
|
|
25
|
-
'The endpoint of your application is local and cannot be reached from Enterprise Messaging.\n\nHint: For local development you can set up a tunnel to your local endpoint and enter its public https endpoint in `VCAP_APPLICATION.application_uris[0]`.\nIn case you want to use Enterprise Messaging in shared (that means single-tenant) mode, you can use kind `enterprise-messaging-
|
|
25
|
+
'The endpoint of your application is local and cannot be reached from Enterprise Messaging.\n\nHint: For local development you can set up a tunnel to your local endpoint and enter its public https endpoint in `VCAP_APPLICATION.application_uris[0]`.\nIn case you want to use Enterprise Messaging in shared (that means single-tenant) mode, you can use kind `enterprise-messaging-shared`.'
|
|
26
26
|
)
|
|
27
27
|
}
|
|
28
28
|
|
|
@@ -78,7 +78,7 @@ class EnterpriseMessaging extends AMQPWebhookMessaging {
|
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
startListening() {
|
|
81
|
-
const doNotDeploy = cds.
|
|
81
|
+
const doNotDeploy = cds.mtx && !this.options.deployForProvider
|
|
82
82
|
if (doNotDeploy) this.LOG._info && this.LOG.info('Skipping deployment of messaging artifacts for provider account')
|
|
83
83
|
super.startListening({ doNotDeploy })
|
|
84
84
|
if (!doNotDeploy && this.subscribedTopics.size) {
|
|
@@ -97,7 +97,7 @@ class EnterpriseMessaging extends AMQPWebhookMessaging {
|
|
|
97
97
|
async listenToClient(cb) {
|
|
98
98
|
_checkAppURL(this.optionsApp.appURL)
|
|
99
99
|
registerWebhookEndpoints(BASE_PATH, this.queueName, this.LOG, cb)
|
|
100
|
-
if (cds.
|
|
100
|
+
if (cds.mtx) {
|
|
101
101
|
await this.addMTXHandlers()
|
|
102
102
|
registerDeployEndpoints(BASE_PATH, this.queueName, async (tenantInfo, options) => {
|
|
103
103
|
const result = { queue: this.queueName, succeeded: [], failed: [] }
|
|
@@ -127,10 +127,10 @@ class EnterpriseMessaging extends AMQPWebhookMessaging {
|
|
|
127
127
|
const optsManagementSwitched = _subdomain
|
|
128
128
|
? optionsForSubdomain.oa2ForSubdomain(optsManagement, _subdomain)
|
|
129
129
|
: optsManagement
|
|
130
|
-
const
|
|
131
|
-
const
|
|
132
|
-
? optionsForSubdomain.oa2ForSubdomain(
|
|
133
|
-
:
|
|
130
|
+
const _optionsMessagingREST = optionsMessagingREST(this.options)
|
|
131
|
+
const _optionsMessagingRESTSwitched = _subdomain
|
|
132
|
+
? optionsForSubdomain.oa2ForSubdomain(_optionsMessagingREST, _subdomain)
|
|
133
|
+
: _optionsMessagingREST
|
|
134
134
|
const optionsWebhook = { ...this.options.webhook }
|
|
135
135
|
delete optionsWebhook.waitingPeriod
|
|
136
136
|
|
|
@@ -138,7 +138,7 @@ class EnterpriseMessaging extends AMQPWebhookMessaging {
|
|
|
138
138
|
optionsManagement: optsManagementSwitched,
|
|
139
139
|
queueConfig,
|
|
140
140
|
queueName,
|
|
141
|
-
optionsMessagingREST:
|
|
141
|
+
optionsMessagingREST: _optionsMessagingRESTSwitched,
|
|
142
142
|
optionsWebhook,
|
|
143
143
|
optionsApp: this.optionsApp,
|
|
144
144
|
maxRetries: this.options.maxRetries,
|
|
@@ -153,35 +153,30 @@ class EnterpriseMessaging extends AMQPWebhookMessaging {
|
|
|
153
153
|
|
|
154
154
|
async emit(event, ...etc) {
|
|
155
155
|
const msg = this.message4(event, ...etc)
|
|
156
|
-
const
|
|
156
|
+
const _optionsMessagingREST = optionsMessagingREST(this.options)
|
|
157
157
|
const context = this.context || cds.context
|
|
158
158
|
const tenant = context && context.tenant
|
|
159
159
|
const topic = msg.event
|
|
160
160
|
const message = { ...(msg.headers || {}), data: msg.data }
|
|
161
|
-
let errMsg = `Message with topic "${topic}" could not be sent`
|
|
162
|
-
if (tenant) errMsg += ' (tenant: ' + tenant + ')'
|
|
163
161
|
|
|
164
162
|
await this.queued(() => {})()
|
|
165
163
|
|
|
166
164
|
try {
|
|
167
165
|
await authorizedRequest({
|
|
168
166
|
method: 'POST',
|
|
169
|
-
uri:
|
|
167
|
+
uri: _optionsMessagingREST.uri,
|
|
170
168
|
path: `/messagingrest/v1/topics/${encodeURIComponent(topic)}/messages`,
|
|
171
|
-
oa2:
|
|
169
|
+
oa2: _optionsMessagingREST.oa2,
|
|
172
170
|
tenant,
|
|
173
171
|
dataObj: message,
|
|
174
172
|
headers: {
|
|
175
173
|
'x-qos': 1
|
|
176
174
|
},
|
|
177
|
-
attemptInfo: () => this.LOG._info && this.LOG.info('Emit', { topic }),
|
|
178
|
-
errMsg,
|
|
179
|
-
target: { kind: 'MESSAGE', topic },
|
|
180
175
|
tokenStore: {}
|
|
181
176
|
})
|
|
182
177
|
} catch (e) {
|
|
183
178
|
// Note: If the topic rules don't allow the topic, we get a 403 (which is a strange choice by Event Mesh)
|
|
184
|
-
if (e
|
|
179
|
+
if (e && (e.statusCode === 400 || e.statusCode === 403)) e.unrecoverable = true
|
|
185
180
|
throw e
|
|
186
181
|
}
|
|
187
182
|
}
|
|
@@ -7,7 +7,7 @@ const MessagingService = require('./service.js')
|
|
|
7
7
|
|
|
8
8
|
class FileBasedMessaging extends MessagingService {
|
|
9
9
|
async init() {
|
|
10
|
-
this.file = resolve((this.options.credentials && this.options.credentials.file)
|
|
10
|
+
this.file = resolve(this.options.file || (this.options.credentials && this.options.credentials.file))
|
|
11
11
|
try {
|
|
12
12
|
await fs.lstat(this.file)
|
|
13
13
|
} catch (e) {
|
|
@@ -71,6 +71,7 @@ class FileBasedMessaging extends MessagingService {
|
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
73
|
this.watching = setInterval(watcher, this.options.interval || 500)
|
|
74
|
+
cds.on('shutdown', () => this.disconnect())
|
|
74
75
|
}
|
|
75
76
|
|
|
76
77
|
disconnect() {
|
|
@@ -7,18 +7,27 @@ const _errorObj = result => {
|
|
|
7
7
|
return errorObj
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
const requestToken = ({ client, secret, endpoint }, tenant, tokenStore) =>
|
|
10
|
+
const requestToken = ({ client, secret, endpoint, mTLS }, tenant, tokenStore) =>
|
|
11
11
|
new Promise((resolve, reject) => {
|
|
12
12
|
const options = {
|
|
13
13
|
host: endpoint.replace('/oauth/token', '').replace('https://', ''),
|
|
14
|
-
|
|
15
|
-
headers: {
|
|
16
|
-
Authorization: 'Basic ' + Buffer.from(client + ':' + secret).toString('base64')
|
|
17
|
-
}
|
|
14
|
+
headers: {}
|
|
18
15
|
}
|
|
16
|
+
if (mTLS) {
|
|
17
|
+
options.method = 'POST'
|
|
18
|
+
options.path = '/oauth/token'
|
|
19
|
+
options.headers['content-type'] = 'application/x-www-form-urlencoded'
|
|
20
|
+
options.cert = mTLS.cert
|
|
21
|
+
options.key = mTLS.key
|
|
22
|
+
} else {
|
|
23
|
+
options.method = 'GET'
|
|
24
|
+
options.path = '/oauth/token?grant_type=client_credentials&response_type=token'
|
|
25
|
+
options.headers.Authorization = 'Basic ' + Buffer.from(client + ':' + secret).toString('base64')
|
|
26
|
+
}
|
|
27
|
+
|
|
19
28
|
if (tenant) options.headers['x-zid'] = tenant
|
|
20
29
|
|
|
21
|
-
https.
|
|
30
|
+
const req = https.request(options, res => {
|
|
22
31
|
res.setEncoding('utf8')
|
|
23
32
|
let chunks = ''
|
|
24
33
|
res.on('data', chunk => {
|
|
@@ -33,6 +42,7 @@ const requestToken = ({ client, secret, endpoint }, tenant, tokenStore) =>
|
|
|
33
42
|
const json = JSON.parse(result.body)
|
|
34
43
|
if (!json.access_token) {
|
|
35
44
|
reject(_errorObj(result))
|
|
45
|
+
return
|
|
36
46
|
}
|
|
37
47
|
// store token on tokenStore
|
|
38
48
|
tokenStore.token = json.access_token
|
|
@@ -42,6 +52,8 @@ const requestToken = ({ client, secret, endpoint }, tenant, tokenStore) =>
|
|
|
42
52
|
}
|
|
43
53
|
})
|
|
44
54
|
})
|
|
55
|
+
if (options.method === 'POST') req.write(`client_id=${client}&grant_type=client_credentials&response_type=token`)
|
|
56
|
+
req.end()
|
|
45
57
|
})
|
|
46
58
|
|
|
47
59
|
module.exports = requestToken
|
|
@@ -1,24 +1,34 @@
|
|
|
1
1
|
const _checkRequiredCredentials = options => {
|
|
2
|
-
if (!options || !options.credentials || !options.credentials.management
|
|
2
|
+
if (!options || !options.credentials || !options.credentials.management) {
|
|
3
3
|
throw new Error(
|
|
4
|
-
'No
|
|
4
|
+
'No management credentials found. Hint: You need to bind your app to a Message-Queuing service or provide the necessary credentials through environment variables.'
|
|
5
5
|
)
|
|
6
6
|
}
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
const _oa2 =
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
...management
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
9
|
+
const _oa2 = credentials => {
|
|
10
|
+
const management = credentials.management
|
|
11
|
+
const oa2 = {
|
|
12
|
+
...management,
|
|
13
|
+
auth: {
|
|
14
|
+
...management.auth,
|
|
15
|
+
oauth2: {
|
|
16
|
+
client: management.auth.oauth2.clientId,
|
|
17
|
+
secret: management.auth.oauth2.clientSecret,
|
|
18
|
+
endpoint: management.auth.oauth2.tokenUrl
|
|
19
|
+
}
|
|
17
20
|
}
|
|
18
21
|
}
|
|
19
|
-
|
|
22
|
+
if (credentials.uaa && credentials.uaa.certificate) {
|
|
23
|
+
// mTLS
|
|
24
|
+
oa2.auth.oauth2.mTLS = { cert: credentials.uaa.certificate, key: credentials.uaa.key }
|
|
25
|
+
oa2.auth.oauth2.endpoint = credentials.uaa.certurl
|
|
26
|
+
}
|
|
27
|
+
return oa2
|
|
28
|
+
}
|
|
20
29
|
|
|
21
30
|
module.exports = options => {
|
|
22
31
|
_checkRequiredCredentials(options)
|
|
23
|
-
|
|
32
|
+
const oa2 = _oa2(options.credentials)
|
|
33
|
+
return oa2
|
|
24
34
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const _checkRequiredCredentials = options => {
|
|
2
|
-
if (!options || !options.credentials || !options.credentials.
|
|
2
|
+
if (!options || !options.credentials || !options.credentials.amqp10) {
|
|
3
3
|
throw new Error(
|
|
4
|
-
'No
|
|
4
|
+
'No amqp10 credentials found. Hint: You need to bind your app to a Message Queuing service or provide the necessary credentials through environment variables.'
|
|
5
5
|
)
|
|
6
6
|
}
|
|
7
7
|
}
|
|
@@ -10,18 +10,31 @@ module.exports = options => {
|
|
|
10
10
|
_checkRequiredCredentials(options)
|
|
11
11
|
const [host, port] = options.credentials.amqp10.url.replace(/^amqps:\/\//, '').split(':')
|
|
12
12
|
|
|
13
|
-
const amqp =
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
13
|
+
const amqp =
|
|
14
|
+
options.credentials.uaa && options.credentials.uaa.certificate
|
|
15
|
+
? {
|
|
16
|
+
uri: options.credentials.amqp10.url,
|
|
17
|
+
tls: {
|
|
18
|
+
key: Buffer.from(options.credentials.uaa.key),
|
|
19
|
+
cert: Buffer.from(options.credentials.uaa.certificate),
|
|
20
|
+
servername: host
|
|
21
|
+
},
|
|
22
|
+
sasl: {
|
|
23
|
+
mechanism: 'EXTERNAL'
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
: {
|
|
27
|
+
tls: {
|
|
28
|
+
servername: host,
|
|
29
|
+
host,
|
|
30
|
+
port: Number(port)
|
|
31
|
+
},
|
|
32
|
+
sasl: {
|
|
33
|
+
mechanism: 'PLAIN',
|
|
34
|
+
user: options.credentials.amqp10.auth.basic.userName,
|
|
35
|
+
password: options.credentials.amqp10.auth.basic.password
|
|
36
|
+
}
|
|
37
|
+
}
|
|
25
38
|
if (options.amqp) amqp.amqp = options.amqp
|
|
26
39
|
return amqp
|
|
27
40
|
}
|
|
@@ -15,110 +15,163 @@ class MQManagement {
|
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
async getQueue(queueName = this.queueName) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
18
|
+
this.LOG._info && this.LOG.info('Get queue', { queue: queueName })
|
|
19
|
+
try {
|
|
20
|
+
const res = await authorizedRequest({
|
|
21
|
+
method: 'GET',
|
|
22
|
+
uri: this.options.url,
|
|
23
|
+
path: `/v1/management/queues/${encodeURIComponent(queueName)}`,
|
|
24
|
+
oa2: this.options.auth.oauth2,
|
|
25
|
+
target: { kind: 'QUEUE', queue: queueName },
|
|
26
|
+
tokenStore: this
|
|
27
|
+
})
|
|
28
|
+
return res.body
|
|
29
|
+
} catch (e) {
|
|
30
|
+
const error = new Error(`Queue "${queueName}" could not be retrieved`)
|
|
31
|
+
error.code = 'GET_QUEUE_FAILED'
|
|
32
|
+
error.target = { kind: 'QUEUE', queue: queueName }
|
|
33
|
+
error.reason = e
|
|
34
|
+
this.LOG.error(error)
|
|
35
|
+
throw error
|
|
36
|
+
}
|
|
29
37
|
}
|
|
30
38
|
|
|
31
39
|
async getQueues() {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
this.LOG._info && this.LOG.info('Get queues')
|
|
41
|
+
try {
|
|
42
|
+
const res = await authorizedRequest({
|
|
43
|
+
method: 'GET',
|
|
44
|
+
uri: this.options.url,
|
|
45
|
+
path: `/v1/management/queues`,
|
|
46
|
+
oa2: this.options.auth.oauth2,
|
|
47
|
+
target: { kind: 'QUEUE' },
|
|
48
|
+
tokenStore: this
|
|
49
|
+
})
|
|
50
|
+
return res.body && res.body.results
|
|
51
|
+
} catch (e) {
|
|
52
|
+
const error = new Error(`Queues could not be retrieved`)
|
|
53
|
+
error.code = 'GET_QUEUES_FAILED'
|
|
54
|
+
error.target = { kind: 'QUEUE' }
|
|
55
|
+
error.reason = e
|
|
56
|
+
this.LOG.error(error)
|
|
57
|
+
throw error
|
|
58
|
+
}
|
|
43
59
|
}
|
|
44
60
|
|
|
45
|
-
createQueue(queueName = this.queueName) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
61
|
+
async createQueue(queueName = this.queueName) {
|
|
62
|
+
this.LOG._info && this.LOG.info('Create queue', { queue: queueName })
|
|
63
|
+
try {
|
|
64
|
+
const res = await authorizedRequest({
|
|
65
|
+
method: 'PUT',
|
|
66
|
+
uri: this.options.url,
|
|
67
|
+
path: `/v1/management/queues/${encodeURIComponent(queueName)}`,
|
|
68
|
+
oa2: this.options.auth.oauth2,
|
|
69
|
+
dataObj: this.queueConfig,
|
|
70
|
+
tokenStore: this
|
|
71
|
+
})
|
|
72
|
+
if (res.statusCode === 201) return true
|
|
73
|
+
} catch (e) {
|
|
74
|
+
const error = new Error(`Queue "${queueName}" could not be created`)
|
|
75
|
+
error.code = 'CREATE_QUEUE_FAILED'
|
|
76
|
+
error.target = { kind: 'QUEUE', queue: queueName }
|
|
77
|
+
error.reason = e
|
|
78
|
+
this.LOG.error(error)
|
|
79
|
+
throw error
|
|
80
|
+
}
|
|
57
81
|
}
|
|
58
82
|
|
|
59
|
-
deleteQueue(queueName = this.queueName) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
})
|
|
83
|
+
async deleteQueue(queueName = this.queueName) {
|
|
84
|
+
this.LOG._info && this.LOG.info('Delete queue', { queue: queueName })
|
|
85
|
+
try {
|
|
86
|
+
await authorizedRequest({
|
|
87
|
+
method: 'DELETE',
|
|
88
|
+
uri: this.options.url,
|
|
89
|
+
path: `/v1/management/queues/${encodeURIComponent(queueName)}`,
|
|
90
|
+
oa2: this.options.auth.oauth2,
|
|
91
|
+
tokenStore: this
|
|
92
|
+
})
|
|
93
|
+
} catch (e) {
|
|
94
|
+
const error = new Error(`Queue "${queueName}" could not be deleted`)
|
|
95
|
+
error.code = 'DELETE_QUEUE_FAILED'
|
|
96
|
+
error.target = { kind: 'QUEUE', queue: queueName }
|
|
97
|
+
error.reason = e
|
|
98
|
+
this.LOG.error(error)
|
|
99
|
+
throw error
|
|
100
|
+
}
|
|
70
101
|
}
|
|
71
102
|
|
|
72
103
|
async getSubscriptions(queueName = this.queueName) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
104
|
+
this.LOG._info && this.LOG.info('Get subscriptions', { queue: queueName })
|
|
105
|
+
try {
|
|
106
|
+
const res = await authorizedRequest({
|
|
107
|
+
method: 'GET',
|
|
108
|
+
uri: this.options.url,
|
|
109
|
+
path: `/v1/management/queues/${encodeURIComponent(queueName)}/subscriptions/topics`,
|
|
110
|
+
oa2: this.options.auth.oauth2,
|
|
111
|
+
tokenStore: this
|
|
112
|
+
})
|
|
113
|
+
return res.body
|
|
114
|
+
} catch (e) {
|
|
115
|
+
const error = new Error(`Subscriptions for "${queueName}" could not be retrieved`)
|
|
116
|
+
error.code = 'GET_SUBSCRIPTIONS_FAILED'
|
|
117
|
+
error.target = { kind: 'SUBSCRIPTION', queue: queueName }
|
|
118
|
+
error.reason = e
|
|
119
|
+
this.LOG.error(error)
|
|
120
|
+
throw error
|
|
121
|
+
}
|
|
84
122
|
}
|
|
85
123
|
|
|
86
|
-
createSubscription(topicPattern, queueName = this.queueName) {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
this.
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
})
|
|
124
|
+
async createSubscription(topicPattern, queueName = this.queueName) {
|
|
125
|
+
this.LOG._info && this.LOG.info('Create subscription', { topic: topicPattern, queue: queueName })
|
|
126
|
+
try {
|
|
127
|
+
const res = await authorizedRequest({
|
|
128
|
+
method: 'PUT',
|
|
129
|
+
uri: this.options.url,
|
|
130
|
+
path: `/v1/management/queues/${encodeURIComponent(queueName)}/subscriptions/topics/${encodeURIComponent(
|
|
131
|
+
topicPattern
|
|
132
|
+
)}`,
|
|
133
|
+
oa2: this.options.auth.oauth2,
|
|
134
|
+
tokenStore: this
|
|
135
|
+
})
|
|
136
|
+
if (res.statusCode === 201) return true
|
|
137
|
+
} catch (e) {
|
|
138
|
+
const error = new Error(`Subscription "${topicPattern}" could not be added to queue "${queueName}"`)
|
|
139
|
+
error.code = 'CREATE_SUBSCRIPTION_FAILED'
|
|
140
|
+
error.target = { kind: 'SUBSCRIPTION', queue: queueName, topic: topicPattern }
|
|
141
|
+
error.reason = e
|
|
142
|
+
this.LOG.error(error)
|
|
143
|
+
throw error
|
|
144
|
+
}
|
|
100
145
|
}
|
|
101
146
|
|
|
102
|
-
deleteSubscription(topicPattern, queueName = this.queueName) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
this.
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
147
|
+
async deleteSubscription(topicPattern, queueName = this.queueName) {
|
|
148
|
+
this.LOG._info && this.LOG.info('Delete subscription', { topic: topicPattern, queue: queueName })
|
|
149
|
+
try {
|
|
150
|
+
await authorizedRequest({
|
|
151
|
+
method: 'DELETE',
|
|
152
|
+
uri: this.options.url,
|
|
153
|
+
path: `/v1/management/queues/${encodeURIComponent(queueName)}/subscriptions/topics/${encodeURIComponent(
|
|
154
|
+
topicPattern
|
|
155
|
+
)}`,
|
|
156
|
+
oa2: this.options.auth.oauth2,
|
|
157
|
+
|
|
158
|
+
target: { kind: 'SUBSCRIPTION', queue: queueName, topic: topicPattern },
|
|
159
|
+
tokenStore: this
|
|
160
|
+
})
|
|
161
|
+
} catch (e) {
|
|
162
|
+
const error = new Error(`Subscription "${topicPattern}" could not be deleted from queue "${queueName}"`)
|
|
163
|
+
error.code = 'DELETE_SUBSCRIPTION_FAILED'
|
|
164
|
+
error.target = { kind: 'SUBSCRIPTION', queue: queueName, topic: topicPattern }
|
|
165
|
+
error.reason = e
|
|
166
|
+
this.LOG.error(error)
|
|
167
|
+
throw error
|
|
168
|
+
}
|
|
116
169
|
}
|
|
117
170
|
|
|
118
171
|
async createQueueAndSubscriptions() {
|
|
119
172
|
this.LOG._info && this.LOG.info(`Create messaging artifacts`)
|
|
120
173
|
const created = await this.createQueue()
|
|
121
|
-
if (created
|
|
174
|
+
if (!created) {
|
|
122
175
|
// We need to make sure to only keep our own subscriptions
|
|
123
176
|
const resGet = await this.getSubscriptions()
|
|
124
177
|
if (resGet && resGet.results && Array.isArray(resGet.results)) {
|