diff --git a/README.md b/README.md index 7f29a44b4..898de12cd 100644 --- a/README.md +++ b/README.md @@ -226,6 +226,11 @@ This means: - [`ipfs.ping()`]() - [`ipfs.log()`]() +#### [key]() + +- [`ipfs.key.gen(name, [options, callback])`]() +- [`ipfs.key.list([options, callback])`]() + ##### [name]() - [`ipfs.name.publish()`]() diff --git a/src/api/key.js b/src/api/key.js new file mode 100644 index 000000000..ae1a3686a --- /dev/null +++ b/src/api/key.js @@ -0,0 +1,29 @@ +'use strict' + +const promisify = require('promisify-es6') + +module.exports = (send) => { + return { + gen: promisify((args, opts, callback) => { + if (typeof (opts) === 'function') { + callback = opts + opts = {} + } + send({ + path: 'key/gen', + args: args, + qs: opts + }, callback) + }), + list: promisify((opts, callback) => { + if (typeof (opts) === 'function') { + callback = opts + opts = {} + } + send({ + path: 'key/list', + qs: opts + }, callback) + }) + } +} diff --git a/src/load-commands.js b/src/load-commands.js index 1246ef5ef..810381d3d 100644 --- a/src/load-commands.js +++ b/src/load-commands.js @@ -14,6 +14,7 @@ function requireCommands () { dht: require('./api/dht'), diag: require('./api/diag'), id: require('./api/id'), + key: require('./api/key'), get: require('./api/get'), log: require('./api/log'), ls: require('./api/ls'), diff --git a/test/key.spec.js b/test/key.spec.js new file mode 100644 index 000000000..7521e9597 --- /dev/null +++ b/test/key.spec.js @@ -0,0 +1,84 @@ +/* eslint-env mocha */ +/* eslint max-nested-callbacks: ["error", 8] */ +'use strict' + +const FactoryClient = require('./ipfs-factory/client') +const chai = require('chai') +const dirtyChai = require('dirty-chai') +const expect = chai.expect +chai.use(dirtyChai) + +describe('.key', () => { + let ipfs + let fc + + before(function (done) { + this.timeout(20 * 1000) // slow CI + fc = new FactoryClient() + fc.spawnNode((err, node) => { + expect(err).to.not.exist() + ipfs = node + done() + }) + }) + + after((done) => { + fc.dismantle(done) + }) + + describe('Callback API', () => { + describe('.gen', () => { + it('create a new rsa key', (done) => { + ipfs.key.gen('foobarsa', { type: 'rsa', size: 2048 }, (err, res) => { + expect(err).to.not.exist() + expect(res).to.exist() + done() + }) + }) + + it('create a new ed25519 key', (done) => { + ipfs.key.gen('bazed', { type: 'ed25519' }, (err, res) => { + expect(err).to.not.exist() + expect(res).to.exist() + done() + }) + }) + }) + + describe('.list', () => { + it('both keys show up + self', (done) => { + ipfs.key.list((err, res) => { + expect(err).to.not.exist() + expect(res).to.exist() + expect(res.Keys.length).to.equal(3) + done() + }) + }) + }) + }) + + describe('Promise API', () => { + describe('.gen', () => { + it('create a new rsa key', () => { + return ipfs.key.gen('foobarsa2', {type: 'rsa', size: 2048}).then((res) => { + expect(res).to.exist() + }) + }) + + it('create a new ed25519 key', () => { + return ipfs.key.gen('bazed2', {type: 'ed25519'}).then((res) => { + expect(res).to.exist() + }) + }) + }) + + describe('.list', () => { + it('4 keys to show up + self', () => { + return ipfs.key.list().then((res) => { + expect(res).to.exist() + expect(res.Keys.length).to.equal(5) + }) + }) + }) + }) +})