Skip to content

Event Emitter

The Event Emitter is a capability provided by AlgoKit Utils that allows for asynchronous event handling of lifecycle events. It provides a flexible mechanism for emitting and listening to custom events, which can be particularly useful for debugging and extending functionality not available in the algokit-utils-ts package.

The AsyncEventEmitter is a class that manages asynchronous event emission and subscription.

To use the AsyncEventEmitter, you can import it directly:

import { AsyncEventEmitter } from '@algorandfoundation/algokit-utils/types/async-event-emitter';
const emitter = new AsyncEventEmitter();

The EventType enum defines the built-in event types:

enum EventType {
TxnGroupSimulated = 'TxnGroupSimulated',
AppCompiled = 'AppCompiled',
}

To emit an event, use the emitAsync method:

await emitter.emitAsync(EventType.AppCompiled, compilationData);

There are two ways to listen to events:

The on method adds a listener that will be called every time the specified event is emitted:

emitter.on(EventType.AppCompiled, async data => {
console.log('App compiled:', data);
});

The once method adds a listener that will be called only once for the specified event:

emitter.once(EventType.TxnGroupSimulated, async data => {
console.log('Transaction group simulated:', data);
});

To remove a listener, use the removeListener or off method:

const listener = async data => {
console.log('Event received:', data);
};
emitter.on(EventType.AppCompiled, listener);
// Later, when you want to remove the listener:
emitter.removeListener(EventType.AppCompiled, listener);
// or
emitter.off(EventType.AppCompiled, listener);

While the current implementation primarily focuses on debugging events, the AsyncEventEmitter is designed to be extensible. You can emit and listen to custom events by using string keys:

emitter.on('customEvent', async data => {
console.log('Custom event received:', data);
});
await emitter.emitAsync('customEvent', { foo: 'bar' });

The events emitted by AsyncEventEmitter are particularly useful when used in conjunction with the algokit-utils-ts-debug package. This package listens for these events and persists relevant debugging information to the user’s AlgoKit project filesystem, facilitating integration with the AVM debugger extension.

The AsyncEventEmitter can serve as a foundation for building custom AlgoKit Utils extensions. By listening to the activity events emitted by the utils-ts package, you can create additional functionality tailored to your specific needs.

If you have suggestions for new event types or additional functionality, please open a PR or submit an issue on the AlgoKit Utils GitHub repository.