Socket
Socket
Sign inDemoInstall

@halcyon-agile/node-event-sourcing

Package Overview
Dependencies
19
Maintainers
1
Versions
47
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 1.0.1 to 1.0.2

dist/Config.d.ts

5

dist/Dto.d.ts
interface EventDto {
topic?: string;
aggregateId?: string;
version?: number;
aggregateId: string;
version: number;
event: string;

@@ -6,0 +5,0 @@ payload: unknown;

7

dist/EventStore.d.ts

@@ -18,6 +18,5 @@ import DynamoDB from "aws-sdk/clients/dynamodb";

published: number;
committedAt: number;
topic?: string | undefined;
aggregateId?: string | undefined;
version?: number | undefined;
committedAt: string;
aggregateId: string;
version: number;
event: string;

@@ -24,0 +23,0 @@ payload: unknown;

@@ -10,6 +10,5 @@ "use strict";

this.tableName = "EventStore";
this.tableName = process.env.EVENTSTORE_NAME || "EventStore";
this.tableName = process.env.EVENTSTORE_TABLE_NAME || "EventStore";
if (String(process.env.DYNAMODB_LOCAL) === "true") {
this.service = new dynamodb_1.default({
region: process.env.AWS_REGION,
endpoint: process.env.DYNAMODB_URL || "http://localhost:8000",

@@ -92,3 +91,3 @@ });

published: process.env.DYNAMODB_STREAM_ENABLED ? 1 : 0,
committedAt: Date.now(),
committedAt: String(Date.now()),
},

@@ -105,3 +104,3 @@ },

published: process.env.DYNAMODB_STREAM_ENABLED ? 1 : 0,
committedAt: Date.now(),
committedAt: String(Date.now()),
},

@@ -108,0 +107,0 @@ })

