1 | var utils = require('./utils')
|
2 | , logger = require('./logger')
|
3 | , request = require('request')
|
4 | , http = require('http')
|
5 | , url = require('url')
|
6 | var pkgjson = require('./package.json')
|
7 |
|
8 | var API_CONFIG = {
|
9 | allowUnverified: false
|
10 | , key: process.env.FAAS_API_KEY
|
11 | , secret: process.env.FAAS_API_SECRET
|
12 | , hostname: 'api.faas.io'
|
13 | }
|
14 |
|
15 | var debug = logger('api')
|
16 |
|
17 | exports.config = function(config){
|
18 | if (config) {
|
19 | var apiConf = {}
|
20 | if (config.apiKey) { apiConf.key = config.apiKey }
|
21 | if (config.apiSecret) { apiConf.secret = config.apiSecret }
|
22 | apiConfig(apiConf)
|
23 | }
|
24 | }
|
25 |
|
26 |
|
27 | exports.apiConfig = apiConfig = function(config){
|
28 | utils.extend(API_CONFIG, config)
|
29 | return utils.shallowCopy(API_CONFIG)
|
30 | }
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 | exports.api = function(options, callback){
|
37 | debug('options', options)
|
38 | callback = debug.wrap(callback)
|
39 |
|
40 | var urlOpts = options.url
|
41 |
|
42 | var query = { apiKey: API_CONFIG.key, apiSecret: API_CONFIG.secret }
|
43 | if (urlOpts.query) {
|
44 | utils.extend(query, urlOpts.query)
|
45 | }
|
46 | query.npmVer = pkgjson.version
|
47 | urlOpts.query = query
|
48 | urlOpts.hostname = API_CONFIG.hostname
|
49 | urlOpts.protocol = 'https:'
|
50 |
|
51 |
|
52 | var cfgErrors = []
|
53 | if (!urlOpts.hostname) {
|
54 | cfgErrors.push('blank api hostname')
|
55 | }
|
56 | if (!urlOpts.query.apiKey) {
|
57 | cfgErrors.push('missing api key')
|
58 | }
|
59 | if (!urlOpts.query.apiSecret) {
|
60 | cfgErrors.push('missing api secret')
|
61 | }
|
62 | if (cfgErrors.length > 0) {
|
63 | debug('ERROR urlOpts', urlOpts)
|
64 | callback('Invalid configuration options: '+cfgErrors.join('; '))
|
65 | return
|
66 | }
|
67 |
|
68 | var reqOpts = {
|
69 | uri: url.format(urlOpts)
|
70 | , method: options.method || 'GET'
|
71 | , json: options.data || true
|
72 | , encoding: 'utf8'
|
73 | , strictSSL: API_CONFIG.allowUnverified ? false : true
|
74 | }
|
75 |
|
76 | debug('reqOpts', reqOpts)
|
77 |
|
78 | request(reqOpts, function(err, res, body){
|
79 | debug('response', res && res.statusCode, res && res.headers, body)
|
80 | if (!err && res && (res.statusCode < 200 || res.statusCode >= 300)) {
|
81 | err = body && body.error || (res.statusCode+": "+http.STATUS_CODES[res.statusCode])+': '+JSON.stringify(body)
|
82 | }
|
83 | if (body && body.data) {
|
84 | body = body.data
|
85 | }
|
86 | callback(err, body)
|
87 | })
|
88 | }
|