Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Rafael-rgsousa/6d62707344252d37afc453fba7b2ce54 to your computer and use it in GitHub Desktop.
Save Rafael-rgsousa/6d62707344252d37afc453fba7b2ce54 to your computer and use it in GitHub Desktop.
import { EventEmitter2 } from '@nestjs/event-emitter';
import { ulid } from 'ulid';
import { Logger } from '@nestjs/common';
export interface EventFlow {
id: string;
event: string;
timestamp?: string;
}
export function SubscribeEventResult<T>(
eventInstance: EventEmitter2,
eventFlow: EventFlow,
): Promise<T> {
return new Promise((resolve) => {
const event = `RESULT/${eventFlow.event}/${eventFlow.id}`;
const listener = eventInstance.once(event, (result) => {
listener.off(event, this);
eventInstance.removeAllListeners(event);
resolve(result);
});
});
}
export const EmitEventAndSubscribeResult = <T>(
eventInstance: EventEmitter2,
event: any,
...values: any[]
): Promise<T> => {
return new Promise((resolve) => {
const eventId = ulid();
const eventParam = {
event,
id: eventId,
};
const eventResult = `RESULT/${eventParam.event}/${eventParam.id}`;
let expired = false;
const listener = eventInstance.once(eventResult, (result) => {
eventInstance.removeAllListeners(eventResult);
expired = true;
resolve(result);
});
setTimeout(() => {
// expiring failed events
if (!expired) {
eventInstance.removeAllListeners(eventResult);
resolve(null);
}
}, 5000);
if (values.length === 1) {
values = values[0];
}
Logger.verbose(
`Emmiting new event: ${event}`,
'EmitEventAndSubscribeResult',
);
eventInstance.emit(event, values, eventParam);
});
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment