Skip to content
This repository has been archived by the owner on Mar 10, 2020. It is now read-only.

feat: ipns working locally #327

Merged
merged 5 commits into from
Aug 10, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions js/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ exports.files = require('./files')
exports.key = require('./key')
exports.ls = require('./ls')
exports.miscellaneous = require('./miscellaneous')
exports.name = require('./name')
exports.object = require('./object')
exports.pin = require('./pin')
exports.ping = require('./ping')
Expand Down
9 changes: 9 additions & 0 deletions js/src/name/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
'use strict'
const { createSuite } = require('../utils/suite')

const tests = {
publish: require('./publish'),
resolve: require('./resolve')
}

module.exports = createSuite(tests)
103 changes: 103 additions & 0 deletions js/src/name/publish.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
/* eslint-env mocha */
'use strict'

const hat = require('hat')

const { fixture } = require('./utils')
const { spawnNodeWithId } = require('../utils/spawn')
const { getDescribe, getIt, expect } = require('../utils/mocha')

module.exports = (createCommon, options) => {
const describe = getDescribe(options)
const it = getIt(options)
const common = createCommon()

describe('.name.publish', function () {
const keyName = hat()
let ipfs
let nodeId

before(function (done) {
// CI takes longer to instantiate the daemon, so we need to increase the
// timeout for the before step
this.timeout(60 * 1000)

common.setup((err, factory) => {
expect(err).to.not.exist()

spawnNodeWithId(factory, (err, node) => {
expect(err).to.not.exist()

ipfs = node
nodeId = node.peerId.id

ipfs.files.add(fixture.data, { pin: false }, done)
})
})
})

after((done) => common.teardown(done))

it('should publish an IPNS record with the default params', function (done) {
this.timeout(50 * 1000)

const value = fixture.cid

ipfs.name.publish(value, (err, res) => {
expect(err).to.not.exist()
expect(res).to.exist()
expect(res.name).to.equal(nodeId)
expect(res.value).to.equal(`/ipfs/${value}`)

done()
})
})

it('should publish correctly when the file was not added but resolve is disabled', function (done) {
this.timeout(50 * 1000)

const value = 'QmPFVLPmp9zv5Z5KUqLhe2EivAGccQW2r7M7jhVJGLZoZU'

const options = {
resolve: false,
lifetime: '1m',
ttl: '10s',
key: 'self'
}

ipfs.name.publish(value, options, (err, res) => {
expect(err).to.not.exist()
expect(res).to.exist()
expect(res.name).to.equal(nodeId)
expect(res.value).to.equal(`/ipfs/${value}`)

done()
})
})

it('should publish with a key received as param, instead of using the key of the node', function (done) {
this.timeout(90 * 1000)

const value = fixture.cid
const options = {
resolve: false,
lifetime: '24h',
ttl: '10s',
key: keyName
}

ipfs.key.gen(keyName, { type: 'rsa', size: 2048 }, function (err, key) {
expect(err).to.not.exist()

ipfs.name.publish(value, options, (err, res) => {
expect(err).to.not.exist()
expect(res).to.exist()
expect(res.name).to.equal(key.id)
expect(res.value).to.equal(`/ipfs/${value}`)

done()
})
})
})
})
}
137 changes: 137 additions & 0 deletions js/src/name/resolve.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
/* eslint max-nested-callbacks: ["error", 6] */
/* eslint-env mocha */
'use strict'

const hat = require('hat')

const { fixture } = require('./utils')
const { spawnNodeWithId } = require('../utils/spawn')
const { getDescribe, getIt, expect } = require('../utils/mocha')

module.exports = (createCommon, options) => {
const describe = getDescribe(options)
const it = getIt(options)
const common = createCommon()

describe('.name.resolve', function () {
const keyName = hat()
let ipfs
let nodeId
let keyId

before(function (done) {
// CI takes longer to instantiate the daemon, so we need to increase the
// timeout for the before step
this.timeout(60 * 1000)

common.setup((err, factory) => {
expect(err).to.not.exist()

spawnNodeWithId(factory, (err, node) => {
expect(err).to.not.exist()

ipfs = node
nodeId = node.peerId.id

ipfs.files.add(fixture.data, { pin: false }, done)
})
})
})

after((done) => common.teardown(done))

it('should resolve a record with the default params after a publish', function (done) {
this.timeout(50 * 1000)

const value = fixture.cid

ipfs.name.publish(value, (err, res) => {
expect(err).to.not.exist()
expect(res).to.exist()

ipfs.name.resolve(nodeId, (err, res) => {
expect(err).to.not.exist()
expect(res).to.exist()
expect(res.path).to.equal(`/ipfs/${value}`)

done()
})
})
})

it('should not get the entry if its validity time expired', function (done) {
this.timeout(50 * 1000)

const value = fixture.cid
const publishOptions = {
resolve: true,
lifetime: '1ms',
ttl: '10s',
key: 'self'
}

ipfs.name.publish(value, publishOptions, (err, res) => {
expect(err).to.not.exist()
expect(res).to.exist()

// guarantee that the record has an expired validity.
setTimeout(function () {
ipfs.name.resolve(nodeId, (err, res) => {
expect(err).to.exist()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there an error message we can assert on here (would have to be the same for go-ipfs and js-ipfs)?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah, I am using the same message as go-ipfs and I will add an assertion for it.

expect(err.message).to.equal('record has expired')
expect(res).to.not.exist()

done()
})
}, 1)
})
})

it('should recursively resolve to an IPFS hash', function (done) {
this.timeout(100 * 1000)

const value = fixture.cid
const publishOptions = {
resolve: false,
lifetime: '24h',
ttl: '10s',
key: 'self'
}

// Generate new key
ipfs.key.gen(keyName, { type: 'rsa', size: 2048 }, (err, key) => {
expect(err).to.not.exist()

keyId = key.id

// publish ipfs
ipfs.name.publish(value, publishOptions, (err, res) => {
expect(err).to.not.exist()
expect(res).to.exist()

publishOptions.key = keyName

// publish ipns with the generated key
ipfs.name.publish(`/ipns/${nodeId}`, publishOptions, (err, res) => {
expect(err).to.not.exist()
expect(res).to.exist()

const resolveOptions = {
nocache: false,
recursive: true
}

// recursive resolve (will get ipns first, and will resolve again to find the ipfs)
ipfs.name.resolve(keyId, resolveOptions, (err, res) => {
expect(err).to.not.exist()
expect(res).to.exist()
expect(res.path).to.equal(`/ipfs/${value}`)

done()
})
})
})
})
})
})
}
8 changes: 8 additions & 0 deletions js/src/name/utils.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
'use strict'

const loadFixture = require('aegir/fixtures')

exports.fixture = Object.freeze({
data: loadFixture('js/test/fixtures/testfile.txt', 'interface-ipfs-core'),
cid: 'Qma4hjFTnCasJ8PVp3mZbZK5g2vGDT4LByLJ7m8ciyRFZP'
})