NetworkService for Hipster Delorean
var reqwest = require('reqwest'); | |
var _ = require('lodash'); | |
var Promise = require('bluebird'); | |
class Network{ | |
constructor(defs){ | |
this._httpMethods = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS']; | |
this._defs = { | |
'GET': {}, | |
'POST': {}, | |
'OPTIONS': {}, | |
'DELETE': {}, | |
'PUT': {}, | |
'ALL': defs || {} | |
}; | |
this._request = reqwest; | |
this._headers = { | |
'GET': {}, | |
'POST': {}, | |
'PUT': {}, | |
'DELETE': {}, | |
'ALL': {} | |
}; | |
this._transforms = { | |
'GET' : [], | |
'POST' : [], | |
'PUT' : [], | |
'DELETE': [], | |
'ALL' : [] | |
}; | |
this._filters = { | |
'GET' : [], | |
'POST' : [], | |
'PUT' : [], | |
'DELETE': [], | |
'ALL' : [] | |
}; | |
} | |
setHeaders(method, headers){ | |
if( !headers ){ | |
headers = method; | |
method = 'ALL'; | |
} | |
for(var key in headers){ | |
this._headers[method][key] = headers[key]; | |
} | |
} | |
setOption(key, value, method){ | |
method = method || 'ALL'; | |
for(var key in headers){ | |
this._defs[method][key] = value; | |
} | |
} | |
createRequest(options){ | |
// Makes a fully qualified request.. adds callback etc etc blah blah | |
options['method'] = options['method'] || 'GET'; | |
if( this._httpMethods.indexOf(options['method']) === -1 ){ | |
throw new Error('Unknown HTTP method'); | |
} | |
options['headers'] = options['headers'] || {}; | |
// Perform various transformations | |
var transforms = _.flatten([ this._transforms['ALL'], this._transforms[options['method']] ]); | |
options = transforms.reduce((options, transform) => { | |
return transform(options); | |
}, options); | |
// Add options... this can be used to encorporate | |
// Default headers aswell | |
options = _.assign(options, this._defs['ALL']); | |
options = _.assign(options, this._defs[options['method']]); | |
// No transforms for now. | |
options['headers'] = _.assign(options['headers'], this._headers['ALL']); | |
options['headers'] = _.assign(options['headers'], this._headers[options['method']]); | |
// Just simple | |
var request = this._request; | |
var callbacks = _.flatten([this._filters['ALL'], this._filters['method']], true); | |
// Use bluebird promises | |
// Promises of reqwest are a terrible qwest. | |
var r = new Promise((resolve, reject) => { | |
options = _.assign(options, { | |
success: resolve, | |
error: reject | |
}); | |
request(options); | |
}); | |
// console.log(callbacks); | |
// Just Incredible | |
return callbacks.reduce((prev, curr) => { | |
return prev.then.apply(prev, curr); | |
}, r); | |
} | |
registerTransform(method, transform){ | |
if( !transform ){ | |
transform = method; | |
method = null; | |
} | |
method = method || 'ALL'; | |
console.log(this, method, transform); | |
this._transforms[method].push(transform); | |
} | |
registerFilter(method, filter){ | |
if( !filter ){ | |
filter = method; | |
method = null; | |
} | |
method = method || 'ALL'; | |
if( ! Array.isArray( filter )){ | |
filter = [filter]; | |
} | |
this._filters[method].push(filter); | |
} | |
get( url, data ){ | |
return this.createRequest({ | |
method : 'GET', | |
url : url, | |
data : data | |
}); | |
} | |
post(url, data){ | |
return this.createRequest({ | |
url : url, | |
data : data, | |
method : 'POST', | |
}); | |
} | |
put(url, data){ | |
return this.createRequest({ | |
url : url, | |
data : data, | |
method : 'PUT' | |
}); | |
} | |
delete(url, data){ | |
return this.createRequest({ | |
method : 'DELETE', | |
url : url, | |
data : data | |
}); | |
} | |
} | |
export default Network; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment