@autonomys/auto-drive 0.7.0 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/dist/cid/index.d.ts +1 -1
  2. package/dist/cid/index.d.ts.map +1 -1
  3. package/dist/cid/index.js +3 -3
  4. package/dist/ipld/blockstore/base.d.ts +9 -0
  5. package/dist/ipld/blockstore/base.d.ts.map +1 -0
  6. package/dist/ipld/blockstore/base.js +1 -0
  7. package/dist/ipld/blockstore/index.d.ts +3 -0
  8. package/dist/ipld/blockstore/index.d.ts.map +1 -0
  9. package/dist/ipld/blockstore/index.js +2 -0
  10. package/dist/ipld/blockstore/memory.d.ts +13 -0
  11. package/dist/ipld/blockstore/memory.d.ts.map +1 -0
  12. package/dist/ipld/blockstore/memory.js +57 -0
  13. package/dist/ipld/builders.d.ts +1 -1
  14. package/dist/ipld/builders.d.ts.map +1 -1
  15. package/dist/ipld/chunker.d.ts +23 -13
  16. package/dist/ipld/chunker.d.ts.map +1 -1
  17. package/dist/ipld/chunker.js +148 -45
  18. package/dist/ipld/index.d.ts +2 -1
  19. package/dist/ipld/index.d.ts.map +1 -1
  20. package/dist/ipld/index.js +2 -1
  21. package/dist/ipld/nodes.d.ts +1 -1
  22. package/dist/ipld/nodes.d.ts.map +1 -1
  23. package/dist/ipld/nodes.js +1 -1
  24. package/dist/ipld/utils.d.ts +7 -4
  25. package/dist/ipld/utils.d.ts.map +1 -1
  26. package/dist/ipld/utils.js +49 -9
  27. package/dist/metadata/offchain/file.d.ts +2 -2
  28. package/dist/metadata/offchain/file.d.ts.map +1 -1
  29. package/dist/metadata/offchain/file.js +6 -13
  30. package/dist/metadata/offchain/folder.d.ts +4 -1
  31. package/dist/metadata/offchain/folder.d.ts.map +1 -1
  32. package/dist/metadata/offchain/folder.js +17 -1
  33. package/dist/metadata/onchain/utils.js +2 -2
  34. package/dist/src/cid/index.d.ts +9 -0
  35. package/dist/src/cid/index.d.ts.map +1 -0
  36. package/dist/src/cid/index.js +20 -0
  37. package/dist/src/index.d.ts +4 -0
  38. package/dist/src/index.d.ts.map +1 -0
  39. package/dist/src/index.js +3 -0
  40. package/dist/src/ipld/builders.d.ts +11 -0
  41. package/dist/src/ipld/builders.d.ts.map +1 -0
  42. package/dist/src/ipld/builders.js +13 -0
  43. package/dist/src/ipld/chunker.d.ts +22 -0
  44. package/dist/src/ipld/chunker.d.ts.map +1 -0
  45. package/dist/src/ipld/chunker.js +144 -0
  46. package/dist/src/ipld/index.d.ts +4 -0
  47. package/dist/src/ipld/index.d.ts.map +1 -0
  48. package/dist/src/ipld/index.js +3 -0
  49. package/dist/src/ipld/nodes.d.ts +15 -0
  50. package/dist/src/ipld/nodes.d.ts.map +1 -0
  51. package/dist/src/ipld/nodes.js +89 -0
  52. package/dist/src/ipld/utils.d.ts +5 -0
  53. package/dist/src/ipld/utils.d.ts.map +1 -0
  54. package/dist/src/ipld/utils.js +51 -0
  55. package/dist/src/metadata/index.d.ts +3 -0
  56. package/dist/src/metadata/index.d.ts.map +1 -0
  57. package/dist/src/metadata/index.js +2 -0
  58. package/dist/src/metadata/offchain/base.d.ts +4 -0
  59. package/dist/src/metadata/offchain/base.d.ts.map +1 -0
  60. package/dist/src/metadata/offchain/base.js +1 -0
  61. package/dist/src/metadata/offchain/file.d.ts +16 -0
  62. package/dist/src/metadata/offchain/file.d.ts.map +1 -0
  63. package/dist/src/metadata/offchain/file.js +19 -0
  64. package/dist/src/metadata/offchain/folder.d.ts +17 -0
  65. package/dist/src/metadata/offchain/folder.d.ts.map +1 -0
  66. package/dist/src/metadata/offchain/folder.js +10 -0
  67. package/dist/src/metadata/offchain/index.d.ts +4 -0
  68. package/dist/src/metadata/offchain/index.d.ts.map +1 -0
  69. package/dist/src/metadata/offchain/index.js +3 -0
  70. package/dist/src/metadata/onchain/index.d.ts +3 -0
  71. package/dist/src/metadata/onchain/index.d.ts.map +1 -0
  72. package/dist/src/metadata/onchain/index.js +2 -0
  73. package/dist/src/metadata/onchain/protobuf/OnchainMetadata.d.ts +28 -0
  74. package/dist/src/metadata/onchain/protobuf/OnchainMetadata.d.ts.map +1 -0
  75. package/dist/src/metadata/onchain/protobuf/OnchainMetadata.js +112 -0
  76. package/dist/src/metadata/onchain/utils.d.ts +4 -0
  77. package/dist/src/metadata/onchain/utils.d.ts.map +1 -0
  78. package/dist/src/metadata/onchain/utils.js +12 -0
  79. package/package.json +4 -2
  80. package/src/cid/index.ts +3 -3
  81. package/src/ipld/builders.ts +1 -1
  82. package/src/ipld/chunker.ts +114 -56
  83. package/src/ipld/index.ts +2 -1
  84. package/src/ipld/nodes.ts +1 -1
  85. package/src/ipld/utils.ts +17 -11
  86. package/src/metadata/offchain/file.ts +10 -15
  87. package/src/metadata/offchain/folder.ts +24 -3
  88. package/src/metadata/onchain/utils.ts +2 -2
  89. package/tests/chunker.spec.ts +148 -46
  90. package/tests/cid.spec.ts +1 -1
  91. package/tests/nodes.spec.ts +1 -1
