'use strict'

var jsonSafeStringify = require('json-stringify-safe') var crypto = require('crypto') var Buffer = require('safe-buffer').Buffer

var defer = typeof setImmediate === 'undefined'

? process.nextTick
: setImmediate

function paramsHaveRequestBody (params) {

return (
  params.body ||
  params.requestBodyStream ||
  (params.json && typeof params.json !== 'boolean') ||
  params.multipart
)

}

function safeStringify (obj, replacer) {

var ret
try {
  ret = JSON.stringify(obj, replacer)
} catch (e) {
  ret = jsonSafeStringify(obj, replacer)
}
return ret

}

function md5 (str) {

return crypto.createHash('md5').update(str).digest('hex')

}

function isReadStream (rs) {

return rs.readable && rs.path && rs.mode

}

function toBase64 (str) {

return Buffer.from(str || '', 'utf8').toString('base64')

}

function copy (obj) {

var o = {}
Object.keys(obj).forEach(function (i) {
  o[i] = obj[i]
})
return o

}

function version () {

var numbers = process.version.replace('v', '').split('.')
return {
  major: parseInt(numbers[0], 10),
  minor: parseInt(numbers[1], 10),
  patch: parseInt(numbers[2], 10)
}

}

exports.paramsHaveRequestBody = paramsHaveRequestBody exports.safeStringify = safeStringify exports.md5 = md5 exports.isReadStream = isReadStream exports.toBase64 = toBase64 exports.copy = copy exports.version = version exports.defer = defer