"use strict"; module.exports = function createPromiseListener() { let listeners = []; function consumeListeners() { /* To ensure that a resolve/reject is atomic, and can never apply to the same listener queue twice. */ let consumedListeners = listeners; listeners = []; return consumedListeners; } return { listen: function () { return new Promise((resolve, reject) => { listeners.push({ resolve, reject }); }); }, resolve: function (value) { consumeListeners().forEach((listener) => { listener.resolve(value); }); }, reject: function (value) { consumeListeners().forEach((listener) => { listener.reject(value); }); }, } };