You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

40 lines
1.0 KiB
JavaScript

"use strict";
const { validateArguments } = require("@validatem/core");
const required = require("@validatem/required");
const isNonEmptyString = require("@validatem/is-non-empty-string");
const ValiationError = require("@validatem/error");
function isEventEmitter(value) {
if (typeof value !== "object" || value.on == null || value.removeListener == null) {
throw new ValiationError(`Must be an EventEmitter`);
}
}
module.exports = function promisifyEvent(_emitter, _event) {
let [ emitter, event ] = validateArguments(arguments, {
emitter: [ required, isEventEmitter ],
event: [ required, isNonEmptyString ]
});
return new Promise((resolve, reject) => {
function cleanup() {
emitter.removeListener(event, eventCallback);
emitter.removeListener("error", eventCallback);
}
function eventCallback(... args) {
resolve(... args);
cleanup();
}
function errorCallback(error) {
reject(error);
cleanup();
}
emitter.on(event, eventCallback);
emitter.on("error", errorCallback);
});
};