"use strict"; const consumable = require("@joepie91/consumable"); // TODO: Move to separate package, p-listener or something module.exports = function createPromiseListener() { let listeners = consumable([]); function consumeListeners() { /* To ensure that a resolve/reject is atomic, and can never apply to the same listener queue twice. */ return listeners.replace([]); } return { listen: function () { return new Promise((resolve, _reject) => { listeners.peek().push(resolve); }); }, notify: function (promise) { consumeListeners().forEach((listener) => { // Docs: Pass in a rejected promise to produce a rejection on listeners listener(promise); }); } }; };