paypal-spotlight
Version:
A smart launcher for PayPal.
82 lines (75 loc) • 2.09 kB
JavaScript
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),
}