Skip to content
This repository was archived by the owner on Feb 12, 2024. It is now read-only.

Commit 596b1f4

Browse files
rvaggachingbrain
andauthoredJan 28, 2022
fix(dag): replace custom dag walk with multiformats/traversal (#3950)
Ref: multiformats/js-multiformats#127 Co-authored-by: achingbrain <alex@achingbrain.net>
1 parent 2c8ec08 commit 596b1f4

File tree

13 files changed

+40
-58
lines changed

13 files changed

+40
-58
lines changed
 

‎packages/interface-ipfs-core/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@
9494
"libp2p-websockets": "^0.16.2",
9595
"merge-options": "^3.0.4",
9696
"multiaddr": "^10.0.0",
97-
"multiformats": "^9.4.13",
97+
"multiformats": "^9.5.1",
9898
"nanoid": "^3.1.23",
9999
"p-map": "^4.0.0",
100100
"p-retry": "^4.5.0",

‎packages/ipfs-cli/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@
8686
"mafmt": "^10.0.0",
8787
"multiaddr": "^10.0.0",
8888
"multiaddr-to-uri": "^8.0.0",
89-
"multiformats": "^9.4.13",
89+
"multiformats": "^9.5.1",
9090
"parse-duration": "^1.0.0",
9191
"pretty-bytes": "^5.4.1",
9292
"progress": "^2.0.3",

‎packages/ipfs-core-types/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
"dependencies": {
4646
"interface-datastore": "^6.0.2",
4747
"multiaddr": "^10.0.0",
48-
"multiformats": "^9.4.13"
48+
"multiformats": "^9.5.1"
4949
},
5050
"devDependencies": {
5151
"aegir": "^36.0.1",

‎packages/ipfs-core-utils/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@
129129
"merge-options": "^3.0.4",
130130
"multiaddr": "^10.0.0",
131131
"multiaddr-to-uri": "^8.0.0",
132-
"multiformats": "^9.4.13",
132+
"multiformats": "^9.5.1",
133133
"nanoid": "^3.1.23",
134134
"parse-duration": "^1.0.0",
135135
"timeout-abort-controller": "^3.0.0",

‎packages/ipfs-core/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@
124124
"mortice": "^2.0.0",
125125
"multiaddr": "^10.0.0",
126126
"multiaddr-to-uri": "^8.0.0",
127-
"multiformats": "^9.4.13",
127+
"multiformats": "^9.5.1",
128128
"pako": "^1.0.2",
129129
"parse-duration": "^1.0.0",
130130
"peer-id": "^0.16.0",

‎packages/ipfs-core/src/components/dag/export.js

+28-46
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { CID } from 'multiformats/cid'
22
import { createUnsafe } from 'multiformats/block'
3-
import { base58btc } from 'multiformats/bases/base58'
43
import { CarWriter } from '@ipld/car/writer'
54
import { withTimeoutOption } from 'ipfs-core-utils/with-timeout-option'
65
import debug from 'debug'
76
import * as raw from 'multiformats/codecs/raw'
87
import * as json from 'multiformats/codecs/json'
8+
import { walk } from 'multiformats/traversal'
99

1010
const log = debug('ipfs:components:dag:import')
1111

@@ -23,6 +23,11 @@ const NO_LINKS_CODECS = [
2323
* @typedef {import('ipfs-core-types/src/utils').AbortOptions} AbortOptions
2424
*/
2525

26+
/**
27+
* @template T
28+
* @typedef {import('multiformats/block').Block<T>} Block
29+
*/
30+
2631
/**
2732
* @param {Object} config
2833
* @param {IPFSRepo} config.repo
@@ -53,12 +58,11 @@ export function createExport ({ repo, preload, codecs }) {
5358
let err = null
5459
;(async () => {
5560
try {
56-
await traverseWrite(
57-
repo,
58-
{ signal: options.signal, timeout: options.timeout },
59-
cid,
60-
writer,
61-
codecs)
61+
const load = makeLoader(repo, writer, {
62+
signal: options.signal,
63+
timeout: options.timeout
64+
}, codecs)
65+
await walk({ cid, load })
6266
} catch (/** @type {any} */ e) {
6367
err = e
6468
} finally {
@@ -81,52 +85,30 @@ export function createExport ({ repo, preload, codecs }) {
8185
}
8286

8387
/**
88+
* @template T
8489
* @param {IPFSRepo} repo
85-
* @param {AbortOptions} options
86-
* @param {CID} cid
8790
* @param {BlockWriter} writer
91+
* @param {AbortOptions} options
8892
* @param {import('ipfs-core-utils/multicodecs').Multicodecs} codecs
89-
* @param {Set<string>} seen
90-
* @returns {Promise<void>}
93+
* @returns {(cid:CID)=>Promise<Block<T>|null>}
9194
*/
92-
async function traverseWrite (repo, options, cid, writer, codecs, seen = new Set()) {
93-
const b58Cid = cid.toString(base58btc)
94-
if (seen.has(b58Cid)) {
95-
return
96-
}
95+
function makeLoader (repo, writer, options, codecs) {
96+
return async (cid) => {
97+
const codec = await codecs.getCodec(cid.code)
9798

98-
const block = await getBlock(repo, options, cid, codecs)
99+
if (!codec) {
100+
throw new Error(`Can't decode links in block with codec 0x${cid.code.toString(16)} to form complete DAG`)
101+
}
99102

100-
log(`Adding block ${cid} to car`)
101-
await writer.put(block)
102-
seen.add(b58Cid)
103+
const bytes = await repo.blocks.get(cid, options)
103104

104-
// recursive traversal of all links
105-
for (const link of block.links) {
106-
await traverseWrite(repo, options, link, writer, codecs, seen)
107-
}
108-
}
105+
log(`Adding block ${cid} to car`)
106+
await writer.put({ cid, bytes })
109107

110-
/**
111-
* @param {IPFSRepo} repo
112-
* @param {AbortOptions} options
113-
* @param {CID} cid
114-
* @param {import('ipfs-core-utils/multicodecs').Multicodecs} codecs
115-
* @returns {Promise<{cid:CID, bytes:Uint8Array, links:CID[]}>}
116-
*/
117-
async function getBlock (repo, options, cid, codecs) {
118-
const bytes = await repo.blocks.get(cid, options)
119-
120-
/** @type {CID[]} */
121-
let links = []
122-
const codec = await codecs.getCodec(cid.code)
123-
124-
if (codec) {
125-
const block = createUnsafe({ bytes, cid, codec })
126-
links = [...block.links()].map((l) => l[1])
127-
} else if (!NO_LINKS_CODECS.includes(cid.code)) {
128-
throw new Error(`Can't decode links in block with codec 0x${cid.code.toString(16)} to form complete DAG`)
129-
}
108+
if (NO_LINKS_CODECS.includes(cid.code)) {
109+
return null // skip this block, no need to look inside
110+
}
130111

131-
return { cid, bytes, links }
112+
return createUnsafe({ bytes, cid, codec })
113+
}
132114
}

‎packages/ipfs-grpc-client/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
"it-first": "^1.0.4",
6464
"it-pushable": "^1.4.2",
6565
"multiaddr": "^10.0.0",
66-
"multiformats": "^9.4.13",
66+
"multiformats": "^9.5.1",
6767
"p-defer": "^3.0.0",
6868
"protobufjs": "^6.10.2",
6969
"wherearewe": "^1.0.0",

‎packages/ipfs-http-client/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
"it-last": "^1.0.4",
6969
"merge-options": "^3.0.4",
7070
"multiaddr": "^10.0.0",
71-
"multiformats": "^9.4.13",
71+
"multiformats": "^9.5.1",
7272
"parse-duration": "^1.0.0",
7373
"stream-to-it": "^0.2.2",
7474
"uint8arrays": "^3.0.0"

‎packages/ipfs-http-gateway/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
"it-last": "^1.0.4",
6969
"it-to-stream": "^1.0.0",
7070
"joi": "^17.2.1",
71-
"multiformats": "^9.4.13",
71+
"multiformats": "^9.5.1",
7272
"uint8arrays": "^3.0.0",
7373
"uri-to-multiaddr": "^6.0.0"
7474
},

‎packages/ipfs-http-server/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
"joi": "^17.2.1",
7272
"just-safe-set": "^2.2.1",
7373
"multiaddr": "^10.0.0",
74-
"multiformats": "^9.4.13",
74+
"multiformats": "^9.5.1",
7575
"parse-duration": "^1.0.0",
7676
"stream-to-it": "^0.2.2",
7777
"timeout-abort-controller": "^3.0.0",

‎packages/ipfs-message-port-client/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
"ipfs-message-port-protocol": "^0.11.0",
5151
"ipfs-unixfs": "^6.0.3",
5252
"it-peekable": "^1.0.2",
53-
"multiformats": "^9.4.13"
53+
"multiformats": "^9.5.1"
5454
},
5555
"devDependencies": {
5656
"aegir": "^36.0.1",

‎packages/ipfs-message-port-protocol/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@
7575
},
7676
"dependencies": {
7777
"ipfs-core-types": "^0.10.0",
78-
"multiformats": "^9.4.13"
78+
"multiformats": "^9.5.1"
7979
},
8080
"devDependencies": {
8181
"aegir": "^36.0.1",

‎packages/ipfs-message-port-server/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
"ipfs-core-types": "^0.10.0",
7272
"ipfs-message-port-protocol": "^0.11.0",
7373
"it-all": "^1.0.4",
74-
"multiformats": "^9.4.13"
74+
"multiformats": "^9.5.1"
7575
},
7676
"devDependencies": {
7777
"aegir": "^36.0.1",

0 commit comments

Comments
 (0)
This repository has been archived.