@castore/core
Advanced tools
Comparing version 1.4.4 to 1.5.0
@@ -10,2 +10,6 @@ "use strict"; | ||
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); | ||
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); | ||
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); | ||
@@ -17,2 +21,4 @@ | ||
var _errors = require("../errors"); | ||
var tuple = function tuple() { | ||
@@ -32,4 +38,25 @@ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { | ||
var Command = /*#__PURE__*/(0, _createClass2["default"])(function Command(_ref) { | ||
var _this = this; | ||
var commandId = _ref.commandId, | ||
requiredEventStores = _ref.requiredEventStores, | ||
_ref$eventAlreadyExis = _ref.eventAlreadyExistsRetries, | ||
eventAlreadyExistsRetries = _ref$eventAlreadyExis === void 0 ? 2 : _ref$eventAlreadyExis, | ||
_ref$onEventAlreadyEx = _ref.onEventAlreadyExists, | ||
onEventAlreadyExists = _ref$onEventAlreadyEx === void 0 ? /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() { | ||
return _regenerator["default"].wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
return _context.abrupt("return", new Promise(function (resolve) { | ||
return resolve(); | ||
})); | ||
case 1: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee); | ||
})) : _ref$onEventAlreadyEx, | ||
handler = _ref.handler; | ||
@@ -40,8 +67,85 @@ (0, _classCallCheck2["default"])(this, Command); | ||
(0, _defineProperty2["default"])(this, "requiredEventStores", void 0); | ||
(0, _defineProperty2["default"])(this, "eventAlreadyExistsRetries", void 0); | ||
(0, _defineProperty2["default"])(this, "onEventAlreadyExists", void 0); | ||
(0, _defineProperty2["default"])(this, "handler", void 0); | ||
this.commandId = commandId; | ||
this.requiredEventStores = requiredEventStores; | ||
this.handler = handler; | ||
this.eventAlreadyExistsRetries = eventAlreadyExistsRetries; | ||
this.onEventAlreadyExists = onEventAlreadyExists; | ||
this.handler = /*#__PURE__*/function () { | ||
var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(input, eventStores) { | ||
var retriesLeft, attemptNumber, output; | ||
return _regenerator["default"].wrap(function _callee2$(_context2) { | ||
while (1) { | ||
switch (_context2.prev = _context2.next) { | ||
case 0: | ||
retriesLeft = _this.eventAlreadyExistsRetries; | ||
attemptNumber = 1; | ||
case 2: | ||
if (!(retriesLeft >= 0)) { | ||
_context2.next = 22; | ||
break; | ||
} | ||
_context2.prev = 3; | ||
_context2.next = 6; | ||
return handler(input, eventStores); | ||
case 6: | ||
output = _context2.sent; | ||
return _context2.abrupt("return", output); | ||
case 10: | ||
_context2.prev = 10; | ||
_context2.t0 = _context2["catch"](3); | ||
if ((0, _errors.isEventAlreadyExistsError)(_context2.t0)) { | ||
_context2.next = 14; | ||
break; | ||
} | ||
throw _context2.t0; | ||
case 14: | ||
_context2.next = 16; | ||
return _this.onEventAlreadyExists(_context2.t0, { | ||
attemptNumber: attemptNumber, | ||
retriesLeft: retriesLeft | ||
}); | ||
case 16: | ||
if (!(retriesLeft === 0)) { | ||
_context2.next = 18; | ||
break; | ||
} | ||
throw _context2.t0; | ||
case 18: | ||
retriesLeft -= 1; | ||
attemptNumber += 1; | ||
case 20: | ||
_context2.next = 2; | ||
break; | ||
case 22: | ||
throw new Error('Handler failed to execute'); | ||
case 23: | ||
case "end": | ||
return _context2.stop(); | ||
} | ||
} | ||
}, _callee2, null, [[3, 10]]); | ||
})); | ||
return function (_x, _x2) { | ||
return _ref3.apply(this, arguments); | ||
}; | ||
}(); | ||
}); | ||
exports.Command = Command; | ||
//# sourceMappingURL=command.js.map |
@@ -0,4 +1,7 @@ | ||
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator"; | ||
import _createClass from "@babel/runtime/helpers/createClass"; | ||
import _classCallCheck from "@babel/runtime/helpers/classCallCheck"; | ||
import _defineProperty from "@babel/runtime/helpers/defineProperty"; | ||
import _regeneratorRuntime from "@babel/runtime/regenerator"; | ||
import { isEventAlreadyExistsError } from "../errors"; | ||
export var tuple = function tuple() { | ||
@@ -16,4 +19,25 @@ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { | ||
export var Command = /*#__PURE__*/_createClass(function Command(_ref) { | ||
var _this = this; | ||
var commandId = _ref.commandId, | ||
requiredEventStores = _ref.requiredEventStores, | ||
_ref$eventAlreadyExis = _ref.eventAlreadyExistsRetries, | ||
eventAlreadyExistsRetries = _ref$eventAlreadyExis === void 0 ? 2 : _ref$eventAlreadyExis, | ||
_ref$onEventAlreadyEx = _ref.onEventAlreadyExists, | ||
onEventAlreadyExists = _ref$onEventAlreadyEx === void 0 ? /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() { | ||
return _regeneratorRuntime.wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
return _context.abrupt("return", new Promise(function (resolve) { | ||
return resolve(); | ||
})); | ||
case 1: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee); | ||
})) : _ref$onEventAlreadyEx, | ||
handler = _ref.handler; | ||
@@ -29,2 +53,6 @@ | ||
_defineProperty(this, "eventAlreadyExistsRetries", void 0); | ||
_defineProperty(this, "onEventAlreadyExists", void 0); | ||
_defineProperty(this, "handler", void 0); | ||
@@ -34,4 +62,79 @@ | ||
this.requiredEventStores = requiredEventStores; | ||
this.handler = handler; | ||
this.eventAlreadyExistsRetries = eventAlreadyExistsRetries; | ||
this.onEventAlreadyExists = onEventAlreadyExists; | ||
this.handler = /*#__PURE__*/function () { | ||
var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(input, eventStores) { | ||
var retriesLeft, attemptNumber, output; | ||
return _regeneratorRuntime.wrap(function _callee2$(_context2) { | ||
while (1) { | ||
switch (_context2.prev = _context2.next) { | ||
case 0: | ||
retriesLeft = _this.eventAlreadyExistsRetries; | ||
attemptNumber = 1; | ||
case 2: | ||
if (!(retriesLeft >= 0)) { | ||
_context2.next = 22; | ||
break; | ||
} | ||
_context2.prev = 3; | ||
_context2.next = 6; | ||
return handler(input, eventStores); | ||
case 6: | ||
output = _context2.sent; | ||
return _context2.abrupt("return", output); | ||
case 10: | ||
_context2.prev = 10; | ||
_context2.t0 = _context2["catch"](3); | ||
if (isEventAlreadyExistsError(_context2.t0)) { | ||
_context2.next = 14; | ||
break; | ||
} | ||
throw _context2.t0; | ||
case 14: | ||
_context2.next = 16; | ||
return _this.onEventAlreadyExists(_context2.t0, { | ||
attemptNumber: attemptNumber, | ||
retriesLeft: retriesLeft | ||
}); | ||
case 16: | ||
if (!(retriesLeft === 0)) { | ||
_context2.next = 18; | ||
break; | ||
} | ||
throw _context2.t0; | ||
case 18: | ||
retriesLeft -= 1; | ||
attemptNumber += 1; | ||
case 20: | ||
_context2.next = 2; | ||
break; | ||
case 22: | ||
throw new Error('Handler failed to execute'); | ||
case 23: | ||
case "end": | ||
return _context2.stop(); | ||
} | ||
} | ||
}, _callee2, null, [[3, 10]]); | ||
})); | ||
return function (_x, _x2) { | ||
return _ref3.apply(this, arguments); | ||
}; | ||
}(); | ||
}); | ||
//# sourceMappingURL=command.js.map |
@@ -0,3 +1,8 @@ | ||
import { EventAlreadyExistsError } from "../errors"; | ||
import type { EventStore } from "../eventStore"; | ||
import type { $Contravariant } from "../utils"; | ||
export declare type OnEventAlreadyExistsCallback = (error: EventAlreadyExistsError, context: { | ||
attemptNumber: number; | ||
retriesLeft: number; | ||
}) => Promise<void>; | ||
export declare const tuple: <A extends unknown[]>(...args: A) => A; | ||
@@ -11,6 +16,10 @@ export declare class Command<E extends EventStore[] = EventStore[], $E extends EventStore[] = $Contravariant<E, EventStore[]>, I = any, O = any> { | ||
requiredEventStores: E; | ||
eventAlreadyExistsRetries: number; | ||
onEventAlreadyExists: OnEventAlreadyExistsCallback; | ||
handler: (input: I, requiredEventStores: $E) => Promise<O>; | ||
constructor({ commandId, requiredEventStores, handler, }: { | ||
constructor({ commandId, requiredEventStores, eventAlreadyExistsRetries, onEventAlreadyExists, handler, }: { | ||
commandId: string; | ||
requiredEventStores: E; | ||
eventAlreadyExistsRetries?: number; | ||
onEventAlreadyExists?: OnEventAlreadyExistsCallback; | ||
handler: (input: I, requiredEventStores: $E) => Promise<O>; | ||
@@ -17,0 +26,0 @@ }); |
@@ -27,6 +27,6 @@ /// <reference types="jest" /> | ||
export declare const countersReducer: (counterAggregate: CounterAggregate, event: CounterEventsDetails) => CounterAggregate; | ||
export declare const counterEventStore: EventStore<"Counters", (EventType<"COUNTER_INCREMENTED", never, never> | EventType<"COUNTER_CREATED", never, never> | EventType<"COUNTER_DELETED", never, never>)[], { | ||
export declare const counterEventStore: EventStore<"Counters", (EventType<"COUNTER_CREATED", never, never> | EventType<"COUNTER_INCREMENTED", never, never> | EventType<"COUNTER_DELETED", never, never>)[], { | ||
aggregateId: string; | ||
version: number; | ||
type: "COUNTER_INCREMENTED"; | ||
type: "COUNTER_CREATED"; | ||
timestamp: string; | ||
@@ -36,3 +36,3 @@ } | { | ||
version: number; | ||
type: "COUNTER_CREATED"; | ||
type: "COUNTER_INCREMENTED"; | ||
timestamp: string; | ||
@@ -47,3 +47,3 @@ } | { | ||
version: number; | ||
type: "COUNTER_INCREMENTED"; | ||
type: "COUNTER_CREATED"; | ||
timestamp: string; | ||
@@ -53,3 +53,3 @@ } | { | ||
version: number; | ||
type: "COUNTER_CREATED"; | ||
type: "COUNTER_INCREMENTED"; | ||
timestamp: string; | ||
@@ -56,0 +56,0 @@ } | { |
@@ -14,3 +14,4 @@ export type { Aggregate } from './aggregate'; | ||
export { Command, tuple } from './command/command'; | ||
export type { OnEventAlreadyExistsCallback } from './command/command'; | ||
export type { $Contravariant } from './utils'; | ||
//# sourceMappingURL=index.d.ts.map |
@@ -1,2 +0,2 @@ | ||
export declare type $Contravariant<I, C> = C extends I ? any : I; | ||
export declare type $Contravariant<I, C, D = I> = C extends I ? any : D; | ||
//# sourceMappingURL=utils.d.ts.map |
@@ -31,3 +31,3 @@ { | ||
"package-types": "ttsc -p tsconfig.build.json", | ||
"test": "yarn test-linter && yarn test-type && yarn test-circular && yarn test-unit", | ||
"test": "yarn test-type && yarn test-unit && yarn test-circular && yarn test-linter", | ||
"test-circular": "yarn depcruise --validate dependency-cruiser.js .", | ||
@@ -77,3 +77,3 @@ "test-linter": "yarn linter-base-config .", | ||
}, | ||
"version": "1.4.4" | ||
"version": "1.5.0" | ||
} |
@@ -325,3 +325,3 @@ <p align="center"> | ||
eventStoreId: 'USERS', | ||
eventTypes: [ | ||
eventStoreEvents: [ | ||
userCreatedEventType, | ||
@@ -649,3 +649,16 @@ userRemovedEventType, | ||
- <code>requiredEventStores <i>(EventStore[])</i></code>: A tuple of `EventStores` that are required by the command for read/write purposes. In TS, you should use the `tuple` util to preserve tuple ordering in the handler (`tuple` doesn't mute its input, it simply returns them) | ||
- <code>eventAlreadyExistsRetries <i>(?number = 2)</i></code>: Number of handler execution retries before breaking out of the retry loop (See section below on race conditions) | ||
- <code>onEventAlreadyExists <i>(?(error: EventAlreadyExistsError, context: ContextObj) => Promise\<void\>)</i></code>: Optional callback to execute when an `EventAlreadyExistsError` is raised. | ||
The `EventAlreadyExistsError` class contains the following attribute: | ||
- <code>eventStoreId <i>(?string)</i></code>: The `eventStoreId` of the aggregate on which the `pushEvent` attempt failed | ||
- <code>aggregateId <i>(string)</i></code>: The `aggregateId` of the aggregate | ||
- <code>version <i>(number)</i></code>: The `version` of the aggregate | ||
The `ContextObj` contains the following attributes: | ||
- <code>attemptNumber <i>(?number)</i></code>: The number of handler execution attempts in the retry loop | ||
- <code>retriesLeft <i>(?number)</i></code>: The number of retries left before breaking out of the retry loop | ||
```ts | ||
@@ -652,0 +665,0 @@ import { Command, tuple } from '@castore/core'; |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
223658
109
1495
768