@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.
Files changed (381) hide show
  1. package/CHANGELOG.md +252 -20
  2. package/apis/services.d.ts +1 -1
  3. package/app/fiori/preview.js +2 -6
  4. package/app/index.js +3 -3
  5. package/bin/build/buildTaskEngine.js +17 -15
  6. package/bin/build/buildTaskFactory.js +29 -19
  7. package/bin/build/buildTaskHandler.js +27 -11
  8. package/bin/build/buildTaskProvider.js +2 -4
  9. package/bin/build/buildTaskProviderFactory.js +11 -16
  10. package/bin/build/constants.js +14 -6
  11. package/bin/build/csv-reader.js +2 -1
  12. package/bin/build/index.js +12 -18
  13. package/bin/build/provider/buildTaskHandlerEdmx.js +3 -39
  14. package/bin/build/provider/buildTaskHandlerFeatureToggles.js +149 -0
  15. package/bin/build/provider/buildTaskHandlerInternal.js +2 -3
  16. package/bin/build/provider/buildTaskProviderInternal.js +108 -239
  17. package/bin/build/provider/fiori/index.js +2 -2
  18. package/bin/build/provider/hana/2migration.js +11 -11
  19. package/bin/build/provider/hana/2tabledata.js +3 -3
  20. package/bin/build/provider/hana/index.js +89 -99
  21. package/bin/build/provider/hana/migrationtable.js +4 -3
  22. package/bin/build/provider/java/index.js +101 -0
  23. package/bin/build/provider/java-cf/index.js +1 -101
  24. package/bin/build/provider/mtx/index.js +83 -41
  25. package/bin/build/provider/mtx/resourcesTarBuilder.js +68 -0
  26. package/bin/build/provider/mtx-sidecar/index.js +80 -0
  27. package/bin/build/provider/node-cf/index.js +1 -308
  28. package/bin/build/provider/nodejs/index.js +189 -0
  29. package/bin/build/util.js +19 -31
  30. package/bin/cds.js +5 -3
  31. package/bin/deploy/to-hana/cfUtil.js +31 -6
  32. package/bin/deploy/to-hana/gitUtil.js +5 -3
  33. package/bin/deploy/to-hana/hana.js +9 -10
  34. package/bin/{build → deploy/to-hana}/mtaUtil.js +10 -9
  35. package/bin/mtx/in-cds.js +19 -7
  36. package/bin/serve.js +56 -21
  37. package/bin/utils/log.js +13 -30
  38. package/bin/version.js +4 -3
  39. package/common.cds +61 -16
  40. package/lib/compile/cdsc.js +3 -2
  41. package/lib/compile/etc/_localized.js +15 -14
  42. package/lib/compile/for/drafts.js +3 -4
  43. package/lib/compile/for/java.js +13 -10
  44. package/lib/compile/for/nodejs.js +8 -8
  45. package/lib/compile/for/odata.js +7 -12
  46. package/lib/compile/for/sql.js +5 -6
  47. package/lib/compile/index.js +5 -4
  48. package/lib/compile/load.js +9 -11
  49. package/lib/compile/minify.js +8 -5
  50. package/lib/compile/parse.js +4 -2
  51. package/lib/compile/resolve.js +18 -15
  52. package/lib/compile/to/edm.js +0 -1
  53. package/lib/compile/to/gql.js +3 -2
  54. package/lib/compile/to/json.js +24 -17
  55. package/lib/connect/bindings.js +3 -2
  56. package/lib/connect/index.js +5 -5
  57. package/lib/core/classes.js +74 -2
  58. package/lib/core/entities.js +52 -3
  59. package/lib/core/reflect.js +2 -1
  60. package/lib/deploy.js +11 -8
  61. package/lib/env/defaults.js +4 -3
  62. package/lib/env/index.js +71 -31
  63. package/lib/env/presets.js +1 -14
  64. package/lib/env/requires.js +70 -20
  65. package/lib/env/serviceBindings.js +147 -0
  66. package/lib/i18n/localize.js +22 -23
  67. package/lib/index.js +148 -144
  68. package/lib/log/errors.js +55 -12
  69. package/lib/log/format/kibana.js +1 -1
  70. package/lib/log/index.js +4 -0
  71. package/lib/ql/SELECT.js +7 -2
  72. package/lib/ql/Whereable.js +8 -2
  73. package/lib/ql/index.js +2 -2
  74. package/lib/req/assert.js +71 -0
  75. package/lib/req/cds-context.js +38 -70
  76. package/lib/req/context.js +34 -21
  77. package/lib/req/request.js +12 -18
  78. package/lib/req/response.js +6 -2
  79. package/lib/req/user.js +30 -22
  80. package/lib/serve/Service-api.js +17 -12
  81. package/lib/serve/Service-dispatch.js +5 -9
  82. package/lib/serve/Service-methods.js +4 -3
  83. package/lib/serve/Transaction.js +24 -21
  84. package/lib/serve/adapters.js +15 -5
  85. package/lib/serve/factory.js +23 -20
  86. package/lib/serve/index.js +51 -54
  87. package/lib/utils/axios.js +8 -12
  88. package/lib/utils/index.js +3 -3
  89. package/lib/utils/resources/index.js +1 -44
  90. package/lib/utils/resources/tar.js +2 -1
  91. package/lib/utils/tests.js +13 -15
  92. package/libx/_runtime/.eslintrc +1 -1
  93. package/libx/_runtime/audit/Service.js +6 -4
  94. package/libx/_runtime/audit/generic/personal/access.js +19 -43
  95. package/libx/_runtime/audit/generic/personal/index.js +40 -34
  96. package/libx/_runtime/audit/generic/personal/modification.js +11 -9
  97. package/libx/_runtime/audit/generic/personal/utils.js +13 -6
  98. package/libx/_runtime/audit/utils/v2.js +6 -3
  99. package/libx/_runtime/auth/index.js +71 -66
  100. package/libx/_runtime/auth/strategies/JWT.js +3 -2
  101. package/libx/_runtime/auth/strategies/mock.js +54 -53
  102. package/libx/_runtime/auth/strategies/xssecUtils.js +3 -4
  103. package/libx/_runtime/auth/strategies/xsuaa.js +3 -2
  104. package/libx/_runtime/auth/utils.js +2 -15
  105. package/libx/_runtime/cds-services/adapter/odata-v4/Dispatcher.js +127 -41
  106. package/libx/_runtime/cds-services/adapter/odata-v4/OData.js +6 -3
  107. package/libx/_runtime/cds-services/adapter/odata-v4/ODataRequest.js +93 -73
  108. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/action.js +10 -45
  109. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/create.js +5 -9
  110. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/error.js +9 -5
  111. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/metadata.js +4 -2
  112. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/read.js +60 -53
  113. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/request.js +1 -1
  114. package/libx/_runtime/cds-services/adapter/odata-v4/handlers/update.js +15 -21
  115. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/ExpressionToCQN.js +8 -15
  116. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/expandToCQN.js +29 -41
  117. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/index.js +1 -4
  118. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/readToCQN.js +13 -13
  119. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/selectToCQN.js +0 -7
  120. package/libx/_runtime/cds-services/adapter/odata-v4/odata-to-cqn/utils.js +24 -1
  121. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/edm/EdmEntityContainer.js +1 -1
  122. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/uri/UriHelper.js +4 -3
  123. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/utils/PrimitiveValueDecoder.js +4 -5
  124. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/utils/ValueConverter.js +4 -3
  125. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-commons/validator/ValueValidator.js +5 -3
  126. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/core/ResponseHeaderSetter.js +2 -0
  127. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/DebugSerializingCommand.js +1 -1
  128. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/PresetResponseHeadersCommand.js +1 -1
  129. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/SerializingCommand.js +1 -1
  130. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/invocation/SetResponseHeadersCommand.js +1 -1
  131. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/ContextURLFactory.js +3 -2
  132. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/ErrorJsonSerializer.js +3 -1
  133. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/SerializerFactory.js +1 -0
  134. package/libx/_runtime/cds-services/adapter/odata-v4/okra/odata-server/serializer/TrustedResourceJsonSerializer.js +3 -3
  135. package/libx/_runtime/cds-services/adapter/odata-v4/utils/data.js +36 -25
  136. package/libx/_runtime/cds-services/adapter/odata-v4/utils/handlerUtils.js +100 -91
  137. package/libx/_runtime/cds-services/adapter/odata-v4/utils/metaInfo.js +382 -0
  138. package/libx/_runtime/cds-services/adapter/odata-v4/utils/oDataConfiguration.js +1 -4
  139. package/libx/_runtime/cds-services/adapter/odata-v4/utils/omitValues.js +5 -6
  140. package/libx/_runtime/cds-services/adapter/odata-v4/utils/readAfterWrite.js +77 -21
  141. package/libx/_runtime/cds-services/adapter/odata-v4/utils/request.js +3 -11
  142. package/libx/_runtime/cds-services/adapter/odata-v4/utils/result.js +91 -69
  143. package/libx/_runtime/cds-services/adapter/odata-v4/utils/stream.js +27 -6
  144. package/libx/_runtime/cds-services/adapter/rest/utils/validation-checks.js +7 -17
  145. package/libx/_runtime/cds-services/services/Service.js +17 -76
  146. package/libx/_runtime/cds-services/services/utils/columns.js +6 -4
  147. package/libx/_runtime/cds-services/services/utils/compareJson.js +1 -53
  148. package/libx/_runtime/cds-services/services/utils/differ.js +15 -19
  149. package/libx/_runtime/cds-services/util/assert.js +107 -34
  150. package/libx/_runtime/cds.js +1 -31
  151. package/libx/_runtime/common/aspects/Association.js +40 -54
  152. package/libx/_runtime/common/aspects/any.js +61 -6
  153. package/libx/_runtime/common/aspects/entity.js +19 -79
  154. package/libx/_runtime/common/composition/data.js +2 -2
  155. package/libx/_runtime/common/composition/delete.js +8 -7
  156. package/libx/_runtime/common/composition/tree.js +10 -10
  157. package/libx/_runtime/common/composition/update.js +3 -2
  158. package/libx/_runtime/common/constants/events.js +15 -0
  159. package/libx/_runtime/common/error/entry.js +9 -3
  160. package/libx/_runtime/common/error/frontend.js +13 -19
  161. package/libx/_runtime/common/error/index.js +8 -3
  162. package/libx/_runtime/common/generic/auth/capabilities.js +2 -1
  163. package/libx/_runtime/common/generic/auth/constants.js +1 -4
  164. package/libx/_runtime/common/generic/auth/requires.js +1 -1
  165. package/libx/_runtime/common/generic/auth/restrict.js +12 -28
  166. package/libx/_runtime/common/generic/auth/restrictions.js +12 -4
  167. package/libx/_runtime/common/generic/auth/utils.js +2 -1
  168. package/libx/_runtime/common/generic/crud.js +9 -60
  169. package/libx/_runtime/common/generic/etag.js +41 -7
  170. package/libx/_runtime/common/generic/input.js +128 -66
  171. package/libx/_runtime/common/generic/paging.js +9 -3
  172. package/libx/_runtime/common/generic/put.js +2 -2
  173. package/libx/_runtime/common/generic/sorting.js +7 -3
  174. package/libx/_runtime/common/generic/temporal.js +0 -5
  175. package/libx/_runtime/common/i18n/messages.properties +2 -1
  176. package/libx/_runtime/common/utils/binary.js +69 -0
  177. package/libx/_runtime/common/utils/cqn.js +39 -14
  178. package/libx/_runtime/common/utils/cqn2cqn4sql.js +93 -59
  179. package/libx/_runtime/common/utils/csn.js +87 -85
  180. package/libx/_runtime/common/utils/dollar.js +8 -7
  181. package/libx/_runtime/common/utils/draft.js +1 -1
  182. package/libx/_runtime/common/utils/foreignKeyPropagations.js +23 -7
  183. package/libx/_runtime/common/utils/generateOnCond.js +2 -1
  184. package/libx/_runtime/common/utils/keys.js +30 -13
  185. package/libx/_runtime/common/utils/postProcessing.js +6 -1
  186. package/libx/_runtime/common/utils/quotingStyles.js +0 -23
  187. package/libx/_runtime/common/utils/resolveStructured.js +23 -26
  188. package/libx/_runtime/common/utils/resolveView.js +4 -1
  189. package/libx/_runtime/common/utils/rewriteAsterisks.js +3 -0
  190. package/libx/_runtime/common/utils/search2cqn4sql.js +4 -13
  191. package/libx/_runtime/common/utils/searchToLike.js +9 -13
  192. package/libx/_runtime/common/utils/streamProp.js +35 -0
  193. package/libx/_runtime/common/utils/structured.js +12 -18
  194. package/libx/_runtime/common/utils/template.js +3 -5
  195. package/libx/_runtime/common/utils/templateProcessor.js +22 -14
  196. package/libx/_runtime/common/utils/unionCqnTemplate.js +4 -14
  197. package/libx/_runtime/db/Service.js +2 -1
  198. package/libx/_runtime/db/expand/expand-v2.js +2 -2
  199. package/libx/_runtime/db/expand/expandCQNToJoin.js +7 -6
  200. package/libx/_runtime/db/generic/input.js +14 -17
  201. package/libx/_runtime/db/generic/integrity.js +1 -2
  202. package/libx/_runtime/db/generic/update.js +14 -1
  203. package/libx/_runtime/db/query/read.js +0 -1
  204. package/libx/_runtime/db/query/update.js +1 -1
  205. package/libx/_runtime/db/sql-builder/BaseBuilder.js +1 -1
  206. package/libx/_runtime/db/sql-builder/ExpressionBuilder.js +5 -31
  207. package/libx/_runtime/db/sql-builder/InsertBuilder.js +1 -1
  208. package/libx/_runtime/db/sql-builder/ReferenceBuilder.js +0 -9
  209. package/libx/_runtime/db/sql-builder/SelectBuilder.js +11 -10
  210. package/libx/_runtime/db/sql-builder/UpdateBuilder.js +2 -2
  211. package/libx/_runtime/db/sql-builder/annotations.js +1 -2
  212. package/libx/_runtime/db/utils/coloredTxCommands.js +5 -0
  213. package/libx/_runtime/db/utils/columns.js +1 -1
  214. package/libx/_runtime/db/utils/propagateForeignKeys.js +10 -2
  215. package/libx/_runtime/extensibility/activate.js +69 -0
  216. package/libx/_runtime/extensibility/add.js +41 -0
  217. package/libx/_runtime/extensibility/addExtension.js +68 -0
  218. package/libx/_runtime/extensibility/defaults.js +39 -0
  219. package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformREAD.js +0 -0
  220. package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformRESULT.js +2 -2
  221. package/libx/_runtime/extensibility/{uiflex/handler → handler}/transformWRITE.js +2 -2
  222. package/libx/_runtime/extensibility/push.js +61 -0
  223. package/libx/_runtime/extensibility/service.js +21 -0
  224. package/libx/_runtime/extensibility/{uiflex/utils.js → utils.js} +39 -3
  225. package/libx/_runtime/extensibility/validation.js +53 -0
  226. package/libx/_runtime/extensibility/views.js +12 -0
  227. package/libx/_runtime/fiori/generic/activate.js +6 -4
  228. package/libx/_runtime/fiori/generic/before.js +17 -29
  229. package/libx/_runtime/fiori/generic/cancel.js +2 -4
  230. package/libx/_runtime/fiori/generic/delete.js +2 -4
  231. package/libx/_runtime/fiori/generic/edit.js +3 -7
  232. package/libx/_runtime/fiori/generic/index.js +31 -0
  233. package/libx/_runtime/fiori/generic/new.js +2 -4
  234. package/libx/_runtime/fiori/generic/patch.js +4 -8
  235. package/libx/_runtime/fiori/generic/prepare.js +2 -4
  236. package/libx/_runtime/fiori/generic/read.js +137 -162
  237. package/libx/_runtime/fiori/generic/readOverDraft.js +10 -4
  238. package/libx/_runtime/fiori/utils/handler.js +10 -5
  239. package/libx/_runtime/fiori/utils/where.js +1 -4
  240. package/libx/_runtime/hana/Service.js +14 -7
  241. package/libx/_runtime/hana/customBuilder/CustomSelectBuilder.js +1 -1
  242. package/libx/_runtime/hana/dynatrace.js +2 -2
  243. package/libx/_runtime/hana/localized.js +7 -6
  244. package/libx/_runtime/hana/pool.js +9 -6
  245. package/libx/_runtime/hana/search.js +2 -3
  246. package/libx/_runtime/hana/{searchToContains.js → search2Contains.js} +5 -2
  247. package/libx/_runtime/hana/search2cqn4sql.js +20 -17
  248. package/libx/_runtime/index.js +2 -6
  249. package/libx/_runtime/messaging/AMQPWebhookMessaging.js +11 -2
  250. package/libx/_runtime/messaging/common-utils/AMQPClient.js +4 -3
  251. package/libx/_runtime/messaging/common-utils/appId.js +9 -0
  252. package/libx/_runtime/messaging/common-utils/authorizedRequest.js +2 -18
  253. package/libx/_runtime/messaging/common-utils/connections.js +1 -1
  254. package/libx/_runtime/messaging/enterprise-messaging-shared.js +2 -2
  255. package/libx/_runtime/messaging/enterprise-messaging-utils/EMManagement.js +305 -231
  256. package/libx/_runtime/messaging/enterprise-messaging-utils/cloudEvents.js +2 -2
  257. package/libx/_runtime/messaging/enterprise-messaging-utils/options-management.js +15 -8
  258. package/libx/_runtime/messaging/enterprise-messaging-utils/options-messaging.js +57 -14
  259. package/libx/_runtime/messaging/enterprise-messaging.js +14 -19
  260. package/libx/_runtime/messaging/file-based.js +2 -1
  261. package/libx/_runtime/messaging/http-utils/token.js +18 -6
  262. package/libx/_runtime/messaging/message-queuing-utils/options-management.js +22 -12
  263. package/libx/_runtime/messaging/message-queuing-utils/options-messaging.js +27 -14
  264. package/libx/_runtime/messaging/message-queuing.js +138 -85
  265. package/libx/_runtime/messaging/outbox/utils.js +13 -7
  266. package/libx/_runtime/messaging/redis-messaging.js +0 -1
  267. package/libx/_runtime/messaging/service.js +4 -1
  268. package/libx/_runtime/remote/Service.js +24 -18
  269. package/libx/_runtime/remote/utils/client.js +84 -46
  270. package/libx/_runtime/remote/utils/data.js +23 -6
  271. package/libx/_runtime/sqlite/Service.js +14 -13
  272. package/libx/_runtime/sqlite/convertAssocToOneManaged.js +2 -0
  273. package/libx/_runtime/sqlite/customBuilder/CustomSelectBuilder.js +1 -0
  274. package/libx/_runtime/sqlite/execute.js +3 -9
  275. package/libx/_runtime/types/api.js +23 -11
  276. package/libx/common/utils/ucsn.js +15 -9
  277. package/libx/odata/afterburner.js +109 -29
  278. package/libx/odata/cqn2odata.js +48 -9
  279. package/libx/odata/grammar.pegjs +261 -157
  280. package/libx/odata/index.js +21 -9
  281. package/libx/odata/parseToCqn.js +8 -5
  282. package/libx/odata/parser.js +1 -1
  283. package/libx/odata/utils.js +13 -3
  284. package/libx/rest/RestAdapter.js +173 -113
  285. package/libx/rest/RestRequest.js +3 -2
  286. package/libx/rest/middleware/create.js +8 -6
  287. package/libx/rest/middleware/delete.js +6 -13
  288. package/libx/rest/middleware/error.js +1 -1
  289. package/libx/rest/middleware/input.js +6 -6
  290. package/libx/rest/middleware/operation.js +8 -3
  291. package/libx/rest/middleware/parse.js +3 -3
  292. package/libx/rest/middleware/payload.js +12 -0
  293. package/libx/rest/middleware/read.js +12 -2
  294. package/libx/rest/middleware/update.js +3 -3
  295. package/package.json +4 -6
  296. package/server.js +3 -44
  297. package/srv/extensibility-service.cds +56 -0
  298. package/srv/extensibility-service.js +1 -0
  299. package/srv/extensions.cds +8 -0
  300. package/srv/model-provider.cds +59 -0
  301. package/srv/model-provider.js +163 -0
  302. package/srv/mtx.cds +2 -0
  303. package/srv/mtx.js +22 -0
  304. package/srv/outbox.cds +2 -0
  305. package/tasks/enterprise-messaging-deploy.js +19 -12
  306. package/lib/serve/Service-compat.js +0 -36
  307. package/libx/_runtime/audit/generic/personal/constants.js +0 -4
  308. package/libx/_runtime/auth/strategies/dwc.js +0 -45
  309. package/libx/_runtime/cds-services/adapter/odata-v4/utils/dispatcherUtils.js +0 -56
  310. package/libx/_runtime/cds-services/adapter/rest/Rest.js +0 -183
  311. package/libx/_runtime/cds-services/adapter/rest/RestRequest.js +0 -67
  312. package/libx/_runtime/cds-services/adapter/rest/handlers/create.js +0 -82
  313. package/libx/_runtime/cds-services/adapter/rest/handlers/delete.js +0 -39
  314. package/libx/_runtime/cds-services/adapter/rest/handlers/operation.js +0 -63
  315. package/libx/_runtime/cds-services/adapter/rest/handlers/read.js +0 -52
  316. package/libx/_runtime/cds-services/adapter/rest/handlers/update.js +0 -81
  317. package/libx/_runtime/cds-services/adapter/rest/rest-to-cqn/index.js +0 -56
  318. package/libx/_runtime/cds-services/adapter/rest/rest-to-cqn/utils.js +0 -33
  319. package/libx/_runtime/cds-services/adapter/rest/to.js +0 -8
  320. package/libx/_runtime/cds-services/adapter/rest/utils/binary.js +0 -50
  321. package/libx/_runtime/cds-services/adapter/rest/utils/data.js +0 -117
  322. package/libx/_runtime/cds-services/adapter/rest/utils/header-checks.js +0 -14
  323. package/libx/_runtime/cds-services/adapter/rest/utils/key-value-utils.js +0 -30
  324. package/libx/_runtime/cds-services/adapter/rest/utils/parse-url.js +0 -250
  325. package/libx/_runtime/cds-services/adapter/rest/utils/result.js +0 -26
  326. package/libx/_runtime/cds-services/services/utils/handlerUtils.js +0 -200
  327. package/libx/_runtime/common/aspects/utils.js +0 -152
  328. package/libx/_runtime/common/toggles/handler.js +0 -21
  329. package/libx/_runtime/common/utils/extensibilityUtils.js +0 -18
  330. package/libx/_runtime/extensibility/mps/index.js +0 -5
  331. package/libx/_runtime/extensibility/mps/service.js +0 -111
  332. package/libx/_runtime/extensibility/mps/tar.js +0 -42
  333. package/libx/_runtime/extensibility/mps/utils.js +0 -11
  334. package/libx/_runtime/extensibility/uiflex/index.js +0 -54
  335. package/libx/_runtime/extensibility/uiflex/service.js +0 -276
  336. package/libx/_runtime/messaging/common-utils/naming-conventions.js +0 -20
  337. package/libx/_runtime/remote/utils/client-types.d.ts +0 -7
  338. package/libx/gql/GraphQLAdapter.js +0 -33
  339. package/libx/gql/constants/adapter.js +0 -69
  340. package/libx/gql/constants/cds.js +0 -18
  341. package/libx/gql/constants/graphql.js +0 -33
  342. package/libx/gql/readme.md +0 -1
  343. package/libx/gql/resolvers/crud/create.js +0 -20
  344. package/libx/gql/resolvers/crud/delete.js +0 -29
  345. package/libx/gql/resolvers/crud/index.js +0 -6
  346. package/libx/gql/resolvers/crud/read.js +0 -30
  347. package/libx/gql/resolvers/crud/update.js +0 -42
  348. package/libx/gql/resolvers/crud/utils/index.js +0 -36
  349. package/libx/gql/resolvers/field.js +0 -5
  350. package/libx/gql/resolvers/index.js +0 -7
  351. package/libx/gql/resolvers/mutation.js +0 -23
  352. package/libx/gql/resolvers/parse/ast/enrich.js +0 -52
  353. package/libx/gql/resolvers/parse/ast/fragment.js +0 -11
  354. package/libx/gql/resolvers/parse/ast/fromObject.js +0 -39
  355. package/libx/gql/resolvers/parse/ast/index.js +0 -3
  356. package/libx/gql/resolvers/parse/ast/meta.js +0 -4
  357. package/libx/gql/resolvers/parse/ast/variable.js +0 -7
  358. package/libx/gql/resolvers/parse/ast2cqn/columns.js +0 -44
  359. package/libx/gql/resolvers/parse/ast2cqn/entries.js +0 -31
  360. package/libx/gql/resolvers/parse/ast2cqn/index.js +0 -8
  361. package/libx/gql/resolvers/parse/ast2cqn/limit.js +0 -6
  362. package/libx/gql/resolvers/parse/ast2cqn/orderBy.js +0 -24
  363. package/libx/gql/resolvers/parse/ast2cqn/utils/index.js +0 -3
  364. package/libx/gql/resolvers/parse/ast2cqn/where.js +0 -70
  365. package/libx/gql/resolvers/parse/utils/index.js +0 -8
  366. package/libx/gql/resolvers/query.js +0 -13
  367. package/libx/gql/resolvers/root.js +0 -34
  368. package/libx/gql/schema/generate.js +0 -18
  369. package/libx/gql/schema/index.js +0 -5
  370. package/libx/gql/schema/mutation.js +0 -76
  371. package/libx/gql/schema/query.js +0 -108
  372. package/libx/gql/schema/typeDefMap.js +0 -45
  373. package/libx/gql/schema/utils/index.js +0 -54
  374. package/libx/gql/utils/index.js +0 -12
  375. package/libx/rest/middleware/auth.js +0 -20
  376. package/libx/rest/middleware/content.js +0 -19
  377. package/srv/flex.cds +0 -21
  378. package/srv/flex.js +0 -1
  379. package/srv/mps.cds +0 -23
  380. package/srv/mps.js +0 -1
  381. package/srv/outbox.js +0 -0
