Event Emitting and Async Middleware Hooks
Features
- Simple replacement for EventEmitter
- Async Middleware Hooks for Your Methods
- ESM / CJS with Types and Nodejs 20+
- Maintained on a regular basis!
Installation
npm install hookified --save
Usage
This was built because we constantly wanted hooks and events extended on libraires we are building such as Keyv and Cacheable. This is a simple way to add hooks and events to your classes.
import { Hookified } from 'hookified';
class MyClass extends Hookified {
constructor() {
super();
}
async myMethodEmittingEvent() {
this.emit('message', 'Hello World'); //using Emittery
}
//with hooks you can pass data in and if they are subscribed via onHook they can modify the data
async myMethodWithHooks() Promise<any> {
let data = { some: 'data' };
// do something
await this.hook('before:myMethod2', data);
return data;
}
}
You can even pass in multiple arguments to the hooks:
import { Hookified } from 'hookified';
class MyClass extends Hookified {
constructor() {
super();
}
async myMethodWithHooks() Promise<any> {
let data = { some: 'data' };
let data2 = { some: 'data2' };
// do something
await this.hook('before:myMethod2', data, data2);
return data;
}
}
Using it in the Browser
<script type="module">
import { Hookified } from 'https://cdn.jsdelivr.net/npm/hookified/dist/browser/index.js';
class MyClass extends Hookified {
constructor() {
super();
}
async myMethodEmittingEvent() {
this.emit('message', 'Hello World'); //using Emittery
}
//with hooks you can pass data in and if they are subscribed via onHook they can modify the data
async myMethodWithHooks() Promise<any> {
let data = { some: 'data' };
// do something
await this.hook('before:myMethod2', data);
return data;
}
}
</script>
if you are not using ESM modules, you can use the following:
<script src="https://cdn.jsdelivr.net/npm/hookified/dist/browser/index.global.js"></script>
<script>
class MyClass extends Hookified {
constructor() {
super();
}
async myMethodEmittingEvent() {
this.emit('message', 'Hello World'); //using Emittery
}
//with hooks you can pass data in and if they are subscribed via onHook they can modify the data
async myMethodWithHooks() Promise<any> {
let data = { some: 'data' };
// do something
await this.hook('before:myMethod2', data);
return data;
}
}
</script>
API - Hooks
.onHook(eventName, handler)
Subscribe to a hook event.
.removeHook(eventName)
Unsubscribe from a hook event.
.hook(eventName, ...args)
Run a hook event.
.hooks
Get all hooks.
.getHooks(eventName)
Get all hooks for an event.
.clearHooks(eventName)
API - Events
.on(eventName, handler)
Subscribe to an event.
.off(eventName, handler)
Unsubscribe from an event.
.emit(eventName, ...args)
Emit an event.
.listeners(eventName)
Get all listeners for an event.
.removeAllListeners(eventName)
Remove all listeners for an event.
.setMaxListeners(maxListeners: number)
Set the maximum number of listeners and will truncate if there are already too many.
.once(eventName, handler)
Subscribe to an event once.
.prependListener(eventName, handler)
Prepend a listener to an event.
.prependOnceListener(eventName, handler)
Prepend a listener to an event once.
.eventNames()
Get all event names.
.listenerCount(eventName?)
Get the count of listeners for an event or all events if evenName not provided.
.rawListeners(eventName?)
Get all listeners for an event or all events if evenName not provided.
Development and Testing
Hookified is written in TypeScript and tests are written in vitest
. To run the tests, use the following command:
To setup the environment and run the tests:
npm i && npm test
To contribute follow the Contributing Guidelines and Code of Conduct.
License
Latest's Releases
What's Changed
- Adding in IEventEmitter by @jaredwray in https://github.com/jaredwray/hookified/pull/17
Full Changelog: https://github.com/jaredwray/hookified/compare/v1.3.0...v1.4.0
What's Changed
- adding in event emitter type by @jaredwray in https://github.com/jaredwray/hookified/pull/14
- building and deployed for nodejs cjs, esm and now browser by @jaredwray in https://github.com/jaredwray/hookified/pull/15
- upgrading vitest to 2.1.3 by @jaredwray in https://github.com/jaredwray/hookified/pull/16
Full Changelog: https://github.com/jaredwray/hookified/compare/v1.2.1...v1.3.0
What's Changed
- upgrading docula to 0.9.3 by @jaredwray in https://github.com/jaredwray/hookified/pull/12
- upgrading vitest to 2.1.2 by @jaredwray in https://github.com/jaredwray/hookified/pull/13
Full Changelog: https://github.com/jaredwray/hookified/compare/v1.2.0...v1.2.1