@@ -6,18 +6,5 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
const kafkajs_1 = __importDefault(require("kafkajs"));
const async_1 = require("async");
const CommitManager_1 = __importDefault(require("./CommitManager"));
const node_rdkafka_1 = __importDefault(require("node-rdkafka"));
function isJson(item) {
item = typeof item !== "string" ? JSON.stringify(item) : item;
try {
item = JSON.parse(item);
}
catch (e) {
return false;
}
if (typeof item === "object" && item !== null) {
return true;
}
return false;
}
const Helper_1 = require("../Helper");
class Consumer {

@@ -45,3 +32,3 @@ constructor(eventHandlers, globalConfig, topicConfig) {

this.commitManager.notifyStartProcessing(data);
if (data.value && isJson(data.value?.toString())) {
if (data.value && Helper_1.isJson(data.value?.toString())) {
const message = JSON.parse(data.value.toString());

@@ -57,6 +44,6 @@ await handler(message);

onRebalance(err, assignments) {
if (err.code === node_rdkafka_1.default.CODES.ERRORS.ERR__ASSIGN_PARTITIONS) {
if (err.code === kafkajs_1.default.CODES.ERRORS.ERR__ASSIGN_PARTITIONS) {
this.consumer.assign(assignments);
}
else if (err.code === node_rdkafka_1.default.CODES.ERRORS.ERR__REVOKE_PARTITIONS) {
else if (err.code === kafkajs_1.default.CODES.ERRORS.ERR__REVOKE_PARTITIONS) {
if (this.paused) {

@@ -77,3 +64,3 @@ this.consumer.resume(assignments);

start() {
this.consumer = new node_rdkafka_1.default.KafkaConsumer({
this.consumer = new kafkajs_1.default.KafkaConsumer({
...this.globalConfig,

@@ -126,3 +113,3 @@ rebalance_cb: (err, assignments) => this.onRebalance(err, assignments),

}, 10000);
this.commitManager = new CommitManager_1.default();
this.commitManager = new CommitManager();
this.commitManager.start(this.consumer);

@@ -129,0 +116,0 @@ });

@@ -7,19 +7,15 @@ "use strict";

const EventStore_1 = __importDefault(require("./EventStore"));
const node_rdkafka_1 = __importDefault(require("node-rdkafka"));
const producer = new node_rdkafka_1.default.HighLevelProducer({
"metadata.broker.list": process.env.KAFKA_BROKERS || `localhost:9092`,
"queue.buffering.max.messages": 10000000,
const kafkajs_1 = require("kafkajs");
const brokers = process.env.KAFKA_BROKERS?.split(",") || ["localhost:9092"];
const kafka = new kafkajs_1.Kafka({
clientId: "my-app",
brokers,
});
const producer = kafka.producer();
class Publisher {
async publishEvents(events) {
for (const event of events) {
await new Promise((resolve, reject) => {
return producer.produce(event.event, null, Buffer.from(JSON.stringify(event.payload)), null, Date.now(), (err) => {
if (err) {
console.log({ err });
reject(err);
return;
}
resolve();
});
await producer.send({
topic: event.event,
messages: [{ value: JSON.stringify(event) }],
});

@@ -29,3 +25,3 @@ }

async run() {
producer.connect();
await producer.connect();
const exec = async () => {

@@ -32,0 +28,0 @@ const events = (await EventStore_1.default.getUnpublishedEvents()).Items;

import { EventHandlersClassType } from "./Dto";
import Consumer from "./Messaging/Consumer";
import ListenerConsumer from "./ListenerConsumer";
import ProjectorConsumer from "./ProjectorConsumer";
import { Kafka } from "kafkajs";
declare class Runner {
projectors: EventHandlersClassType[];
listeners: EventHandlersClassType[];
consumers: Consumer[];
listenersConsumers: ListenerConsumer[];
projectorsConsumers: ProjectorConsumer[];
kafka: Kafka;
constructor();
registerListeners(listeners: string[]): Promise<void>;
registerProjectors(projectors: string[]): Promise<void>;
run(): Promise<void>;
stop(): Promise<void>;
stop(): void;
}
declare const _default: Runner;
export default _default;
export default Runner;

@@ -25,3 +25,4 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
const Consumer_1 = __importDefault(require("./Messaging/Consumer"));
const ProjectorConsumer_1 = __importDefault(require("./ProjectorConsumer"));
const kafkajs_1 = require("kafkajs");
class Runner {

@@ -31,2 +32,20 @@ constructor() {

this.listeners = [];
this.listenersConsumers = [];
this.projectorsConsumers = [];
const brokers = process.env.KAFKA_BROKERS?.split(",") || ["localhost:9092"];
const clientId = process.env.KAFKA_CLIENT_ID || "default-client-id";
let logLevel = 4;
if (process.env.KAFKA_LOG_LEVEL === "NOTHING")
logLevel = 0;
if (process.env.KAFKA_LOG_LEVEL === "ERROR")
logLevel = 1;
if (process.env.KAFKA_LOG_LEVEL === "WARN")
logLevel = 2;
if (process.env.KAFKA_LOG_LEVEL === "DEBUG")
logLevel = 5;
this.kafka = new kafkajs_1.Kafka({
logLevel,
brokers,
clientId,
});
}

@@ -46,45 +65,22 @@ async registerListeners(listeners) {

async run() {
const groupId = process.env.KAFKA_GROUP_ID || "example-group";
const offsetReset = [
"smallest",
"earliest",
"beginning",
"largest",
"latest",
"end",
"error",
].find((v) => v === process.env.KAFKA_OFFSET_RESET);
this.consumers = [
new Consumer_1.default(this.listeners, {
"metadata.broker.list": process.env.KAFKA_BROKERS || `localhost:9092`,
"group.id": groupId,
"allow.auto.create.topics": true,
"enable.auto.commit": false,
log_level: 6,
}, {
"auto.offset.reset": offsetReset || "beginning",
}),
];
this.projectors.forEach((projector) => {
this.consumers.push(new Consumer_1.default([projector], {
"metadata.broker.list": process.env.KAFKA_BROKERS || `localhost:9092`,
"group.id": `${groupId}_${projector.name}`,
"allow.auto.create.topics": true,
"enable.auto.commit": false,
log_level: 6,
}, {
"auto.offset.reset": offsetReset || "beginning",
}));
});
await Promise.all(this.consumers.map((consumer) => consumer.start()));
}
async stop() {
try {
await Promise.all(this.consumers.map((consumer) => consumer.disconnect()));
const groupId = process.env.KAFKA_GROUP_ID || "default-group";
for (const projector of this.projectors) {
this.projectorsConsumers.push(new ProjectorConsumer_1.default(this.kafka, groupId, projector));
}
catch (error) {
console.error(error);
for (const consumer of this.projectorsConsumers) {
await consumer.start();
}
// for (const consumer of this.listenersConsumers) {
// await consumer.start();
// }
}
stop() {
// for (const consumer of this.listenersConsumers) {
// consumer.disconnect();
// }
for (const consumer of this.projectorsConsumers) {
consumer.disconnect();
}
}
}
exports.default = new Runner();
exports.default = Runner;
{
"name": "@halcyon-agile/node-event-sourcing",
"version": "1.0.1",
"version": "1.0.2",
"description": "> Opinionated OOP based node.js event sourcing library inspired by laravel-event-sourcing",

@@ -38,2 +38,3 @@ "main": "dist/index.js",

"aws-sdk": "^2.951.0",
"kafkajs": "^1.15.0",
"node-rdkafka": "^2.10.1"

@@ -40,0 +41,0 @@ },

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc