all files / lib/internal/process/ promises.js

97.14% Statements 34/35
83.33% Branches 10/12
100% Functions 7/7
97.14% Lines 34/35
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62    1553× 1553× 1553×   1553×   1553× 1553× 61× 38× 23× 23×         1553× 38× 38×     1553× 23× 23× 23× 23×             1553× 31793× 31793× 38× 38× 38× 21× 21×       19×       31793×     1553× 38× 38×     1553×    
'use strict';
 
const promiseRejectEvent = process._promiseRejectEvent;
const hasBeenNotifiedProperty = new WeakMap();
const pendingUnhandledRejections = [];
 
exports.setup = setupPromises;
 
function setupPromises(scheduleMicrotasks) {
  process._setupPromises(function(event, promise, reason) {
    if (event === promiseRejectEvent.unhandled)
      unhandledRejection(promise, reason);
    else Eif (event === promiseRejectEvent.handled)
      rejectionHandled(promise);
    else
      require('assert').fail(null, null, 'unexpected PromiseRejectEvent');
  });
 
  function unhandledRejection(promise, reason) {
    hasBeenNotifiedProperty.set(promise, false);
    addPendingUnhandledRejection(promise, reason);
  }
 
  function rejectionHandled(promise) {
    var hasBeenNotified = hasBeenNotifiedProperty.get(promise);
    Eif (hasBeenNotified !== undefined) {
      hasBeenNotifiedProperty.delete(promise);
      if (hasBeenNotified === true) {
        process.nextTick(function() {
          process.emit('rejectionHandled', promise);
        });
      }
 
    }
  }
 
  function emitPendingUnhandledRejections() {
    var hadListeners = false;
    while (pendingUnhandledRejections.length > 0) {
      var promise = pendingUnhandledRejections.shift();
      var reason = pendingUnhandledRejections.shift();
      if (hasBeenNotifiedProperty.get(promise) === false) {
        hasBeenNotifiedProperty.set(promise, true);
        if (!process.emit('unhandledRejection', reason, promise)) {
          // Nobody is listening.
          // TODO(petkaantonov) Take some default action, see #830
        } else {
          hadListeners = true;
        }
      }
    }
    return hadListeners;
  }
 
  function addPendingUnhandledRejection(promise, reason) {
    pendingUnhandledRejections.push(promise, reason);
    scheduleMicrotasks();
  }
 
  return emitPendingUnhandledRejections;
}