export default function (P = Promise) { return function (source, listeners) { let current; if (typeof source.getCurrentEvent === 'function') { current = source.getCurrentEvent(); } if (current != null) { // immediately resolve if we have previous cached data return P.resolve(current.data).then(function (cached) { source.open(); return cached; }); } // if we have no previously cached data, listen for the first response return new P(function (resolve, reject) { // close, cleanup and reject if we get an error listeners.add(source, 'error', function (e) { listeners.remove(); e.target.close(); reject(e.error); }); // ...or cleanup and respond with the first lot of data listeners.add(source, 'message', function (e) { listeners.remove(); resolve(e.data); }); }); }; }