@nmshd/consumption 2.0.0-beta.3 → 2.0.0-beta.6

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.
@@ -17,10 +17,10 @@ const content_1 = __webpack_require__(/*! @nmshd/content */ "@nmshd/content");
17
17
  const crypto_1 = __webpack_require__(/*! @nmshd/crypto */ "@nmshd/crypto");
18
18
  const transport_1 = __webpack_require__(/*! @nmshd/transport */ "@nmshd/transport");
19
19
  exports.buildInformation = {
20
- version: "2.0.0-beta.3",
21
- build: "53",
22
- date: "2022-07-22T10:49:10+00:00",
23
- commit: "7af5e3a24a7d729403577ed228905468f1fccddc",
20
+ version: "2.0.0-beta.6",
21
+ build: "56",
22
+ date: "2022-08-03T08:10:05+00:00",
23
+ commit: "5b68e1cbedaab1e529c76a8afebca1ffccba5cf4",
24
24
  dependencies: {"@js-soft/docdb-querytranslator":"^1.1.0","ts-simple-nameof":"^1.3.1"},
25
25
  libraries: {
26
26
  transport: transport_1.buildInformation,
@@ -123,7 +123,8 @@ class ConsumptionController {
123
123
  [content_1.CreateAttributeRequestItem, modules_1.CreateAttributeRequestItemProcessor],
124
124
  [content_1.ReadAttributeRequestItem, modules_1.ReadAttributeRequestItemProcessor],
125
125
  [content_1.ProposeAttributeRequestItem, modules_1.ProposeAttributeRequestItemProcessor],
126
- [content_1.ShareAttributeRequestItem, modules_1.ShareAttributeRequestItemProcessor]
126
+ [content_1.ShareAttributeRequestItem, modules_1.ShareAttributeRequestItemProcessor],
127
+ [content_1.ConsentRequestItem, modules_1.GenericRequestItemProcessor]
127
128
  ]);
128
129
  }
129
130
  }
@@ -168,6 +169,7 @@ var ConsumptionControllerName;
168
169
 
169
170
  Object.defineProperty(exports, "__esModule", ({ value: true }));
170
171
  exports.ConsumptionErrors = void 0;
172
+ const ts_utils_1 = __webpack_require__(/*! @js-soft/ts-utils */ "./node_modules/@js-soft/ts-utils/dist/index.js");
171
173
  const transport_1 = __webpack_require__(/*! @nmshd/transport */ "@nmshd/transport");
