diff --git a/CHANGELOG.md b/CHANGELOG.md index f6a017d..c9fa5f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ All notable changes to this package will be documented in this file. +## [1.4.1] - 2021-05-10 +### Fixed: +- Updated the dependency on the package `original` in order to pick up a newer version of the transitive dependency `url-parse`. Older versions of `url-parse` had a [known vulnerability](https://github.com/advisories/GHSA-9m6j-fcg5-2442). (Thanks, [m-schrepel](https://github.com/launchdarkly/js-eventsource/pull/11)!) + ## [1.4.0] - 2021-01-25 ### Added: - Added `readTimeoutMillis` option for automatically dropping and restarting a connection if too much time has elapsed without receiving any data. diff --git a/example/eventsource-polyfill.js b/example/eventsource-polyfill.js index 6ce25a0..f895c1f 100644 --- a/example/eventsource-polyfill.js +++ b/example/eventsource-polyfill.js @@ -3672,33 +3672,54 @@ function unwrapListeners(arr) { function once(emitter, name) { return new Promise(function (resolve, reject) { - function eventListener() { - if (errorListener !== undefined) { + function errorListener(err) { + emitter.removeListener(name, resolver); + reject(err); + } + + function resolver() { + if (typeof emitter.removeListener === 'function') { emitter.removeListener('error', errorListener); } resolve([].slice.call(arguments)); }; - var errorListener; - - // Adding an error listener is not optional because - // if an error is thrown on an event emitter we cannot - // guarantee that the actual event we are waiting will - // be fired. The result could be a silent way to create - // memory or file descriptor leaks, which is something - // we should avoid. - if (name !== 'error') { - errorListener = function errorListener(err) { - emitter.removeListener(name, eventListener); - reject(err); - }; - emitter.once('error', errorListener); + eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); + if (name !== 'error') { + addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); } - - emitter.once(name, eventListener); }); } +function addErrorHandlerIfEventEmitter(emitter, handler, flags) { + if (typeof emitter.on === 'function') { + eventTargetAgnosticAddListener(emitter, 'error', handler, flags); + } +} + +function eventTargetAgnosticAddListener(emitter, name, listener, flags) { + if (typeof emitter.on === 'function') { + if (flags.once) { + emitter.once(name, listener); + } else { + emitter.on(name, listener); + } + } else if (typeof emitter.addEventListener === 'function') { + // EventTarget does not have `error` event semantics like Node + // EventEmitters, we do not listen for `error` events here. + emitter.addEventListener(name, function wrapListener(arg) { + // IE does not have builtin `{ once: true }` support so we + // have to do it manually. + if (flags.once) { + emitter.removeEventListener(name, wrapListener); + } + listener(arg); + }); + } else { + throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); + } +} + /***/ }), /* 10 */ @@ -7379,8 +7400,8 @@ module.exports = origin; var required = __webpack_require__(28) , qs = __webpack_require__(29) - , slashes = /^[A-Za-z][A-Za-z0-9+-.]*:\/\// - , protocolre = /^([a-z][a-z0-9.+-]*:)?(\/\/)?([\S\s]*)/i + , slashes = /^[A-Za-z][A-Za-z0-9+-.]*:[\\/]+/ + , protocolre = /^([a-z][a-z0-9.+-]*:)?([\\/]{1,})?([\S\s]*)/i , whitespace = '[\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF]' , left = new RegExp('^'+ whitespace +'+'); @@ -7492,12 +7513,16 @@ function lolcation(loc) { */ function extractProtocol(address) { address = trimLeft(address); - var match = protocolre.exec(address); + + var match = protocolre.exec(address) + , protocol = match[1] ? match[1].toLowerCase() : '' + , slashes = !!(match[2] && match[2].length >= 2) + , rest = match[2] && match[2].length === 1 ? '/' + match[3] : match[3]; return { - protocol: match[1] ? match[1].toLowerCase() : '', - slashes: !!match[2], - rest: match[3] + protocol: protocol, + slashes: slashes, + rest: rest }; } @@ -7657,6 +7682,14 @@ function Url(address, location, parser) { url.pathname = resolve(url.pathname, location.pathname); } + // + // Default to a / for pathname if none exists. This normalizes the URL + // to always have a / + // + if (url.pathname.charAt(0) !== '/' && url.hostname) { + url.pathname = '/' + url.pathname; + } + // // We should not add port numbers if they are already the default port number // for a given protocol. As the host also contains the port number we're going diff --git a/package.json b/package.json index 925c81e..e16e1e3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "launchdarkly-eventsource", - "version": "1.4.0", + "version": "1.4.1", "description": "Fork of eventsource package - W3C compliant EventSource client for Node.js and browser (polyfill)", "keywords": [ "eventsource",