"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); }); };