@halcyon-agile/node-event-sourcing
Advanced tools
Comparing version 1.0.37 to 1.0.38
@@ -1,2 +0,2 @@ | ||
import { EventDto } from "./Dto"; | ||
import { CreateEventDto, EventDto } from "./Dto"; | ||
export default class AggregateRoot { | ||
@@ -7,5 +7,7 @@ aggregateId: string; | ||
snapshotIn: number; | ||
createEvent(eventData: EventDto): Promise<void>; | ||
payload: unknown; | ||
createEvent(createEventData: CreateEventDto): Promise<void>; | ||
retrieve(aggregateId: string): Promise<this>; | ||
retrieveAll(aggregateId: string): Promise<this>; | ||
apply(event: EventDto): void; | ||
} |
@@ -7,2 +7,3 @@ "use strict"; | ||
const EventStore_1 = __importDefault(require("./EventStore")); | ||
const rfdc_1 = __importDefault(require("rfdc")); | ||
class AggregateRoot { | ||
@@ -14,9 +15,9 @@ constructor() { | ||
} | ||
async createEvent(eventData) { | ||
this.apply(eventData); | ||
eventData = { | ||
...eventData, | ||
async createEvent(createEventData) { | ||
const eventData = { | ||
...createEventData, | ||
aggregateId: this.aggregateId, | ||
version: this.version, | ||
}; | ||
this.apply(eventData); | ||
await EventStore_1.default.createEvent(eventData); | ||
@@ -26,3 +27,4 @@ this.version++; | ||
this.events.length && | ||
Number.isInteger(this.events[0].version / this.snapshotIn)) { | ||
Number.isInteger(this.version / this.snapshotIn) && | ||
this.version >= this.snapshotIn) { | ||
const payload = JSON.parse(JSON.stringify(this)); | ||
@@ -51,5 +53,8 @@ delete payload.events; | ||
events = (await EventStore_1.default.query(aggregateId, { | ||
limit: this.snapshotIn + 10, | ||
limit: this.snapshotIn + 1, | ||
reverse: true, | ||
})).Items; | ||
events?.sort(function (a, b) { | ||
return Number(a.version) - Number(b.version); | ||
}); | ||
} | ||
@@ -59,5 +64,19 @@ else { | ||
} | ||
events?.sort(function (a, b) { | ||
return Number(a.version) - Number(b.version); | ||
events?.forEach((event) => { | ||
this.version = Number(event.version) + 1; | ||
this.apply({ | ||
aggregateId: String(event.aggregateId), | ||
version: Number(event.version), | ||
event: String(event.event), | ||
payload: event.payload, | ||
}); | ||
}); | ||
return this; | ||
} | ||
async retrieveAll(aggregateId) { | ||
this.aggregateId = aggregateId; | ||
this.events = []; | ||
this.payload = undefined; | ||
let events = []; | ||
events = (await EventStore_1.default.query(aggregateId)).Items; | ||
events?.forEach((event) => { | ||
@@ -75,10 +94,11 @@ this.version = Number(event.version) + 1; | ||
apply(event) { | ||
const eventData = (0, rfdc_1.default)()(event); | ||
// @ts-ignore | ||
if (typeof this[`apply${event.event}`] === "function") { | ||
// @ts-ignore | ||
this[`apply${event.event}`](event.payload); | ||
this[`apply${event.event}`]({ ...eventData.payload }); | ||
} | ||
this.events.push(event); | ||
this.events.push({ ...eventData }); | ||
} | ||
} | ||
exports.default = AggregateRoot; |
@@ -0,1 +1,5 @@ | ||
interface CreateEventDto { | ||
event: string; | ||
payload: any; | ||
} | ||
interface EventDto { | ||
@@ -20,2 +24,2 @@ aggregateId: string; | ||
} | ||
export { EventDto, EventHandlersClassType, ListenerHandlerClassType }; | ||
export { CreateEventDto, EventDto, EventHandlersClassType, ListenerHandlerClassType, }; |
@@ -15,2 +15,3 @@ import DynamoDB from "aws-sdk/clients/dynamodb"; | ||
Put: { | ||
ConditionExpression: string; | ||
TableName: string; | ||
@@ -17,0 +18,0 @@ Item: { |
@@ -80,2 +80,3 @@ "use strict"; | ||
Put: { | ||
ConditionExpression: "attribute_not_exists(aggregateId)", | ||
TableName: this.tableName, | ||
@@ -94,2 +95,3 @@ Item: { | ||
.put({ | ||
ConditionExpression: "attribute_not_exists(aggregateId)", | ||
TableName: this.tableName, | ||
@@ -96,0 +98,0 @@ Item: { |
@@ -31,3 +31,3 @@ "use strict"; | ||
return; | ||
const event = Helper_1.tryParseJSONObject(message.value?.toString()); | ||
const event = (0, Helper_1.tryParseJSONObject)(message.value?.toString()); | ||
if (process.env.KAFKA_LOG_LEVEL?.toUpperCase() === "INFO") { | ||
@@ -34,0 +34,0 @@ console.info(`Listener ${this.groupId} consuming ${topic} in partition ${partition}`); |
@@ -33,3 +33,3 @@ "use strict"; | ||
return; | ||
const event = Helper_1.tryParseJSONObject(message.value?.toString()); | ||
const event = (0, Helper_1.tryParseJSONObject)(message.value?.toString()); | ||
if (process.env.KAFKA_LOG_LEVEL?.toUpperCase() === "INFO") { | ||
@@ -36,0 +36,0 @@ console.info(`Projector ${this.groupId}_${this.projector.name} consuming ${topic} in partition ${partition}`); |
"use strict"; | ||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||
if (k2 === undefined) k2 = k; | ||
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); | ||
var desc = Object.getOwnPropertyDescriptor(m, k); | ||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { | ||
desc = { enumerable: true, get: function() { return m[k]; } }; | ||
} | ||
Object.defineProperty(o, k2, desc); | ||
}) : (function(o, m, k, k2) { | ||
@@ -6,0 +10,0 @@ if (k2 === undefined) k2 = k; |
{ | ||
"name": "@halcyon-agile/node-event-sourcing", | ||
"version": "1.0.37", | ||
"version": "1.0.38", | ||
"description": "> Opinionated OOP based node.js event sourcing library inspired by laravel-event-sourcing", | ||
"main": "dist/index.js", | ||
"type": "module", | ||
"files": [ | ||
@@ -20,25 +20,27 @@ "dist/*" | ||
"devDependencies": { | ||
"@types/async": "^3.2.7", | ||
"@types/jest": "^26.0.24", | ||
"@typescript-eslint/eslint-plugin": "^4.29.0", | ||
"@typescript-eslint/parser": "^4.29.0", | ||
"dotenv": "^10.0.0", | ||
"eslint": "^7.32.0", | ||
"eslint-config-prettier": "^8.3.0", | ||
"eslint-plugin-prettier": "^3.4.0", | ||
"jest": "^27.0.6", | ||
"nanoid": "^3.1.23", | ||
"prettier": "^2.3.2", | ||
"ts-jest": "^27.0.4", | ||
"ts-node": "^10.2.1", | ||
"typescript": "^4.3.5" | ||
"@types/async": "^3.2.13", | ||
"@types/jest": "^28.1.3", | ||
"@typescript-eslint/eslint-plugin": "^5.29.0", | ||
"@typescript-eslint/parser": "^5.29.0", | ||
"dotenv": "^16.0.1", | ||
"eslint": "^8.18.0", | ||
"eslint-config-prettier": "^8.5.0", | ||
"eslint-plugin-prettier": "^4.0.0", | ||
"jest": "^28.1.1", | ||
"nanoid": "^4.0.0", | ||
"prettier": "^2.7.1", | ||
"ts-jest": "^28.0.5", | ||
"ts-node": "^10.8.1", | ||
"typescript": "^4.7.4" | ||
}, | ||
"dependencies": { | ||
"async": "^3.2.1", | ||
"aws-sdk": "^2.951.0", | ||
"kafkajs": "^1.15.0" | ||
"async": "^3.2.4", | ||
"aws-sdk": "^2.1160.0", | ||
"kafkajs": "^2.0.2", | ||
"rfdc": "^1.3.0" | ||
}, | ||
"directories": { | ||
"example": "examples", | ||
"test": "test" | ||
"src": "src", | ||
"tests": "tests", | ||
"event-publisher": "event-publisher" | ||
}, | ||
@@ -45,0 +47,0 @@ "repository": { |
@@ -7,6 +7,5 @@ # NODE EVENT SOURCING | ||
- [x] Reliable event publisher | ||
- [x] Reliable event publishing | ||
- [x] Built for microservices | ||
- [x] CQRS | ||
- [ ] Dead letter queue support | ||
@@ -13,0 +12,0 @@ ## Current Limitations |
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 2 instances in 1 package
39
Yes
36906
4
24
825
210
+ Addedrfdc@^1.3.0
+ Addedkafkajs@2.2.4(transitive)
+ Addedrfdc@1.3.1(transitive)
- Removedkafkajs@1.16.0(transitive)
Updatedasync@^3.2.4
Updatedaws-sdk@^2.1160.0
Updatedkafkajs@^2.0.2