Skip to content
This repository was archived by the owner on Oct 1, 2021. It is now read-only.

Commit 1e7592d

Browse files
authored
fix: replace node buffers with uint8arrays (#25)
* fix: replace node buffers with uint8arrays BREAKING CHANGES: - node `Buffer`s have been replaced with `Uint8Array`s
1 parent 3d5cff9 commit 1e7592d

File tree

10 files changed

+57
-59
lines changed

10 files changed

+57
-59
lines changed

migrations/migration-8/index.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const ShardingStore = core.ShardingDatastore
77
const mb = require('multibase')
88
const utils = require('../../src/utils')
99
const log = require('debug')('ipfs-repo-migrations:migration-8')
10+
const uint8ArrayToString = require('uint8arrays/to-string')
1011

1112
// This function in js-ipfs-repo defaults to not using sharding
1213
// but the default value of the options.sharding is true hence this
@@ -31,7 +32,7 @@ function keyToMultihash (key) {
3132
multihash = mb.encode('base32', multihash).slice(1)
3233

3334
// Should be uppercase for interop with go
34-
multihash = multihash.toString().toUpperCase()
35+
multihash = uint8ArrayToString(multihash).toUpperCase()
3536

3637
return new Key(`/${multihash}`, false)
3738
}
@@ -40,9 +41,9 @@ function keyToCid (key) {
4041
const buf = mb.decode(`b${key.toString().slice(1)}`)
4142

4243
// CID to Key
43-
const multihash = mb.encode('base32', new CID(1, 'raw', buf).buffer).slice(1)
44+
const multihash = mb.encode('base32', new CID(1, 'raw', buf).bytes).slice(1)
4445

45-
return new Key(`/${multihash}`.toUpperCase(), false)
46+
return new Key(`/${uint8ArrayToString(multihash)}`.toUpperCase(), false)
4647
}
4748

4849
async function process (repoPath, options, keyFunction){

migrations/migration-9/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ async function pinsToDAG (blockstore, datastore, pinstore) {
6666
}
6767
}
6868

69-
const pinRoot = new dagpb.DAGNode(Buffer.alloc(0), [
69+
const pinRoot = new dagpb.DAGNode(new Uint8Array(), [
7070
await pinset.storeSet(blockstore, PinTypes.recursive, recursivePins),
7171
await pinset.storeSet(blockstore, PinTypes.direct, directPins)
7272
])

migrations/migration-9/pin-set.js

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,12 @@ const dagpb = require('ipld-dag-pb')
88
const { DAGNode, DAGLink } = dagpb
99
const multicodec = require('multicodec')
1010
const pbSchema = require('./pin.proto')
11-
const { Buffer } = require('buffer')
1211
const { cidToKey, DEFAULT_FANOUT, MAX_ITEMS, EMPTY_KEY } = require('./utils')
12+
const uint8ArrayConcat = require('uint8arrays/concat')
13+
const uint8ArrayCompare = require('uint8arrays/compare')
14+
const uint8ArrayToString = require('uint8arrays/to-string')
15+
const uint8ArrayFromString = require('uint8arrays/from-string')
16+
const uint8ArrayEquals = require('uint8arrays/equals')
1317

1418
const pb = protobuf(pbSchema)
1519

@@ -50,12 +54,13 @@ function readHeader (rootNode) {
5054
}
5155

5256
function hash (seed, key) {
53-
const buf = Buffer.alloc(4)
54-
buf.writeUInt32LE(seed, 0)
55-
const data = Buffer.concat([
56-
buf, Buffer.from(toB58String(key))
57-
])
58-
return fnv1a(data.toString('binary'))
57+
const buffer = new ArrayBuffer(4)
58+
const dataView = new DataView(buffer)
59+
dataView.setUint32(0, seed, true)
60+
const encodedKey = uint8ArrayFromString(toB58String(key))
61+
const data = uint8ArrayConcat([buf, encodedKey], buf.length + encodedKey.length)
62+
63+
return fnv1a(uint8ArrayToString(data))
5964
}
6065

6166
async function * walkItems (blockstore, node) {
@@ -68,7 +73,7 @@ async function * walkItems (blockstore, node) {
6873
// if a fanout bin is not 'empty', dig into and walk its DAGLinks
6974
const linkHash = link.Hash
7075

71-
if (!EMPTY_KEY.equals(linkHash.buffer)) {
76+
if (!uint8ArrayEquals(EMPTY_KEY, linkHash.bytes)) {
7277
// walk the links of this fanout bin
7378
const buf = await blockstore.get(cidToKey(linkHash))
7479
const node = dagpb.util.deserialize(buf)
@@ -106,9 +111,9 @@ function storeItems (blockstore, items) {
106111
fanout: DEFAULT_FANOUT,
107112
seed: depth
108113
})
109-
const headerBuf = Buffer.concat([
110-
Buffer.from(varint.encode(pbHeader.length)), pbHeader
111-
])
114+
115+
const header = varint.encode(pbHeader.length)
116+
const headerBuf = uint8ArrayConcat([header, pbHeader])
112117
const fanoutLinks = []
113118

114119
for (let i = 0; i < DEFAULT_FANOUT; i++) {
@@ -120,16 +125,16 @@ function storeItems (blockstore, items) {
120125
.map(item => {
121126
return ({
122127
link: new DAGLink('', 1, item.key),
123-
data: item.data || Buffer.alloc(0)
128+
data: item.data || new Uint8Array()
124129
})
125130
})
126131
// sorting makes any ordering of `pins` produce the same DAGNode
127-
.sort((a, b) => Buffer.compare(a.link.Hash.buffer, b.link.Hash.buffer))
132+
.sort((a, b) => {
133+
return uint8ArrayCompare(a.link.Hash.bytes, b.link.Hash.bytes)
134+
})
128135

129136
const rootLinks = fanoutLinks.concat(nodes.map(item => item.link))
130-
const rootData = Buffer.concat(
131-
[headerBuf].concat(nodes.map(item => item.data))
132-
)
137+
const rootData = uint8ArrayConcat([headerBuf, ...nodes.map(item => item.data)])
133138

134139
return new DAGNode(rootData, rootLinks)
135140
} else {
@@ -162,13 +167,6 @@ function storeItems (blockstore, items) {
162167
}
163168

164169
async function storeChild (child, binIdx) {
165-
const opts = {
166-
version: 0,
167-
format: multicodec.DAG_PB,
168-
hashAlg: multicodec.SHA2_256,
169-
preload: false
170-
}
171-
172170
const buf = dagpb.util.serialize(child)
173171
const cid = dagpb.util.cid(buf, {
174172
cidVersion: 0,

package.json

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,22 +44,22 @@
4444
"docs": "aegir docs"
4545
},
4646
"dependencies": {
47-
"buffer": "^5.6.0",
4847
"cbor": "^5.0.2",
4948
"chalk": "^4.0.0",
50-
"cids": "^0.8.3",
51-
"datastore-core": "^1.1.0",
52-
"datastore-fs": "^1.0.0",
53-
"datastore-level": "^1.1.0",
49+
"cids": "^1.0.0",
50+
"datastore-core": "^2.0.0",
51+
"datastore-fs": "^2.0.0",
52+
"datastore-level": "^2.0.0",
5453
"debug": "^4.1.0",
5554
"fnv1a": "^1.0.1",
56-
"interface-datastore": "^1.0.2",
57-
"ipld-dag-pb": "^0.18.5",
58-
"multibase": "^1.0.1",
59-
"multicodec": "^1.0.3",
60-
"multihashing-async": "^1.0.0",
55+
"interface-datastore": "^2.0.0",
56+
"ipld-dag-pb": "^0.20.0",
57+
"multibase": "^3.0.0",
58+
"multicodec": "^2.0.0",
59+
"multihashing-async": "^2.0.0",
6160
"proper-lockfile": "^4.1.1",
62-
"protons": "^1.2.1",
61+
"protons": "^2.0.0",
62+
"uint8arrays": "^1.0.0",
6363
"varint": "^5.0.0",
6464
"yargs": "^15.3.1",
6565
"yargs-promise": "^1.1.0"

src/repo/version.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
'use strict'
22

3-
const { Buffer } = require('buffer')
43
const errors = require('../errors')
54
const repoInit = require('./init')
65
const Datastore = require('datastore-fs')
6+
const uint8ArrayFromString = require('uint8arrays/from-string')
77

88
const Key = require('interface-datastore').Key
99

@@ -43,7 +43,7 @@ async function getVersion (path) {
4343
async function setVersion (path, version) {
4444
const store = new Datastore(path, { extension: '', createIfMissing: false })
4545
await store.open()
46-
await store.put(versionKey, Buffer.from(String(version)))
46+
await store.put(versionKey, uint8ArrayFromString(String(version)))
4747
await store.close()
4848
}
4949

test/browser.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
/* eslint-env mocha */
22
'use strict'
33

4-
const { Buffer } = require('buffer')
54
const loadFixture = require('aegir/fixtures')
65
const Datastore = require('datastore-level')
76

@@ -24,8 +23,8 @@ async function createAndLoadRepo () {
2423
const store = new Datastore(dir, { extension: '', createIfMissing: true })
2524
await store.open()
2625

27-
await store.put(VERSION_KEY, Buffer.from(loadFixture('test/fixtures/test-repo/version')))
28-
await store.put(CONFIG_KEY, Buffer.from(loadFixture('test/fixtures/test-repo/config')))
26+
await store.put(VERSION_KEY, loadFixture('test/fixtures/test-repo/version'))
27+
await store.put(CONFIG_KEY, loadFixture('test/fixtures/test-repo/config'))
2928

3029
return dir
3130
}

test/init-test.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
/* eslint-env mocha */
22
'use strict'
33

4-
const { Buffer } = require('buffer')
54
const { expect } = require('./util')
65

76
const Datastore = require('datastore-fs')
87
const Key = require('interface-datastore').Key
98
const repoInit = require('../src/repo/init')
9+
const uint8ArrayFromString = require('uint8arrays/from-string')
1010

1111
module.exports = (setup, cleanup) => {
1212
let dir
@@ -23,8 +23,8 @@ module.exports = (setup, cleanup) => {
2323
const configKey = new Key('config')
2424
const store = new Datastore(dir, { extension: '', createIfMissing: false })
2525
await store.open()
26-
await store.put(versionKey, Buffer.from('7'))
27-
await store.put(configKey, Buffer.from('config'))
26+
await store.put(versionKey, uint8ArrayFromString('7'))
27+
await store.put(configKey, uint8ArrayFromString('config'))
2828
await store.close()
2929

3030
expect(await repoInit.isRepoInitialized(dir)).to.be.true()

test/migrations/migration-9-test.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@ const multicodec = require('multicodec')
1212
const multibase = require('multibase')
1313
const all = require('it-all')
1414
const cbor = require('cbor')
15+
const uint8ArrayFromString = require('uint8arrays/from-string')
1516

1617
const migration = require('../../migrations/migration-9')
1718
const { createStore, cidToKey, PIN_DS_KEY, DEFAULT_FANOUT } = require('../../migrations/migration-9/utils')
1819
const CID = require('cids')
1920

2021
function keyToCid (key) {
21-
const buf = Buffer.from(multibase.encoding('base32upper').decode(key.toString().split('/').pop()))
22+
const buf = multibase.encoding('base32upper').decode(key.toString().split('/').pop())
2223
return new CID(buf)
2324
}
2425

@@ -49,19 +50,19 @@ async function bootstrapBlocks (blockstore, datastore) {
4950
)
5051
const bucket = new Array(DEFAULT_FANOUT).fill(0).map(() => new DAGLink('', 1, emptyBlock.Hash))
5152
const directLinks = await putNode(
52-
new DAGNode(Buffer.from('CggBEIACHQAAAAA=', 'base64'), bucket),
53+
new DAGNode(uint8ArrayFromString('CggBEIACHQAAAAA=', 'base64urlpad'), bucket),
5354
'QmbxHkprr5qdLSK8EZWdBzKFzNXGoKrxb7A4PHX3eH6JPp'
5455
)
5556
const recursiveLinks = await putNode(
56-
new DAGNode(Buffer.from('CggBEIACHQAAAAA=', 'base64'), [
57+
new DAGNode(uint8ArrayFromString('CggBEIACHQAAAAA=', 'base64urlpad'), [
5758
...bucket,
5859
new DAGLink('', 1, pinnedCid)
5960
]),
6061
'QmdEtks1KYQsrgJ8FXpP1vXygnVHSqnyFTKQ3wcWVd4D2y'
6162
)
6263

6364
const pinRoot = await putNode(
64-
new DAGNode(Buffer.alloc(0), [
65+
new DAGNode(new Uint8Array(), [
6566
new DAGLink('direct', directLinks.Tsize, directLinks.Hash),
6667
new DAGLink('recursive', recursiveLinks.Tsize, recursiveLinks.Hash)
6768
]),

test/test-migrations/migration-2/index.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
'use strict'
22

3-
const { Buffer } = require('buffer')
43
const Datastore = require('datastore-fs')
54
const Key = require('interface-datastore').Key
65
const _set = require('just-safe-set')
6+
const uint8ArrayFromString = require('uint8arrays/from-string')
77

88
const CONFIG_KEY = new Key('config')
99
const NEW_API_ADDRESS = '/ip6/::/tcp/5001'
@@ -89,7 +89,7 @@ async function migrate (repoPath, options, isBrowser) {
8989
// Modify allowed origin
9090
_set(config, 'Gateway.HTTPHeaders.Access-Control-Allow-Origin', 'some.origin.com')
9191

92-
const buf = Buffer.from(JSON.stringify(config, null, 2))
92+
const buf = uint8ArrayFromString(JSON.stringify(config, null, 2))
9393
await store.put(CONFIG_KEY, buf)
9494
} finally {
9595
await store.close()
@@ -109,7 +109,7 @@ async function revert (repoPath, options, isBrowser) {
109109
// Reset origin
110110
_set(config, 'Gateway.HTTPHeaders.Access-Control-Allow-Origin', '*')
111111

112-
const buf = Buffer.from(JSON.stringify(config, null, 2))
112+
const buf = uint8ArrayFromString(JSON.stringify(config, null, 2))
113113
await store.put(CONFIG_KEY, buf)
114114
} finally {
115115
await store.close()

test/version-test.js

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
/* eslint-env mocha */
22
'use strict'
33

4-
const { Buffer } = require('buffer')
54
const { expect } = require('./util')
65

76
const Datastore = require('datastore-fs')
87
const Key = require('interface-datastore').Key
98
const version = require('../src/repo/version')
10-
9+
const uint8ArrayFromString = require('uint8arrays/from-string')
1110
const errors = require('../src/errors')
1211

1312
// When new versioning mechanism is introduced in new version don't forget to update
@@ -34,8 +33,8 @@ module.exports = (setup, cleanup) => {
3433
// Create version file
3534
const store = new Datastore(dir, { extension: '', createIfMissing: false })
3635
await store.open()
37-
await store.put(new Key('config'), Buffer.from('some dummy config'))
38-
await store.put(new Key('version'), Buffer.from('7'))
36+
await store.put(new Key('config'), uint8ArrayFromString('some dummy config'))
37+
await store.put(new Key('version'), uint8ArrayFromString('7'))
3938
await store.close()
4039

4140
expect(await version.getVersion(dir)).to.be.equal(7)
@@ -47,8 +46,8 @@ module.exports = (setup, cleanup) => {
4746
// Create version file
4847
const store = new Datastore(dir, { extension: '', createIfMissing: false })
4948
await store.open()
50-
await store.put(new Key('config'), Buffer.from('some dummy config'))
51-
await store.put(new Key('version'), Buffer.from('5'))
49+
await store.put(new Key('config'), uint8ArrayFromString('some dummy config'))
50+
await store.put(new Key('version'), uint8ArrayFromString('5'))
5251
await store.close()
5352

5453
await version.setVersion(dir, 7)

0 commit comments

Comments
 (0)