@@ -1,11 +1,18 @@
1
- const _oa2 = management => ({
2
- ...management,
3
- oa2: {
4
- client: management.oa2.clientid,
5
- secret: management.oa2.clientsecret,
6
- endpoint: management.oa2.tokenendpoint
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
- ...opts,
3
- oa2: {
4
- client: opts.oa2.client || opts.oa2.clientid,
5
- secret: opts.oa2.secret || opts.oa2.clientsecret,
6
- endpoint: opts.oa2.endpoint || opts.oa2.tokenendpoint,
7
- granttype: opts.oa2.granttype
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 _optionsMessaging = (options, protocol) => {
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
- const res = _getOAuth2(opts)
23
- if (options.amqp) {
24
- if (!res.amqp) res.amqp = options.amqp
25
- else Object.assign(res.amqp, options.amqp)
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 = _optionsMessaging
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 optionsMessaging = require('./enterprise-messaging-utils/options-messaging.js')
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-amqp`.'
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-amqp`.'
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._mtxEnabled && !this.options.deployForProvider
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._mtxEnabled) {
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 optionsMessagingREST = optionsMessaging(this.options, 'httprest')
131
- const optionsMessagingRESTSwitched = _subdomain
132
- ? optionsForSubdomain.oa2ForSubdomain(optionsMessagingREST, _subdomain)
133
- : optionsMessagingREST
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: optionsMessagingRESTSwitched,
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 optionsMessagingREST = optionsMessaging(this.options, 'httprest')
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: optionsMessagingREST.uri,
167
+ uri: _optionsMessagingREST.uri,
170
168
  path: `/messagingrest/v1/topics/${encodeURIComponent(topic)}/messages`,
171
- oa2: optionsMessagingREST.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.response && (e.response.statusCode === 400 || e.response.statusCode === 403)) e.unrecoverable = true
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) || '~/.cds-msg-box')
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
- path: '/oauth/token?grant_type=client_credentials&response_type=token',
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.get(options, res => {
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 || !options.credentials.amqp10) {
2
+ if (!options || !options.credentials || !options.credentials.management) {
3
3
  throw new Error(
4
- 'No messaging credentials found. Hint: You need to bind your app to a Message-Queuing service or provide the necessary credentials through environment variables.'
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 = management => ({
10
- ...management,
11
- auth: {
12
- ...management.auth,
13
- oauth2: {
14
- client: management.auth.oauth2.clientId,
15
- secret: management.auth.oauth2.clientSecret,
16
- endpoint: management.auth.oauth2.tokenUrl
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
- return _oa2(options.credentials.management)
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.management || !options.credentials.amqp10) {
2
+ if (!options || !options.credentials || !options.credentials.amqp10) {
3
3
  throw new Error(
4
- 'No amqp10ws credentials found. Hint: You need to bind your app to a Message Queuing service or provide the necessary credentials through environment variables.'
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
- tls: {
15
- servername: host,
16
- host,
17
- port: Number(port)
18
- },
19
- sasl: {
20
- mechanism: 'PLAIN',
21
- user: options.credentials.amqp10.auth.basic.userName,
22
- password: options.credentials.amqp10.auth.basic.password
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
- const res = await authorizedRequest({
19
- method: 'GET',
20
- uri: this.options.url,
21
- path: `/v1/management/queues/${encodeURIComponent(queueName)}`,
22
- oa2: this.options.auth.oauth2,
23
- attemptInfo: () => this.LOG._info && this.LOG.info('Get queue', { queue: queueName }),
24
- errMsg: `Queue "${queueName}" could not be retrieved`,
25
- target: { kind: 'QUEUE', queue: queueName },
26
- tokenStore: this
27
- })
28
- return res.body
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
- const res = await authorizedRequest({
33
- method: 'GET',
34
- uri: this.options.url,
35
- path: `/v1/management/queues`,
36
- oa2: this.options.auth.oauth2,
37
- attemptInfo: () => this.LOG._info && this.LOG.info('Get queues'),
38
- errMsg: `Queues could not be retrieved`,
39
- target: { kind: 'QUEUE' },
40
- tokenStore: this
41
- })
42
- return res.body && res.body.results
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
- return authorizedRequest({
47
- method: 'PUT',
48
- uri: this.options.url,
49
- path: `/v1/management/queues/${encodeURIComponent(queueName)}`,
50
- oa2: this.options.auth.oauth2,
51
- dataObj: this.queueConfig,
52
- attemptInfo: () => this.LOG._info && this.LOG.info('Create queue', { queue: queueName }),
53
- errMsg: `Queue "${queueName}" could not be created`,
54
- target: { kind: 'QUEUE', queue: queueName },
55
- tokenStore: this
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
- return authorizedRequest({
61
- method: 'DELETE',
62
- uri: this.options.url,
63
- path: `/v1/management/queues/${encodeURIComponent(queueName)}`,
64
- oa2: this.options.auth.oauth2,
65
- attemptInfo: () => this.LOG._info && this.LOG.info('Delete queue', { queue: queueName }),
66
- errMsg: `Queue "${queueName}" could not be deleted`,
67
- target: { kind: 'QUEUE', queue: queueName },
68
- tokenStore: this
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
- const res = await authorizedRequest({
74
- method: 'GET',
75
- uri: this.options.url,
76
- path: `/v1/management/queues/${encodeURIComponent(queueName)}/subscriptions/topics`,
77
- oa2: this.options.auth.oauth2,
78
- attemptInfo: () => this.LOG._info && this.LOG.info('Get subscriptions', { queue: queueName }),
79
- errMsg: `Subscriptions for "${queueName}" could not be retrieved`,
80
- target: { kind: 'SUBSCRIPTION', queue: queueName },
81
- tokenStore: this
82
- })
83
- return res.body
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
- return authorizedRequest({
88
- method: 'PUT',
89
- uri: this.options.url,
90
- path: `/v1/management/queues/${encodeURIComponent(queueName)}/subscriptions/topics/${encodeURIComponent(
91
- topicPattern
92
- )}`,
93
- oa2: this.options.auth.oauth2,
94
- attemptInfo: () =>
95
- this.LOG._info && this.LOG.info('Create subscription', { topic: topicPattern, queue: queueName }),
96
- errMsg: `Subscription "${topicPattern}" could not be added to queue "${queueName}"`,
97
- target: { kind: 'SUBSCRIPTION', queue: queueName, topic: topicPattern },
98
- tokenStore: this
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
- return authorizedRequest({
104
- method: 'DELETE',
105
- uri: this.options.url,
106
- path: `/v1/management/queues/${encodeURIComponent(queueName)}/subscriptions/topics/${encodeURIComponent(
107
- topicPattern
108
- )}`,
109
- oa2: this.options.auth.oauth2,
110
- attemptInfo: () =>
111
- this.LOG._info && this.LOG.info('Delete subscription', { topic: topicPattern, queue: queueName }),
112
- errMsg: `Subscription "${topicPattern}" could not be deleted from queue "${queueName}"`,
113
- target: { kind: 'SUBSCRIPTION', queue: queueName, topic: topicPattern },
114
- tokenStore: this
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 && created.statusCode === 200) {
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)) {