@nivinjoseph/n-eda
Version:
Event Driven Architecture framework
98 lines • 4 kB
JavaScript
import { given } from "@nivinjoseph/n-defensive";
import { Exception } from "@nivinjoseph/n-exception";
import { Deserializer } from "@nivinjoseph/n-util";
import { EdaManager } from "../eda-manager.js";
import { NedaDistributedObserverNotifyEvent } from "./neda-distributed-observer-notify-event.js";
export class RpcEventHandler {
constructor() {
this._nedaDistributedObserverNotifyEventName = NedaDistributedObserverNotifyEvent.getTypeName();
this._manager = null;
this._logger = null;
}
initialize(manager) {
given(manager, "manager").ensureHasValue().ensureIsObject().ensureIsType(EdaManager)
.ensure(t => t.isRpcConsumer, "RPC consumer not enabled");
this._manager = manager;
this._logger = this._manager.serviceLocator.resolve("Logger");
}
async process(model) {
try {
given(model, "model").ensureHasValue().ensureIsObject();
given(this, "this").ensure(t => t._manager != null, "not initialized");
const eventData = {
consumerId: model.consumerId,
topic: model.topic,
partition: model.partition,
eventName: model.eventName,
event: Deserializer.deserialize(model.payload)
};
await this._process(eventData);
return {
eventName: eventData.eventName,
eventId: eventData.event.id
};
}
catch (error) {
return {
statusCode: 500,
error: this._getErrorMessage(error)
};
}
}
onEventReceived(scope, topic, event) {
given(scope, "scope").ensureHasValue().ensureIsObject();
given(topic, "topic").ensureHasValue().ensureIsString();
given(event, "event").ensureHasValue().ensureIsObject();
}
async _process(data) {
// given(data, "data").ensureHasValue().ensureIsObject()
// .ensureHasStructure({
// consumerId: "string",
// topic: "string",
// partition: "number",
// eventName: "string",
// event: "object"
// });
const isObservedEvent = data.eventName === this._nedaDistributedObserverNotifyEventName;
let event = data.event;
if (isObservedEvent)
event = event.observedEvent;
const eventRegistration = isObservedEvent
? this._manager.observerEventMap.get(event.name)
: this._manager.eventMap.get(event.name);
if (eventRegistration == null) // Because we check event registrations on publish, if the registration is null here, then that is a consequence of rolling deployment
return;
const scope = this._manager.serviceLocator.createScope();
event.$scope = scope;
this.onEventReceived(scope, data.topic, event);
const handler = scope.resolve(eventRegistration.eventHandlerTypeName);
try {
await handler.handle(event, data.event.observerId);
}
catch (error) {
await this._logger.logWarning(`Error in RPC event handler while handling event of type '${data.eventName}' with data ${JSON.stringify(data.event.serialize())}.`);
await this._logger.logError(error);
throw error;
}
finally {
await scope.dispose();
}
}
_getErrorMessage(exp) {
let logMessage = "";
try {
if (exp instanceof Exception)
logMessage = exp.toString();
else if (exp instanceof Error)
logMessage = exp.stack;
else
logMessage = exp.toString();
}
catch (error) {
console.warn(error);
logMessage = "There was an error while attempting to log another message.";
}
return logMessage;
}
}
//# sourceMappingURL=rpc-event-handler.js.map