From e3a5daf9dd30127703a66d3c308a6192409bf3f1 Mon Sep 17 00:00:00 2001 From: Janko Simonovic Date: Wed, 30 Sep 2020 16:05:36 +0200 Subject: [PATCH 1/7] feat: enable custom formats for server/client DAG (put|get) operations --- packages/ipfs-http-client/src/dag/get.js | 27 ++++++++++++------- .../ipfs-http-server/src/api/resources/dag.js | 15 ++++++++--- packages/ipfs-http-server/src/index.js | 1 + 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/packages/ipfs-http-client/src/dag/get.js b/packages/ipfs-http-client/src/dag/get.js index 1094b97377..0a7082f233 100644 --- a/packages/ipfs-http-client/src/dag/get.js +++ b/packages/ipfs-http-client/src/dag/get.js @@ -4,23 +4,32 @@ const dagPB = require('ipld-dag-pb') const dagCBOR = require('ipld-dag-cbor') const raw = require('ipld-raw') const configure = require('../lib/configure') - -const resolvers = { - 'dag-cbor': dagCBOR.resolver, - 'dag-pb': dagPB.resolver, - raw: raw.resolver -} +const multicodec = require('multicodec') module.exports = configure((api, options) => { const getBlock = require('../block/get')(options) const dagResolve = require('./resolve')(options) + const formats = { + [multicodec.DAG_PB]: dagPB, + [multicodec.DAG_CBOR]: dagCBOR, + [multicodec.RAW]: raw + } + + const ipldOptions = (options && options.ipld) || {} + const configuredFormats = (ipldOptions && ipldOptions.formats) || [] + configuredFormats.forEach(format => { + formats[format.codec] = format + }) + return async (cid, options = {}) => { const resolved = await dagResolve(cid, options) const block = await getBlock(resolved.cid, options) - const dagResolver = resolvers[resolved.cid.codec] - if (!dagResolver) { + const codec = multicodec[resolved.cid.codec.toUpperCase().replace(/-/g, '_')] + const format = formats[codec] + + if (!format) { throw Object.assign( new Error(`Missing IPLD format "${resolved.cid.codec}"`), { missingMulticodec: resolved.cid.codec } @@ -31,6 +40,6 @@ module.exports = configure((api, options) => { resolved.remainderPath = '/' } - return dagResolver.resolve(block.data, resolved.remainderPath) + return format.resolver.resolve(block.data, resolved.remainderPath) } }) diff --git a/packages/ipfs-http-server/src/api/resources/dag.js b/packages/ipfs-http-server/src/api/resources/dag.js index f0d49e4cf5..6612a83a44 100644 --- a/packages/ipfs-http-server/src/api/resources/dag.js +++ b/packages/ipfs-http-server/src/api/resources/dag.js @@ -203,11 +203,20 @@ exports.put = { } else { const codec = multicodec[format.toUpperCase().replace(/-/g, '_')] - if (!IpldFormats[codec]) { - throw new Error(`Missing IPLD format "${codec}"`) + let ipldFormat = IpldFormats[codec] + if (!ipldFormat) { + // look at the passed config + const { opts } = request.server.app + if (opts) { + const { ipld } = opts + ipldFormat = ipld.formats.find((f) => f.codec === codec) + } } - node = await IpldFormats[codec].util.deserialize(data) + if (!ipldFormat) { + throw new Error(`Missing IPLD format "${codec}"`) + } + node = await ipldFormat.util.deserialize(data) } return { diff --git a/packages/ipfs-http-server/src/index.js b/packages/ipfs-http-server/src/index.js index af446891b8..11d3f7e5b8 100644 --- a/packages/ipfs-http-server/src/index.js +++ b/packages/ipfs-http-server/src/index.js @@ -95,6 +95,7 @@ class HttpApi { compression: false }) server.app.ipfs = ipfs + server.app.opts = opts await server.register({ plugin: Pino, From 97f7fc5f98a5bd65a85b0884f0f1dde497d6874a Mon Sep 17 00:00:00 2001 From: Janko Simonovic Date: Wed, 30 Sep 2020 16:11:10 +0200 Subject: [PATCH 2/7] fix: fix possible undefined --- packages/ipfs-http-server/src/api/resources/dag.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/ipfs-http-server/src/api/resources/dag.js b/packages/ipfs-http-server/src/api/resources/dag.js index 6612a83a44..86cdcf560e 100644 --- a/packages/ipfs-http-server/src/api/resources/dag.js +++ b/packages/ipfs-http-server/src/api/resources/dag.js @@ -209,7 +209,9 @@ exports.put = { const { opts } = request.server.app if (opts) { const { ipld } = opts - ipldFormat = ipld.formats.find((f) => f.codec === codec) + if (ipld) { + ipldFormat = ipld.formats.find((f) => f.codec === codec) + } } } From d246a4d7aa2343b450e61227bb7c5182fe540305 Mon Sep 17 00:00:00 2001 From: Janko Simonovic Date: Wed, 30 Sep 2020 16:44:25 +0200 Subject: [PATCH 3/7] chore: refactor format fetch --- packages/ipfs-http-server/src/api/resources/dag.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/ipfs-http-server/src/api/resources/dag.js b/packages/ipfs-http-server/src/api/resources/dag.js index 86cdcf560e..b36c2c0e79 100644 --- a/packages/ipfs-http-server/src/api/resources/dag.js +++ b/packages/ipfs-http-server/src/api/resources/dag.js @@ -206,12 +206,9 @@ exports.put = { let ipldFormat = IpldFormats[codec] if (!ipldFormat) { // look at the passed config - const { opts } = request.server.app - if (opts) { - const { ipld } = opts - if (ipld) { - ipldFormat = ipld.formats.find((f) => f.codec === codec) - } + const ipldOpts = (request.server.app.opts && request.server.app.opts.ipld) || {} + if (ipldOpts.formats) { + ipldFormat = ipldOpts.formats.find((f) => f.codec === codec) } } From a8f08257ddce159ceeae79783d7f80a269f14f20 Mon Sep 17 00:00:00 2001 From: Janko Simonovic Date: Wed, 30 Sep 2020 19:48:06 +0200 Subject: [PATCH 4/7] fix: pass opts to the server --- packages/ipfs-http-server/src/index.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/ipfs-http-server/src/index.js b/packages/ipfs-http-server/src/index.js index 11d3f7e5b8..ca3bf3e3a5 100644 --- a/packages/ipfs-http-server/src/index.js +++ b/packages/ipfs-http-server/src/index.js @@ -25,7 +25,7 @@ function hapiInfoToMultiaddr (info) { return toMultiaddr(uri) } -async function serverCreator (serverAddrs, createServer, ipfs, cors) { +async function serverCreator (serverAddrs, createServer, ipfs, cors, opts) { serverAddrs = serverAddrs || [] // just in case the address is just string serverAddrs = Array.isArray(serverAddrs) ? serverAddrs : [serverAddrs] @@ -33,7 +33,7 @@ async function serverCreator (serverAddrs, createServer, ipfs, cors) { const servers = [] for (const address of serverAddrs) { const addrParts = address.split('/') - const server = await createServer(addrParts[2], addrParts[4], ipfs, cors) + const server = await createServer(addrParts[2], addrParts[4], ipfs, cors, opts) await server.start() server.info.ma = hapiInfoToMultiaddr(server.info) servers.push(server) @@ -49,7 +49,12 @@ class HttpApi { this._log.error = debug(LOG_ERROR) } - async start () { + /** + * Starts the IPFS HTTP server + * @param {object} [opts.ipld.formats] - IPLD custom formats + * @return {Promise} + */ + async start (opts = {}) { this._log('starting') const ipfs = this._ipfs @@ -63,13 +68,13 @@ class HttpApi { this._apiServers = await serverCreator(apiAddrs, this._createApiServer, ipfs, { origin: config.API.HTTPHeaders['Access-Control-Allow-Origin'] || [], credentials: Boolean(config.API.HTTPHeaders['Access-Control-Allow-Credentials']) - }) + }, opts) this._log('started') return this } - async _createApiServer (host, port, ipfs, cors) { + async _createApiServer (host, port, ipfs, cors, opts) { cors = { ...cors, additionalHeaders: ['X-Stream-Output', 'X-Chunked-Output', 'X-Content-Length'], From 1258569c1603fa84c5e49baf6b354a2ac454f886 Mon Sep 17 00:00:00 2001 From: Janko Simonovic Date: Wed, 30 Sep 2020 19:51:57 +0200 Subject: [PATCH 5/7] feat: pass opts --- packages/ipfs-cli/src/daemon.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/ipfs-cli/src/daemon.js b/packages/ipfs-cli/src/daemon.js index 59ef5fbb9b..c020da975d 100644 --- a/packages/ipfs-cli/src/daemon.js +++ b/packages/ipfs-cli/src/daemon.js @@ -27,7 +27,12 @@ class Daemon { } } - async start () { + /** + * Starts the IPFS HTTP server + * @param {object} [opts.ipld.formats] - IPLD custom formats + * @return {Promise} + */ + async start (opts = {}) { log('starting') const repo = typeof this._options.repo === 'string' || this._options.repo == null @@ -40,7 +45,7 @@ class Daemon { // start HTTP servers (if API or Gateway is enabled in options) const httpApi = new HttpApi(ipfs, ipfsOpts) - this._httpApi = await httpApi.start() + this._httpApi = await httpApi.start(opts) const httpGateway = new HttpGateway(ipfs, ipfsOpts) this._httpGateway = await httpGateway.start() From 64d37b9c7df940e8ccd7fb4b59f19925d9e7842a Mon Sep 17 00:00:00 2001 From: Janko Simonovic Date: Wed, 30 Sep 2020 21:03:16 +0200 Subject: [PATCH 6/7] chore: add documentation --- packages/ipfs-http-server/src/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/ipfs-http-server/src/index.js b/packages/ipfs-http-server/src/index.js index ca3bf3e3a5..15b4e0d5eb 100644 --- a/packages/ipfs-http-server/src/index.js +++ b/packages/ipfs-http-server/src/index.js @@ -51,6 +51,7 @@ class HttpApi { /** * Starts the IPFS HTTP server + * @param {object} [opts] - specify advanced configuration * @param {object} [opts.ipld.formats] - IPLD custom formats * @return {Promise} */ From f8b938984dd7a59a6cf2d0556a258c142338242c Mon Sep 17 00:00:00 2001 From: Janko Simonovic Date: Wed, 30 Sep 2020 22:04:14 +0200 Subject: [PATCH 7/7] fix: fix lint --- packages/ipfs-cli/src/daemon.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/ipfs-cli/src/daemon.js b/packages/ipfs-cli/src/daemon.js index c020da975d..63e1507dc8 100644 --- a/packages/ipfs-cli/src/daemon.js +++ b/packages/ipfs-cli/src/daemon.js @@ -29,6 +29,7 @@ class Daemon { /** * Starts the IPFS HTTP server + * @param {object} [opts] - specify advanced configuration * @param {object} [opts.ipld.formats] - IPLD custom formats * @return {Promise} */