UNPKG

paypal-spotlight

Version:

A smart launcher for PayPal.

82 lines (75 loc) 2.09 kB
const EventEmitter = require('events') const request = require('request') const got = require('got') const em = new EventEmitter() function isPromise(object) { if (Promise && Promise.resolve) { // TODO To review the impact if strict equality is enforced // eslint-disable-next-line eqeqeq return Promise.resolve(object) == object } return false } /** * Makes a new request to the given endpoint * * @param {String} endpoint * @param {Object} options * @return {Promise} */ const makeRequest = (baseURL, endpoint, options) => { const opts = Object.assign({}, { json: true }, options) const url = `${baseURL}/${endpoint.replace(/^\//, '')}` const prom = got(url, opts) return new Promise((resolve, reject) => { prom.then(res => resolve(res.body), err => reject(err)) }) } const withEventEmitter = fn => { return (...args) => { const ctx = this em.emit('start', args) const res = fn.apply(ctx, args) if (isPromise(res)) { return new Promise((resolve, reject) => { res.then( (...responseArgs) => { resolve(...responseArgs) em.emit('done', responseArgs) }, (...errorArgs) => { // eslint-disable-next-line prefer-promise-reject-errors reject(...errorArgs) em.emit('error', errorArgs) }, ) }) } em.emit('done', res) return res } } const withCallbackEmitter = fn => { return (...args) => { const ctx = this em.emit('start', args) const cb = args.slice(-1)[0] if (typeof cb === 'function') { const callbackDecorator = (...cbArgs) => { // eslint-disable-next-line standard/no-callback-literal cb(...cbArgs) em.emit('done', cbArgs) } const res = fn.apply(ctx, [...args.slice(0, -1), callbackDecorator]) return res } const res = fn.apply(ctx, args) em.emit('done', res) return res } } module.exports = { makeRequest: withEventEmitter(makeRequest), requestListener: em, request: withCallbackEmitter(request), }