24
loading...
This website collects cookies to deliver better user experience
npm i -S @bluelibs/core
import { EventManager } from "@bluelibs/core";
const eventManager = new EventManager();
reflect-metadata
, which is going to be stripped-out most likely by your bundler on the frontend.Promise
-based applications, we believe that all event handlers should be async by default.import { EventManager } from "@bluelibs/core";
class SomethingHappenedEvent extends Event {}
async function init() {
const eventManager = new EventManager();
eventManager.addListener(SomethingHappenedEvent, async (e) => {
// Type-safety for e, e is an instance of SomethingHappenedEvent, automatic type inference
console.log("I have been emitted");
});
// This will await execution all events
await eventManager.emit(new SomethingHappenedEvent());
}
init();
eventManager.addListener(SomethingHappenedEvent, async (e) => {
emailService.sendEmail(); // simply omit "await" for your async service calls
// Another approach:
return new Promise(async (resolve, reject) => {
resolve();
// Do sync stuff here
});
});
// don't await emission
eventManager.emit(new SomethingHappenedEvent());
// await and make it blocking
await eventManager.emit(new SomethingHappenedEvent());
class UserAddedEvent extends Event<{
userId: string;
}> {
async validate() {
// Optional runtime validation before it's dispatched to all listeners
}
}
eventManager.emit(
new UserAddedEvent({
userId: "XXX",
})
);
const handler = async function empty(e: UserAddedEvent) {};
eventManager.addListener(UserAddedEvent, handler, {
// Make it run first
order: -1000, // Use -Infinity if you're feeling courageous
filter: (e) => e.data.userId !== "ADMIN", // The listener will only run if the filter returns true.
});
eventManager.removeListener(UserAddedEvent);
manager.addGlobalListener(async (e: Event) => {
// Custom logging maybe?
});
// and it's subsequent: removeGlobalListener
class SecurityEvent extends Event {}
class UserNotAuthorized extends SecurityEvent {}
class UserHackingAttemptEvent extends SecurityEvent {}
manager.addGlobalListener(
async (e: SecurityEvent) => {
// Send an email or do something specific
},
{
filter: (e) => e instanceof SecurityEvent,
}
);
SerializableEvent
class, and fine-tune it to suit your needs.