diff --git a/src/api/config.js b/src/api/config.js index 582362bb6..670a3265e 100644 --- a/src/api/config.js +++ b/src/api/config.js @@ -1,31 +1,64 @@ 'use strict' -const argCommand = require('../cmd-helpers').argCommand +const streamifier = require('streamifier') module.exports = (send) => { return { - get: argCommand(send, 'config'), - set (key, value, opts, cb) { - if (typeof (opts) === 'function') { - cb = opts + get (key, callback) { + if (typeof key === 'function') { + callback = key + key = undefined + } + + if (!key) { + return send('config/show', null, null, null, true, callback) + } + + return send('config', key, null, null, (err, result) => { + if (err) { + return callback(err) + } + callback(null, result.Value) + }) + }, + set (key, value, opts, callback) { + if (typeof opts === 'function') { + callback = opts opts = {} } + if (typeof key !== 'string') { + return callback(new Error('Invalid key type')) + } + + if (typeof value !== 'object' && + typeof value !== 'boolean' && + typeof value !== 'string') { + return callback(new Error('Invalid value type')) + } - if (typeof (value) === 'object') { + if (typeof value === 'object') { value = JSON.stringify(value) opts = { json: true } - } else if (typeof (value) === 'boolean') { + } + + if (typeof value === 'boolean') { value = value.toString() opts = { bool: true } } - return send('config', [key, value], opts, null, cb) - }, - show (cb) { - return send('config/show', null, null, null, true, cb) + return send('config', [key, value], opts, null, callback) }, - replace (file, cb) { - return send('config/replace', null, null, file, cb) + replace (config, callback) { + // Its a path + if (typeof config === 'string') { + return send('config/replace', null, null, config, callback) + } + + // Its a config obj + if (typeof config === 'object') { + config = streamifier.createReadStream(new Buffer(JSON.stringify(config))) + return send('config/replace', null, null, config, callback) + } } } } diff --git a/src/get-files-stream.js b/src/get-files-stream.js index f723b34fd..485e06cce 100644 --- a/src/get-files-stream.js +++ b/src/get-files-stream.js @@ -93,7 +93,9 @@ function loadPaths (opts, file) { } function getFilesStream (files, opts) { - if (!files) return null + if (!files) { + return null + } const mp = new Multipart() diff --git a/src/request-api.js b/src/request-api.js index a5c01ea4c..a8a48b944 100644 --- a/src/request-api.js +++ b/src/request-api.js @@ -32,7 +32,8 @@ function onRes (buffer, cb, uri) { const stream = Boolean(res.headers['x-stream-output']) const chunkedObjects = Boolean(res.headers['x-chunked-output']) - const isJson = res.headers['content-type'] && res.headers['content-type'].indexOf('application/json') === 0 + const isJson = res.headers['content-type'] && + res.headers['content-type'].indexOf('application/json') === 0 if (res.statusCode >= 400 || !res.statusCode) { const error = new Error(`Server responded with ${res.statusCode}`) @@ -96,7 +97,7 @@ function requestAPI (config, path, args, qs, files, buffer, cb) { const port = config.port ? `:${config.port}` : '' const opts = { - method: files ? 'POST' : 'GET', + method: 'POST', uri: `${config.protocol}://${config.host}${port}${config['api-path']}${path}?${Qs.stringify(qs, {arrayFormat: 'repeat'})}`, headers: {} } @@ -112,7 +113,6 @@ function requestAPI (config, path, args, qs, files, buffer, cb) { } opts.headers['Content-Type'] = `multipart/form-data; boundary=${stream.boundary}` - opts.downstreamRes = stream opts.payload = stream } diff --git a/test/api/config.spec.js b/test/api/config.spec.js index 86914958e..0d87e0363 100644 --- a/test/api/config.spec.js +++ b/test/api/config.spec.js @@ -3,133 +3,15 @@ /* globals apiClients */ 'use strict' -const expect = require('chai').expect -const isNode = require('detect-node') -const path = require('path') - -describe('.config', () => { - describe('.config.{set, get}', () => { - it('string', (done) => { - const confKey = 'arbitraryKey' - const confVal = 'arbitraryVal' - - apiClients.a.config.set(confKey, confVal, (err, res) => { - expect(err).to.not.exist - apiClients.a.config.get(confKey, (err, res) => { - expect(err).to.not.exist - expect(res).to.have.a.property('Value', confVal) - done() - }) - }) - }) - - it('bool', (done) => { - const confKey = 'otherKey' - const confVal = true - - apiClients.a.config.set(confKey, confVal, (err, res) => { - expect(err).to.not.exist - apiClients.a.config.get(confKey, (err, res) => { - expect(err).to.not.exist - expect(res.Value).to.deep.equal(confVal) - done() - }) - }) - }) - - it('json', (done) => { - const confKey = 'API.HTTPHeaders.Access-Control-Allow-Origin' - const confVal = ['http://example.io'] - - apiClients.a.config.set(confKey, confVal, (err, res) => { - expect(err).to.not.exist - apiClients.a.config.get(confKey, (err, res) => { - expect(err).to.not.exist - expect(res.Value).to.deep.equal(confVal) - done() - }) - }) - }) - }) - - it('.config.show', (done) => { - apiClients.c.config.show((err, res) => { - expect(err).to.not.exist - expect(res).to.exist - done() - }) - }) - - it('.config.replace', (done) => { - if (!isNode) { - return done() - } - - apiClients.c.config.replace(path.join(__dirname, '/../r-config.json'), (err, res) => { - expect(err).to.not.exist - expect(res).to.be.equal(null) - done() - }) - }) - - describe('promise', () => { - describe('.config.{set, get}', () => { - it('string', () => { - const confKey = 'arbitraryKey' - const confVal = 'arbitraryVal' - - return apiClients.a.config.set(confKey, confVal) - .then((res) => { - return apiClients.a.config.get(confKey) - }) - .then((res) => { - expect(res).to.have.a.property('Value', confVal) - }) - }) - - it('bool', () => { - const confKey = 'otherKey' - const confVal = true - - return apiClients.a.config.set(confKey, confVal) - .then((res) => { - return apiClients.a.config.get(confKey) - }) - .then((res) => { - expect(res.Value).to.deep.equal(confVal) - }) - }) - - it('json', () => { - const confKey = 'API.HTTPHeaders.Access-Control-Allow-Origin' - const confVal = ['http://example.com'] - - return apiClients.a.config.set(confKey, confVal) - .then((res) => { - return apiClients.a.config.get(confKey) - }) - .then((res) => { - expect(res.Value).to.deep.equal(confVal) - }) - }) - }) - - it('.config.show', () => { - return apiClients.c.config.show() - .then((res) => { - expect(res).to.exist - }) - }) - - it('.config.replace', () => { - if (!isNode) { - return - } - - return apiClients.c.config.replace(path.join(__dirname, '/../r-config.json')) - .then((res) => { - expect(res).to.be.equal(null) - }) - }) - }) -}) +const test = require('interface-ipfs-core') + +const common = { + setup: function (cb) { + cb(null, apiClients.a) + }, + teardown: function (cb) { + cb() + } +} + +test.config(common)