jsonbird
Version:
JSON-RPC 2.0 client/server/peer for any reliable transport. Inter-process communication. REST. WebSocket. WebWorker. Out of order messaging or in-order byte streams
74 lines (55 loc) • 2 kB
JavaScript
;
const {assert} = require('chai');
const ANY_VALUE = Symbol('ANY_VALUE');
class PromiseFateTracker {
constructor() {
this.fates = new Map();
}
track(name, promise) {
this.fates.set(name, {promise});
promise.then(
result => {
this.fates.set(name, {promise, resolve: result});
return result;
},
error => {
this.fates.set(name, {promise, reject: error});
}
);
}
getFate(name) {
return this.fates.get(name);
}
waitForSettled(name) {
const fate = this.getFate(name);
return fate.promise.then(() => {}, () => {});
}
waitForAllSettled() {
return Promise.all([...this.fates.keys()].map(name => this.waitForSettled(name)));
}
assertPending(name) {
const fate = this.getFate(name);
assert(!fate.resolve && !fate.reject, `The tracked promise "${name}" should be pending`);
}
assertResolved(name, expectedValue = ANY_VALUE) {
const fate = this.getFate(name);
assert(fate, `There should be a promise tracked with name "${name}"`);
assert('resolve' in fate, `The tracked promise "${name}" should be resolved`);
if (expectedValue !== ANY_VALUE) {
assert.deepEqual(fate.resolve, expectedValue, 'The tracked promise "${name}" should be resolved with the expectedValue');
}
}
assertRejected(name, constructor, regexp) {
const fate = this.fates.get(name);
assert(fate, `There should be a promise tracked with name "${name}"`);
assert('reject' in fate, `The tracked promise "${name}" should be rejected`);
assert.instanceOf(fate.reject, Error);
if (constructor) {
assert.instanceOf(fate.reject, constructor);
}
if (regexp) {
assert.match(fate.reject.message, regexp);
}
}
}
module.exports = PromiseFateTracker;