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.

31 lines
703 B
JavaScript

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