diff --git a/package.json b/package.json index 28d8e62273..cd3223f3d1 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,7 @@ "cids": "~0.5.5", "class-is": "^1.1.0", "datastore-core": "~0.6.0", - "datastore-pubsub": "ipfs/js-datastore-pubsub#feat/encode-record-store-keys", + "datastore-pubsub": "~0.1.1", "debug": "^4.1.0", "deep-extend": "~0.6.0", "err-code": "^1.1.2", @@ -120,7 +120,7 @@ "ipld-ethereum": "^2.0.1", "ipld-git": "~0.2.2", "ipld-zcash": "~0.1.6", - "ipns": "~0.3.0", + "ipns": "~0.4.2", "is-ipfs": "~0.4.7", "is-pull-stream": "~0.0.0", "is-stream": "^1.1.0", diff --git a/src/core/components/pubsub.js b/src/core/components/pubsub.js index f22f34cf34..8bb15910bc 100644 --- a/src/core/components/pubsub.js +++ b/src/core/components/pubsub.js @@ -8,6 +8,8 @@ const errPubsubDisabled = () => { return errCode(new Error('pubsub experiment is not enabled'), 'ERR_PUBSUB_DISABLED') } +const pubsubEnabled = (options) => options.EXPERIMENTAL.pubsub || options.EXPERIMENTAL.ipnsPubsub + module.exports = function pubsub (self) { return { subscribe: (topic, handler, options, callback) => { @@ -16,7 +18,7 @@ module.exports = function pubsub (self) { options = {} } - if (!self._options.EXPERIMENTAL.pubsub) { + if (!pubsubEnabled(self._options)) { return callback ? setImmediate(() => callback(errPubsubDisabled())) : Promise.reject(errPubsubDisabled()) @@ -37,7 +39,7 @@ module.exports = function pubsub (self) { }, unsubscribe: (topic, handler, callback) => { - if (!self._options.EXPERIMENTAL.pubsub) { + if (!pubsubEnabled(self._options)) { return callback ? setImmediate(() => callback(errPubsubDisabled())) : Promise.reject(errPubsubDisabled()) @@ -53,28 +55,28 @@ module.exports = function pubsub (self) { }, publish: promisify((topic, data, callback) => { - if (!self._options.EXPERIMENTAL.pubsub) { + if (!pubsubEnabled(self._options)) { return setImmediate(() => callback(errPubsubDisabled())) } self._libp2pNode.pubsub.publish(topic, data, callback) }), ls: promisify((callback) => { - if (!self._options.EXPERIMENTAL.pubsub) { + if (!pubsubEnabled(self._options)) { return setImmediate(() => callback(errPubsubDisabled())) } self._libp2pNode.pubsub.ls(callback) }), peers: promisify((topic, callback) => { - if (!self._options.EXPERIMENTAL.pubsub) { + if (!pubsubEnabled(self._options)) { return setImmediate(() => callback(errPubsubDisabled())) } self._libp2pNode.pubsub.peers(topic, callback) }), setMaxListeners (n) { - if (!self._options.EXPERIMENTAL.pubsub) { + if (!pubsubEnabled(self._options)) { throw errPubsubDisabled() } self._libp2pNode.pubsub.setMaxListeners(n) diff --git a/src/core/ipns/publisher.js b/src/core/ipns/publisher.js index 9e8fcdf3f3..4be4fc41bb 100644 --- a/src/core/ipns/publisher.js +++ b/src/core/ipns/publisher.js @@ -1,7 +1,6 @@ 'use strict' const PeerId = require('peer-id') -const Record = require('libp2p-record').Record const { Key } = require('interface-datastore') const series = require('async/series') const errcode = require('err-code') @@ -97,19 +96,17 @@ class IpnsPublisher { return callback(errcode(new Error(errMsg), 'ERR_INVALID_DATASTORE_KEY')) } - let rec + let entryData try { // Marshal record - const entryData = ipns.marshal(entry) - // Marshal to libp2p record - rec = new Record(key.toBuffer(), entryData) + entryData = ipns.marshal(entry) } catch (err) { log.error(err) return callback(err) } // Add record to routing (buffer key) - this._routing.put(key.toBuffer(), rec.serialize(), (err, res) => { + this._routing.put(key.toBuffer(), entryData, (err, res) => { if (err) { const errMsg = `ipns record for ${key.toString()} could not be stored in the routing` @@ -137,17 +134,8 @@ class IpnsPublisher { return callback(errcode(new Error(errMsg), 'ERR_UNDEFINED_PARAMETER')) } - let rec - try { - // Marshal to libp2p record - rec = new Record(key.toBuffer(), publicKey.bytes) - } catch (err) { - log.error(err) - return callback(err) - } - // Add public key to routing (buffer key) - this._routing.put(key.toBuffer(), rec.serialize(), (err, res) => { + this._routing.put(key.toBuffer(), publicKey.bytes, (err, res) => { if (err) { const errMsg = `public key for ${key.toString()} could not be stored in the routing` diff --git a/src/core/ipns/resolver.js b/src/core/ipns/resolver.js index f9fb81ccd5..8ff9c38ab3 100644 --- a/src/core/ipns/resolver.js +++ b/src/core/ipns/resolver.js @@ -1,7 +1,6 @@ 'use strict' const ipns = require('ipns') -const Record = require('libp2p-record').Record const PeerId = require('peer-id') const errcode = require('err-code') @@ -119,8 +118,7 @@ class IpnsResolver { let ipnsEntry try { - const record = Record.deserialize(res) - ipnsEntry = ipns.unmarshal(record.value) + ipnsEntry = ipns.unmarshal(res) } catch (err) { const errMsg = `found ipns record that we couldn't convert to a value` diff --git a/src/core/ipns/routing/offline-datastore.js b/src/core/ipns/routing/offline-datastore.js index 26de52528c..84a49545eb 100644 --- a/src/core/ipns/routing/offline-datastore.js +++ b/src/core/ipns/routing/offline-datastore.js @@ -1,6 +1,7 @@ 'use strict' const { Key } = require('interface-datastore') +const Record = require('libp2p-record').Record const { encodeBase32 } = require('./utils') const errcode = require('err-code') @@ -48,7 +49,10 @@ class OfflineDatastore { return callback(errcode(new Error(errMsg), 'ERR_GENERATING_ROUTING_KEY')) } - this._repo.datastore.put(routingKey, value, callback) + // Marshal to libp2p record as the DHT does + let record = new Record(key, value) + + this._repo.datastore.put(routingKey, record.serialize(), callback) } /** @@ -76,7 +80,22 @@ class OfflineDatastore { return callback(errcode(new Error(errMsg), 'ERR_GENERATING_ROUTING_KEY')) } - this._repo.datastore.get(routingKey, callback) + this._repo.datastore.get(routingKey, (err, res) => { + if (err) { + return callback(err) + } + + // Unmarshal libp2p record as the DHT does + let record + try { + record = Record.deserialize(res) + } catch (err) { + log.error(err) + return callback(err) + } + + callback(null, record.value) + }) } // encode key properly - base32(/ipns/{cid}) diff --git a/src/core/ipns/routing/pubsub-datastore.js b/src/core/ipns/routing/pubsub-datastore.js index 0556698c4b..17d4b718e9 100644 --- a/src/core/ipns/routing/pubsub-datastore.js +++ b/src/core/ipns/routing/pubsub-datastore.js @@ -89,7 +89,6 @@ class IpnsPubsubDatastore { } // Modify subscription key to have a proper encoding - // Without this, the utf-8 encoding gets the key broken _handleSubscriptionKey (key, callback) { const subscriber = this._subscriptions[key]