172
174
  class Attributes {
173
175
  attributeExists(id) {
@@ -178,16 +180,42 @@ class Attributes {
178
180
  }
179
181
  }
180
182
  class Requests {
183
+ constructor() {
184
+ this.decideValidation = new Requests._decideValidation();
185
+ }
181
186
  requestExists(id) {
182
187
  return new transport_1.CoreError("error.consumption.requests.requestExists", `Request with id ${id} already exists and can't be created.`);
183
188
  }
184
189
  unexpectedErrorDuringRequestItemProcessing(error) {
185
- return new transport_1.CoreError("error.consumption.requests.unexpectedErrorDuringRequestItemProcessing", error instanceof Error ? error.message : "Unknown error: '${JSON.stringify(e)'");
190
+ return new transport_1.CoreError("error.consumption.requests.unexpectedErrorDuringRequestItemProcessing", error instanceof Error ? error.message : "Unknown error: '${JSON.stringify(e)'", undefined, undefined, error);
191
+ }
192
+ servalErrorDuringRequestItemProcessing(error) {
193
+ return new transport_1.CoreError("error.consumption.requests.servalErrorDuringRequestItemProcessing", error instanceof Error ? error.message : "Serval error: '${JSON.stringify(e)'", undefined, undefined, error);
186
194
  }
187
195
  invalidRequestItem(message) {
188
196
  return new transport_1.CoreError("error.consumption.requests.invalidRequestItem", message);
189
197
  }
190
198
  }
199
+ Requests._decideValidation = class {
200
+ invalidRequestId() {
201
+ return new ts_utils_1.ApplicationError("error.requests.decide.validation.invalidRequestId", "The id of the Request does not match the id of the Response");
202
+ }
203
+ invalidNumberOfItems(message) {
204
+ return new ts_utils_1.ApplicationError("error.requests.decide.validation.invalidNumberOfItems", message);
205
+ }
206
+ itemAcceptedButParentNotAccepted(message) {
207
+ return new ts_utils_1.ApplicationError("error.requests.decide.validation.itemAcceptedButParentNotAccepted", message);
208
+ }
209
+ mustBeAcceptedItemNotAccepted(message) {
210
+ return new ts_utils_1.ApplicationError("error.requests.decide.validation.mustBeAcceptedItemNotAccepted", message);
211
+ }
212
+ requestItemAnsweredAsRequestItemGroup() {
213
+ return new ts_utils_1.ApplicationError("error.requests.decide.validation.requestItemAnsweredAsRequestItemGroup", "The RequestItem was answered as a RequestItemGroup.");
214
+ }
215
+ requestItemGroupAnsweredAsRequestItem() {
216
+ return new ts_utils_1.ApplicationError("error.requests.decide.validation.requestItemGroupAnsweredAsRequestItem", "The RequestItemGroup was answered as a RequestItem.");
217
+ }
218
+ };
191
219
  class RelationshipInfo {
192
220
  relationshipInfoExists(relationshipId) {
193
221
  return new transport_1.CoreError("error.consumption.relationshipInfos.relationshipInfoExists", `RelationshipInfo for Relationship ${relationshipId} already exists.`);
@@ -1498,19 +1526,19 @@ __exportStar(__webpack_require__(/*! ./OutgoingRequestStatusChangedEvent */ "./d
1498
1526
 
1499
1527
  Object.defineProperty(exports, "__esModule", ({ value: true }));
1500
1528
  exports.DecideRequestParametersValidator = void 0;
1501
- const ts_utils_1 = __webpack_require__(/*! @js-soft/ts-utils */ "./node_modules/@js-soft/ts-utils/dist/index.js");
1502
1529
  const content_1 = __webpack_require__(/*! @nmshd/content */ "@nmshd/content");
1503
1530
  const transport_1 = __webpack_require__(/*! @nmshd/transport */ "@nmshd/transport");
1531
+ const consumption_1 = __webpack_require__(/*! ../../../consumption */ "./dist/consumption/index.js");
1504
1532
  const ValidationResult_1 = __webpack_require__(/*! ../itemProcessors/ValidationResult */ "./dist/modules/requests/itemProcessors/ValidationResult.js");
1505
1533
  const DecideRequestItemGroupParameters_1 = __webpack_require__(/*! ./decide/DecideRequestItemGroupParameters */ "./dist/modules/requests/incoming/decide/DecideRequestItemGroupParameters.js");
1506
1534
  const DecideRequestItemParameters_1 = __webpack_require__(/*! ./decide/DecideRequestItemParameters */ "./dist/modules/requests/incoming/decide/DecideRequestItemParameters.js");
1507
1535
  class DecideRequestParametersValidator {
1508
1536
  validate(params, request) {
1509
1537
  if (!request.id.equals(transport_1.CoreId.from(params.requestId))) {
1510
- return ValidationResult_1.ValidationResult.error(new ts_utils_1.ApplicationError("error.requests.decide.validation.invalidRequestId", "The id of the Request does not match the id of the Response"));
1538
+ return ValidationResult_1.ValidationResult.error(consumption_1.ConsumptionErrors.requests.decideValidation.invalidRequestId());
1511
1539
  }
1512
1540
  if (params.items.length !== request.content.items.length) {
1513
- return ValidationResult_1.ValidationResult.error(this.invalidNumberOfItemsError("Number of items in Request and Response do not match"));
1541
+ return ValidationResult_1.ValidationResult.error(consumption_1.ConsumptionErrors.requests.decideValidation.invalidNumberOfItems("Number of items in Request and Response do not match"));
1514
1542
  }
1515
1543
  const validationResults = request.content.items.map((requestItem, index) => this.checkItemOrGroup(requestItem, params.items[index], params.accept));
1516
1544
  return ValidationResult_1.ValidationResult.fromItems(validationResults);
@@ -1523,36 +1551,33 @@ class DecideRequestParametersValidator {
1523
1551
  }
1524
1552
  checkItem(requestItem, response, isParentAccepted) {
1525
1553
  if ((0, DecideRequestItemGroupParameters_1.isDecideRequestItemGroupParametersJSON)(response)) {
1526
- return ValidationResult_1.ValidationResult.error(new ts_utils_1.ApplicationError("error.requests.decide.validation.invalidResponseItemForRequestItem", "The RequestItem was answered as a RequestItemGroup."));
1554
+ return ValidationResult_1.ValidationResult.error(consumption_1.ConsumptionErrors.requests.decideValidation.requestItemAnsweredAsRequestItemGroup());
1527
1555
  }
1528
1556
  if (!isParentAccepted && response.accept) {
1529
- return ValidationResult_1.ValidationResult.error(new ts_utils_1.ApplicationError("error.requests.decide.validation.invalidResponseItemForRequestItem", "The RequestItem was accepted, but the parent was not accepted."));
1557
+ return ValidationResult_1.ValidationResult.error(consumption_1.ConsumptionErrors.requests.decideValidation.itemAcceptedButParentNotAccepted("The RequestItem was accepted, but the parent was not accepted."));
1530
1558
  }
1531
1559
  if (isParentAccepted && requestItem.mustBeAccepted && !response.accept) {
1532
- return ValidationResult_1.ValidationResult.error(new ts_utils_1.ApplicationError("error.requests.decide.validation.invalidResponseItemForRequestItem", "The RequestItem is flagged as 'mustBeAccepted', but it was not accepted."));
1560
+ return ValidationResult_1.ValidationResult.error(consumption_1.ConsumptionErrors.requests.decideValidation.mustBeAcceptedItemNotAccepted("The RequestItem is flagged as 'mustBeAccepted', but it was not accepted."));
1533
1561
  }
1534
1562
  return ValidationResult_1.ValidationResult.success();
1535
1563
  }
1536
1564
  checkItemGroup(requestItemGroup, responseItemGroup, isParentAccepted) {
1537
1565
  if ((0, DecideRequestItemParameters_1.isDecideRequestItemParametersJSON)(responseItemGroup)) {
1538
- return ValidationResult_1.ValidationResult.error(new ts_utils_1.ApplicationError("error.requests.decide.validation.invalidResponseItemForRequestItem", "The RequestItemGroup was answered as a RequestItem."));
1566
+ return ValidationResult_1.ValidationResult.error(consumption_1.ConsumptionErrors.requests.decideValidation.requestItemGroupAnsweredAsRequestItem());
1539
1567
  }
1540
1568
  if (responseItemGroup.items.length !== requestItemGroup.items.length) {
1541
- return ValidationResult_1.ValidationResult.error(this.invalidNumberOfItemsError("Number of items in RequestItemGroup and ResponseItemGroup do not match"));
1569
+ return ValidationResult_1.ValidationResult.error(consumption_1.ConsumptionErrors.requests.decideValidation.invalidNumberOfItems("Number of items in RequestItemGroup and ResponseItemGroup do not match"));
1542
1570
  }
1543
1571
  const isGroupAccepted = responseItemGroup.items.some((value) => value.accept);
1544
1572
  if (!isParentAccepted && isGroupAccepted) {
1545
- return ValidationResult_1.ValidationResult.error(new ts_utils_1.ApplicationError("error.requests.decide.validation.invalidResponseItemForRequestItem", "The RequestItemGroup was accepted, but the parent was not accepted."));
1573
+ return ValidationResult_1.ValidationResult.error(consumption_1.ConsumptionErrors.requests.decideValidation.itemAcceptedButParentNotAccepted("The RequestItemGroup was accepted, but the parent was not accepted."));
1546
1574
  }
1547
1575
  if (isParentAccepted && requestItemGroup.mustBeAccepted && !isGroupAccepted) {
1548
- return ValidationResult_1.ValidationResult.error(new ts_utils_1.ApplicationError("error.requests.decide.validation.invalidResponseItemForRequestItem", "The RequestItemGroup is flagged as 'mustBeAccepted', but it was not accepted. Please accept all 'mustBeAccepted' items in this group."));
1576
+ return ValidationResult_1.ValidationResult.error(consumption_1.ConsumptionErrors.requests.decideValidation.mustBeAcceptedItemNotAccepted("The RequestItemGroup is flagged as 'mustBeAccepted', but it was not accepted. Please accept all 'mustBeAccepted' items in this group."));
1549
1577
  }
1550
1578
  const validationResults = requestItemGroup.items.map((requestItem, index) => this.checkItem(requestItem, responseItemGroup.items[index], isGroupAccepted));
1551
1579
  return ValidationResult_1.ValidationResult.fromItems(validationResults);
1552
1580
  }
1553
- invalidNumberOfItemsError(message) {
1554
- return new ts_utils_1.ApplicationError("error.requests.decide.validation.invalidNumberOfItems", message);
1555
- }
1556
1581
  }
1557
1582
  exports.DecideRequestParametersValidator = DecideRequestParametersValidator;
1558
1583
  //# sourceMappingURL=DecideRequestParametersValidator.js.map
@@ -1569,6 +1594,7 @@ exports.DecideRequestParametersValidator = DecideRequestParametersValidator;
1569
1594
 
1570
1595
  Object.defineProperty(exports, "__esModule", ({ value: true }));
1571
1596
  exports.IncomingRequestsController = void 0;
1597
+ const ts_serval_1 = __webpack_require__(/*! @js-soft/ts-serval */ "@js-soft/ts-serval");
1572
1598
  const content_1 = __webpack_require__(/*! @nmshd/content */ "@nmshd/content");
1573
1599
  const transport_1 = __webpack_require__(/*! @nmshd/transport */ "@nmshd/transport");
1574
1600
  const consumption_1 = __webpack_require__(/*! ../../../consumption */ "./dist/consumption/index.js");
@@ -1721,12 +1747,14 @@ class IncomingRequestsController extends consumption_1.ConsumptionBaseController
1721
1747
  async canDecideItem(params, requestItem, request) {
1722
1748
  const processor = this.processorRegistry.getProcessorForItem(requestItem);
1723
1749
  try {
1724
- if (params.accept) {
1750
+ if (params.accept)
1725
1751
  return await processor.canAccept(requestItem, params, request);
1726
- }
1727
1752
  return await processor.canReject(requestItem, params, request);
1728
1753
  }
1729
1754
  catch (e) {
1755
+ if (e instanceof ts_serval_1.ServalError) {
1756
+ return ValidationResult_1.ValidationResult.error(consumption_1.ConsumptionErrors.requests.servalErrorDuringRequestItemProcessing(e));
1757
+ }
1730
1758
  return ValidationResult_1.ValidationResult.error(consumption_1.ConsumptionErrors.requests.unexpectedErrorDuringRequestItemProcessing(e));
1731
1759
  }
1732
1760
  }
@@ -1815,20 +1843,17 @@ class IncomingRequestsController extends consumption_1.ConsumptionBaseController
1815
1843
  throw new Error("Cannot decide own Request");
1816
1844
  }
1817
1845
  this.assertRequestStatus(request, LocalRequestStatus_1.LocalRequestStatus.Decided);
1818
- let responseSource;
1819
- if (parsedParams.responseSourceObject instanceof transport_1.Message) {
1820
- responseSource = "Message";
1821
- }
1822
- else if (parsedParams.responseSourceObject instanceof transport_1.RelationshipChange) {
1823
- responseSource = "RelationshipChange";
1846
+ const requestIsRejected = request.response.content.result === content_1.ResponseResult.Rejected;
1847
+ const requestIsFromTemplate = request.source.type === "RelationshipTemplate";
1848
+ if (parsedParams.responseSourceObject) {
1849
+ request.response.source = LocalResponse_1.LocalResponseSource.from({
1850
+ type: parsedParams.responseSourceObject instanceof transport_1.Message ? "Message" : "RelationshipChange",
1851
+ reference: parsedParams.responseSourceObject.id
1852
+ });
1824
1853
  }
1825
- else {
1826
- throw new Error("Unknown response source");
1854
+ else if (!requestIsRejected || !requestIsFromTemplate) {
1855
+ throw new Error("A Request can only be completed without a responseSource if the Request is rejected and the Request is from a Relationship Template");
1827
1856
  }
1828
- request.response.source = LocalResponse_1.LocalResponseSource.from({
1829
- type: responseSource,
1830
- reference: parsedParams.responseSourceObject.id
1831
- });
1832
1857
  request.changeStatus(LocalRequestStatus_1.LocalRequestStatus.Completed);
1833
1858
  await this.update(request);
1834
1859
  this.eventBus.publish(new events_1.IncomingRequestStatusChangedEvent(this.identity.address.toString(), {
@@ -1947,7 +1972,7 @@ __decorate([
1947
1972
  ], CompleteIncomingRequestParameters.prototype, "requestId", void 0);
1948
1973
  __decorate([
1949
1974
  (0, ts_serval_1.serialize)({ unionTypes: [transport_1.Message, transport_1.RelationshipChange] }),
1950
- (0, ts_serval_1.validate)(),
1975
+ (0, ts_serval_1.validate)({ nullable: true }),
1951
1976
  __metadata("design:type", Object)
1952
1977
  ], CompleteIncomingRequestParameters.prototype, "responseSourceObject", void 0);
1953
1978
  exports.CompleteIncomingRequestParameters = CompleteIncomingRequestParameters;
@@ -4173,12 +4198,19 @@ __webpack_require__(/*! reflect-metadata */ "./node_modules/reflect-metadata/Ref
4173
4198
  const EventBus_1 = __webpack_require__(/*! ../EventBus */ "./node_modules/@js-soft/ts-utils/dist/eventBus/EventBus.js");
4174
4199
  const SubscriptionTargetInfo_1 = __webpack_require__(/*! ../SubscriptionTargetInfo */ "./node_modules/@js-soft/ts-utils/dist/eventBus/SubscriptionTargetInfo.js");
4175
4200
  class EventEmitter2EventBus {
4201
+ errorCallback;
4176
4202
  emitter;
4177
4203
  listeners = new Map();
4178
4204
  nextId = 0;
4179
4205
  invocationPromises = [];
4180
- constructor(options) {
4181
- this.emitter = new eventemitter2_1.EventEmitter2({ ...options, wildcard: true, maxListeners: 50, verboseMemoryLeak: true });
4206
+ constructor(errorCallback, eventEmitter2Options) {
4207
+ this.errorCallback = errorCallback;
4208
+ this.emitter = new eventemitter2_1.EventEmitter2({
4209
+ maxListeners: 50,
4210
+ verboseMemoryLeak: true,
4211
+ ...eventEmitter2Options,
4212
+ wildcard: true
4213
+ });
4182
4214
  }
4183
4215
  subscribe(subscriptionTarget, handler) {
4184
4216
  return this.registerHandler(subscriptionTarget, handler);
@@ -4198,7 +4230,7 @@ class EventEmitter2EventBus {
4198
4230
  }
4199
4231
  const invocationPromise = (async () => await handler(event))();
4200
4232
  this.invocationPromises.push(invocationPromise);
4201
- await invocationPromise;
4233
+ await invocationPromise.catch((e) => this.errorCallback(e, subscriptionTargetInfo.namespace));
4202
4234
  this.invocationPromises = this.invocationPromises.filter((p) => p !== invocationPromise);
4203
4235
  if (isOneTimeHandler)
4204
4236
  this.listeners.delete(listenerId);
@@ -4262,7 +4294,11 @@ exports.EventEmitter2EventBus = EventEmitter2EventBus;
4262
4294
 
4263
4295
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4264
4296
  if (k2 === undefined) k2 = k;
4265
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4297
+ var desc = Object.getOwnPropertyDescriptor(m, k);
4298
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
4299
+ desc = { enumerable: true, get: function() { return m[k]; } };
4300
+ }
4301
+ Object.defineProperty(o, k2, desc);
4266
4302
  }) : (function(o, m, k, k2) {
4267
4303
  if (k2 === undefined) k2 = k;
4268
4304
  o[k2] = m[k];
@@ -4331,7 +4367,11 @@ exports.Event = Event;
4331
4367
 
4332
4368
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4333
4369
  if (k2 === undefined) k2 = k;
4334
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4370
+ var desc = Object.getOwnPropertyDescriptor(m, k);
4371
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
4372
+ desc = { enumerable: true, get: function() { return m[k]; } };
4373
+ }
4374
+ Object.defineProperty(o, k2, desc);
4335
4375
  }) : (function(o, m, k, k2) {
4336
4376
  if (k2 === undefined) k2 = k;
4337
4377
  o[k2] = m[k];
@@ -4356,7 +4396,11 @@ __exportStar(__webpack_require__(/*! ./Event */ "./node_modules/@js-soft/ts-util
4356
4396
 
4357
4397
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4358
4398
  if (k2 === undefined) k2 = k;
4359
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4399
+ var desc = Object.getOwnPropertyDescriptor(m, k);
4400
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
4401
+ desc = { enumerable: true, get: function() { return m[k]; } };
4402
+ }
4403
+ Object.defineProperty(o, k2, desc);
4360
4404
  }) : (function(o, m, k, k2) {
4361
4405
  if (k2 === undefined) k2 = k;
4362
4406
  o[k2] = m[k];
@@ -4481,6 +4525,9 @@ class ApplicationError extends Error {
4481
4525
  equals(error) {
4482
4526
  return this.code === error.code;
4483
4527
  }
4528
+ toString() {
4529
+ return JSON.stringify({ code: this.code, message: this.message, data: this.data }, undefined, 2);
4530
+ }
4484
4531
  }
4485
4532
  exports.ApplicationError = ApplicationError;
4486
4533
  //# sourceMappingURL=ApplicationError.js.map
@@ -4526,7 +4573,7 @@ class Result {
4526
4573
  }
4527
4574
  get value() {
4528
4575
  if (!this.isSuccess) {
4529
- throw new Error("Can't get the value of an error result. Use 'error' instead.");
4576
+ throw new Error(`Can't get the value of an error result. Use 'error' instead. Root error: \r\n${this.error}`);
4530
4577
  }
4531
4578
  return this._value;
4532
4579
  }
@@ -4552,7 +4599,11 @@ exports.Result = Result;
4552
4599
 
4553
4600
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4554
4601
  if (k2 === undefined) k2 = k;
4555
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4602
+ var desc = Object.getOwnPropertyDescriptor(m, k);
4603
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
4604
+ desc = { enumerable: true, get: function() { return m[k]; } };
4605
+ }
4606
+ Object.defineProperty(o, k2, desc);
4556
4607
  }) : (function(o, m, k, k2) {
4557
4608
  if (k2 === undefined) k2 = k;
4558
4609
  o[k2] = m[k];
@@ -4694,7 +4745,7 @@ var __WEBPACK_AMD_DEFINE_RESULT__;/*!
4694
4745
  var obj = {};
4695
4746
  var key;
4696
4747
  var len = keys.length;
4697
- var valuesCount = values ? value.length : 0;
4748
+ var valuesCount = values ? values.length : 0;
4698
4749
  for (var i = 0; i < len; i++) {
4699
4750
  key = keys[i];
4700
4751
  obj[key] = i < valuesCount ? values[i] : undefined;