@@ -1,17 +1,26 @@
1
- import { createNode } from '@ipld/dag-pb'
2
- import { cidOfNode } from '../src'
3
- import { createFileIPLDDag, createFolderIPLDDag, createMetadataIPLDDag } from '../src/ipld/chunker'
1
+ import { BaseBlockstore, MemoryBlockstore } from 'blockstore-core'
2
+ import { cidOfNode, cidToString } from '../src'
3
+ import {
4
+ processFileToIPLDFormat,
5
+ processFolderToIPLDFormat,
6
+ processMetadataToIPLDFormat,
7
+ } from '../src/ipld/chunker'
8
+ import { createNode, decodeNode, PBNode } from '../src/ipld/utils'
4
9
  import { IPLDNodeData, MetadataType, OffchainMetadata } from '../src/metadata'
5
10
 
6
11
  describe('chunker', () => {
7
12
  describe('file creation', () => {
8
- it('create a file dag from a small buffer', () => {
13
+ it('create a file dag from a small buffer', async () => {
9
14
  const text = 'hello world'
15
+ const size = text.length
10
16
  const name = 'test.txt'
11
- const dag = createFileIPLDDag(Buffer.from(text), name)
12
- expect(dag.nodes.size).toBe(1)
17
+ const blockstore = new MemoryBlockstore()
13
18
 
14
- const node = dag.nodes.get(dag.headCID)
19
+ await processFileToIPLDFormat(blockstore, bufferToIterable(Buffer.from(text)), size, name)
20
+ const nodes = await nodesFromBlockstore(blockstore)
21
+ expect(nodes.length).toBe(1)
22
+
23
+ const node = nodes[0]
15
24
  expect(node).toBeDefined()
16
25
  expect(node?.Data).toBeDefined()
17
26
  const decoded = IPLDNodeData.decode(node?.Data ?? new Uint8Array())
@@ -28,22 +37,33 @@ describe('chunker', () => {
28
37
  expect(node?.Links.length).toBe(0)
29
38
  })
30
39
 
31
- it('create a file dag from a large buffer', () => {
32
- const chunkSize = 1000
40
+ it('create a file dag from a large buffer', async () => {
41
+ const maxChunkSize = 1000
33
42
  const chunkNum = 10
34
- const chunk = 'h'.repeat(chunkSize)
43
+ const chunk = 'h'.repeat(maxChunkSize)
35
44
  const text = chunk.repeat(chunkNum)
45
+ const size = text.length
36
46
 
37
47
  const name = 'test.txt'
48
+ /// 1 chunk + root
49
+ const EXPECTED_NODE_COUNT = 2
38
50
 
39
- const dag = createFileIPLDDag(Buffer.from(text), name, {
40
- chunkSize,
41
- maxLinkPerNode: chunkSize / 64,
42
- })
51
+ const blockstore = new MemoryBlockstore()
52
+ const headCID = await processFileToIPLDFormat(
53
+ blockstore,
54
+ bufferToIterable(Buffer.from(text)),
55
+ size,
56
+ name,
57
+ {
58
+ maxChunkSize,
59
+ maxLinkPerNode: maxChunkSize / 64,
60
+ },
61
+ )
43
62
 
44
- expect(dag.nodes.size).toBe(chunkNum + 1)
63
+ const nodes = await nodesFromBlockstore(blockstore)
64
+ expect(nodes.length).toBe(EXPECTED_NODE_COUNT)
45
65
 
46
- const head = dag.nodes.get(dag.headCID)
66
+ const head = decodeNode(await blockstore.get(headCID))
47
67
  expect(head?.Data).toBeDefined()
48
68
  expect(head).toBeDefined()
49
69
  expect(head?.Links.length).toBe(chunkNum)
@@ -54,33 +74,42 @@ describe('chunker', () => {
54
74
  expect(decoded.linkDepth).toBe(1)
55
75
  expect(decoded.size).toBe(text.length)
56
76
 
57
- Array.from(dag.nodes.entries()).forEach(([cid, node]) => {
58
- if (cid !== dag.headCID) {
77
+ nodes.forEach((node) => {
78
+ if (cidToString(cidOfNode(node)) !== cidToString(headCID)) {
59
79
  expect(node?.Links.length).toBe(0)
60
80
  }
61
81
  })
62
82
  })
63
83
 
64
- it('create a file dag with inlinks', () => {
65
- const chunkSize = 1000
84
+ it('create a file dag with inlinks', async () => {
85
+ const maxChunkSize = 1000
66
86
  const chunkNum = 10
67
- const chunk = 'h'.repeat(chunkSize)
87
+ const chunk = 'h'.repeat(maxChunkSize)
68
88
  const name = 'test.txt'
69
89
  const text = chunk.repeat(chunkNum)
90
+ const size = text.length
70
91
 
71
- /// 10 chunks + 3 inlinks + root
72
- const EXPECTED_NODE_COUNT = 14
92
+ /// 1 chunks + 2 inlinks + root
93
+ const EXPECTED_NODE_COUNT = 4
73
94
 
74
- const dag = createFileIPLDDag(Buffer.from(text), name, {
75
- chunkSize,
76
- maxLinkPerNode: 4,
77
- })
95
+ const blockstore = new MemoryBlockstore()
96
+ const headCID = await processFileToIPLDFormat(
97
+ blockstore,
98
+ bufferToIterable(Buffer.from(text)),
99
+ size,
100
+ name,
101
+ {
102
+ maxChunkSize,
103
+ maxLinkPerNode: 4,
104
+ },
105
+ )
78
106
 
79
- expect(dag.nodes.size).toBe(EXPECTED_NODE_COUNT)
107
+ const nodes = await nodesFromBlockstore(blockstore)
108
+ expect(nodes.length).toBe(EXPECTED_NODE_COUNT)
80
109
 
81
110
  let [rootCount, inlinkCount, chunkCount] = [0, 0, 0]
82
111
 
83
- Array.from(dag.nodes.values()).forEach((node) => {
112
+ nodes.forEach((node) => {
84
113
  const decoded = IPLDNodeData.decode(node?.Data ?? new Uint8Array())
85
114
  if (decoded.type === MetadataType.File) {
86
115
  rootCount++
@@ -94,24 +123,26 @@ describe('chunker', () => {
94
123
  })
95
124
 
96
125
  expect(rootCount).toBe(1)
97
- expect(inlinkCount).toBe(3)
98
- expect(chunkCount).toBe(10)
126
+ expect(inlinkCount).toBe(2)
127
+ expect(chunkCount).toBe(1)
99
128
  })
100
129
  })
101
130
 
102
131
  describe('folder creation', () => {
103
- it('create a folder dag from a small buffer', () => {
132
+ it('create a folder dag from a small buffer', async () => {
104
133
  const links = Array.from({ length: 1 }, () =>
105
134
  cidOfNode(createNode(Buffer.from(Math.random().toString()))),
106
135
  )
107
136
  const name = 'folder'
108
137
  const size = 1000
109
- const dag = createFolderIPLDDag(links, name, size, {
138
+ const blockstore = new MemoryBlockstore()
139
+ const headCID = processFolderToIPLDFormat(blockstore, links, name, size, {
110
140
  maxLinkPerNode: 4,
111
141
  })
112
142
 
113
- expect(dag.nodes.size).toBe(1)
114
- const node = dag.nodes.get(dag.headCID)
143
+ const nodes = await nodesFromBlockstore(blockstore)
144
+ expect(nodes.length).toBe(1)
145
+ const node = nodes[0]
115
146
  expect(node).toBeDefined()
116
147
  expect(node?.Data).toBeDefined()
117
148
  const decoded = IPLDNodeData.decode(node?.Data ?? new Uint8Array())
@@ -121,7 +152,7 @@ describe('chunker', () => {
121
152
  expect(decoded.size).toBe(size)
122
153
  })
123
154
 
124
- it('create a folder dag with inlinks', () => {
155
+ it('create a folder dag with inlinks', async () => {
125
156
  const links = Array.from({ length: 10 }, () =>
126
157
  cidOfNode(createNode(Buffer.from(Math.random().toString()))),
127
158
  )
@@ -131,15 +162,17 @@ describe('chunker', () => {
131
162
  /// 3 inlinks + root
132
163
  const EXPECTED_NODE_COUNT = 4
133
164
 
134
- const dag = createFolderIPLDDag(links, name, size, {
165
+ const blockstore = new MemoryBlockstore()
166
+ const headCID = processFolderToIPLDFormat(blockstore, links, name, size, {
135
167
  maxLinkPerNode: 4,
136
168
  })
137
169
 
138
- expect(dag.nodes.size).toBe(EXPECTED_NODE_COUNT)
170
+ const nodes = await nodesFromBlockstore(blockstore)
171
+ expect(nodes.length).toBe(EXPECTED_NODE_COUNT)
139
172
 
140
173
  let [rootCount, inlinkCount] = [0, 0, 0]
141
174
 
142
- Array.from(dag.nodes.values()).forEach((node) => {
175
+ nodes.forEach((node) => {
143
176
  const decoded = IPLDNodeData.decode(node?.Data ?? new Uint8Array())
144
177
  if (decoded.type === MetadataType.Folder) {
145
178
  rootCount++
@@ -156,7 +189,7 @@ describe('chunker', () => {
156
189
  })
157
190
 
158
191
  describe('metadata creation', () => {
159
- it('create a metadata dag from a small buffer', () => {
192
+ it('create a metadata dag from a small buffer', async () => {
160
193
  const metadata: OffchainMetadata = {
161
194
  type: 'file',
162
195
  dataCid: 'test',
@@ -167,11 +200,13 @@ describe('chunker', () => {
167
200
  chunks: [],
168
201
  }
169
202
 
170
- const dag = createMetadataIPLDDag(metadata)
171
- expect(dag.nodes.size).toBe(1)
203
+ const blockstore = new MemoryBlockstore()
204
+ const headCID = await processMetadataToIPLDFormat(blockstore, metadata)
205
+ const nodes = await nodesFromBlockstore(blockstore)
206
+ expect(nodes.length).toBe(1)
172
207
  })
173
208
 
174
- it('large metadata dag represented into multiple nodes', () => {
209
+ it('large metadata dag represented into multiple nodes', async () => {
175
210
  const metadata: OffchainMetadata = {
176
211
  type: 'file',
177
212
  dataCid: 'test',
@@ -182,11 +217,78 @@ describe('chunker', () => {
182
217
  chunks: [],
183
218
  }
184
219
 
185
- const dag = createMetadataIPLDDag(metadata, {
186
- chunkSize: 200,
220
+ const blockstore = new MemoryBlockstore()
221
+ const headCID = await processMetadataToIPLDFormat(blockstore, metadata, {
222
+ maxChunkSize: 200,
187
223
  maxLinkPerNode: 2,
188
224
  })
189
- expect(dag.nodes.size).toBeGreaterThan(1)
225
+ const nodes = await nodesFromBlockstore(blockstore)
226
+ expect(nodes.length).toBeGreaterThan(1)
227
+ })
228
+ })
229
+
230
+ describe('asyncronous chunking equivalence', () => {
231
+ it('chunk a small file buffer', async () => {
232
+ const buffer = Buffer.from('hello world')
233
+ const blockstore = new MemoryBlockstore()
234
+ const chunkedBlockstore = new MemoryBlockstore()
235
+ const singleBufferCID = await processFileToIPLDFormat(
236
+ blockstore,
237
+ bufferToIterable(buffer),
238
+ buffer.length,
239
+ 'test.txt',
240
+ )
241
+ const chunkedBufferCID = await processFileToIPLDFormat(
242
+ chunkedBlockstore,
243
+ separateBufferToIterable(buffer, 5),
244
+ buffer.length,
245
+ 'test.txt',
246
+ )
247
+
248
+ expect(singleBufferCID).toEqual(chunkedBufferCID)
249
+ })
250
+
251
+ it('chunk a large file buffer', async () => {
252
+ const buffer = Buffer.from('hello world')
253
+ const blockstore = new MemoryBlockstore()
254
+ const chunkedBlockstore = new MemoryBlockstore()
255
+ const singleBufferCID = await processFileToIPLDFormat(
256
+ blockstore,
257
+ bufferToIterable(buffer),
258
+ buffer.length,
259
+ 'test.txt',
260
+ )
261
+ const chunkedBufferCID = await processFileToIPLDFormat(
262
+ chunkedBlockstore,
263
+ separateBufferToIterable(buffer, 5),
264
+ buffer.length,
265
+ 'test.txt',
266
+ )
267
+
268
+ expect(singleBufferCID).toEqual(chunkedBufferCID)
190
269
  })
191
270
  })
192
271
  })
272
+
273
+ const bufferToIterable = (buffer: Buffer): AsyncIterable<Buffer> => {
274
+ return (async function* () {
275
+ yield buffer
276
+ })()
277
+ }
278
+
279
+ const separateBufferToIterable = (buffer: Buffer, chunkSize: number): AsyncIterable<Buffer> => {
280
+ return (async function* () {
281
+ while (buffer.length > 0) {
282
+ yield buffer.subarray(0, chunkSize)
283
+ buffer = buffer.subarray(chunkSize)
284
+ }
285
+ })()
286
+ }
287
+
288
+ const nodesFromBlockstore = async (blockstore: BaseBlockstore): Promise<PBNode[]> => {
289
+ const nodes: PBNode[] = []
290
+ for await (const pair of blockstore.getAll()) {
291
+ nodes.push(decodeNode(pair.block))
292
+ }
293
+ return nodes
294
+ }
package/tests/cid.spec.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { createNode } from '@ipld/dag-pb'
2
1
  import { CID } from 'multiformats'
3
2
  import { cidOfNode, cidToString, stringToCid } from '../src/cid/index.js'
3
+ import { createNode } from '../src/ipld/index.js'
4
4
 
5
5
  const randomCIDString = cidOfNode(createNode(new Uint8Array([]), [])).toString()
6
6
 
@@ -1,10 +1,10 @@
1
- import { createNode } from '@ipld/dag-pb'
2
1
  import {
3
2
  cidOfNode,
4
3
  createChunkedFileIpldNode,
5
4
  createFileChunkIpldNode,
6
5
  createSingleFileIpldNode,
7
6
  } from '../src/index.js'
7
+ import { createNode } from '../src/ipld/index.js'
8
8
  import { IPLDNodeData, MetadataType } from '../src/metadata/onchain/protobuf/OnchainMetadata.js'
9
9
 
10
10
  describe('node creation', () => {