@autonomys/auto-drive 0.7.3 → 0.8.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.
- package/README.md +44 -137
- package/dist/api/calls/download.d.ts +6 -0
- package/dist/api/calls/download.d.ts.map +1 -0
- package/dist/api/calls/download.js +12 -0
- package/dist/api/calls/index.d.ts +5 -0
- package/dist/api/calls/index.d.ts.map +1 -0
- package/dist/api/calls/index.js +4 -0
- package/dist/api/calls/read.d.ts +98 -0
- package/dist/api/calls/read.d.ts.map +1 -0
- package/dist/api/calls/read.js +140 -0
- package/dist/api/calls/upload.d.ts +94 -0
- package/dist/api/calls/upload.d.ts.map +1 -0
- package/dist/api/calls/upload.js +120 -0
- package/dist/api/calls/write.d.ts +49 -0
- package/dist/api/calls/write.d.ts.map +1 -0
- package/dist/api/calls/write.js +65 -0
- package/dist/api/connection.d.ts +8 -0
- package/dist/api/connection.d.ts.map +1 -0
- package/dist/api/connection.js +17 -0
- package/dist/api/index.d.ts +5 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +4 -0
- package/dist/api/models/folderTree.d.ts +45 -0
- package/dist/api/models/folderTree.d.ts.map +1 -0
- package/dist/api/models/folderTree.js +56 -0
- package/dist/api/models/index.d.ts +3 -0
- package/dist/api/models/index.d.ts.map +1 -0
- package/dist/api/models/index.js +2 -0
- package/dist/api/models/objects.d.ts +41 -0
- package/dist/api/models/objects.d.ts.map +1 -0
- package/dist/api/models/objects.js +10 -0
- package/dist/api/models/uploads.d.ts +114 -0
- package/dist/api/models/uploads.d.ts.map +1 -0
- package/dist/api/models/uploads.js +40 -0
- package/dist/api/wrappers.d.ts +67 -0
- package/dist/api/wrappers.d.ts.map +1 -0
- package/dist/api/wrappers.js +158 -0
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -3
- package/dist/utils/async.d.ts +3 -0
- package/dist/utils/async.d.ts.map +1 -0
- package/dist/utils/async.js +21 -0
- package/dist/utils/folder.d.ts +2 -0
- package/dist/utils/folder.d.ts.map +1 -0
- package/dist/utils/folder.js +14 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/stream.d.ts +3 -0
- package/dist/utils/stream.d.ts.map +1 -0
- package/dist/utils/stream.js +22 -0
- package/dist/utils/types.d.ts +6 -0
- package/dist/utils/types.d.ts.map +1 -0
- package/package.json +11 -32
- package/src/api/calls/download.ts +21 -0
- package/src/api/calls/index.ts +4 -0
- package/src/api/calls/read.ts +194 -0
- package/src/api/calls/upload.ts +198 -0
- package/src/api/calls/write.ts +88 -0
- package/src/api/connection.ts +32 -0
- package/src/api/index.ts +4 -0
- package/src/api/models/folderTree.ts +77 -0
- package/src/api/models/index.ts +2 -0
- package/src/api/models/objects.ts +47 -0
- package/src/api/models/uploads.ts +49 -0
- package/src/api/wrappers.ts +229 -0
- package/src/index.ts +2 -3
- package/src/utils/async.ts +29 -0
- package/src/utils/folder.ts +15 -0
- package/src/utils/index.ts +4 -0
- package/src/utils/stream.ts +25 -0
- package/src/utils/types.ts +6 -0
- package/tsconfig.json +3 -1
- package/LICENSE +0 -18
- package/dist/cid/index.d.ts +0 -9
- package/dist/cid/index.d.ts.map +0 -1
- package/dist/cid/index.js +0 -20
- package/dist/ipld/builders.d.ts +0 -11
- package/dist/ipld/builders.d.ts.map +0 -1
- package/dist/ipld/builders.js +0 -13
- package/dist/ipld/chunker.d.ts +0 -32
- package/dist/ipld/chunker.d.ts.map +0 -1
- package/dist/ipld/chunker.js +0 -195
- package/dist/ipld/index.d.ts +0 -5
- package/dist/ipld/index.d.ts.map +0 -1
- package/dist/ipld/index.js +0 -4
- package/dist/ipld/nodes.d.ts +0 -15
- package/dist/ipld/nodes.d.ts.map +0 -1
- package/dist/ipld/nodes.js +0 -89
- package/dist/ipld/utils.d.ts +0 -8
- package/dist/ipld/utils.d.ts.map +0 -1
- package/dist/ipld/utils.js +0 -50
- package/dist/metadata/index.d.ts +0 -3
- package/dist/metadata/index.d.ts.map +0 -1
- package/dist/metadata/index.js +0 -2
- package/dist/metadata/offchain/base.d.ts +0 -4
- package/dist/metadata/offchain/base.d.ts.map +0 -1
- package/dist/metadata/offchain/file.d.ts +0 -16
- package/dist/metadata/offchain/file.d.ts.map +0 -1
- package/dist/metadata/offchain/file.js +0 -12
- package/dist/metadata/offchain/folder.d.ts +0 -20
- package/dist/metadata/offchain/folder.d.ts.map +0 -1
- package/dist/metadata/offchain/folder.js +0 -26
- package/dist/metadata/offchain/index.d.ts +0 -4
- package/dist/metadata/offchain/index.d.ts.map +0 -1
- package/dist/metadata/offchain/index.js +0 -3
- package/dist/metadata/onchain/index.d.ts +0 -3
- package/dist/metadata/onchain/index.d.ts.map +0 -1
- package/dist/metadata/onchain/index.js +0 -2
- package/dist/metadata/onchain/protobuf/OnchainMetadata.d.ts +0 -28
- package/dist/metadata/onchain/protobuf/OnchainMetadata.d.ts.map +0 -1
- package/dist/metadata/onchain/protobuf/OnchainMetadata.js +0 -112
- package/dist/metadata/onchain/utils.d.ts +0 -4
- package/dist/metadata/onchain/utils.d.ts.map +0 -1
- package/dist/metadata/onchain/utils.js +0 -12
- package/jest.config.ts +0 -17
- package/src/cid/index.ts +0 -26
- package/src/ipld/builders.ts +0 -38
- package/src/ipld/chunker.ts +0 -194
- package/src/ipld/index.ts +0 -4
- package/src/ipld/nodes.ts +0 -199
- package/src/ipld/utils.ts +0 -21
- package/src/metadata/index.ts +0 -2
- package/src/metadata/offchain/base.ts +0 -4
- package/src/metadata/offchain/file.ts +0 -35
- package/src/metadata/offchain/folder.ts +0 -51
- package/src/metadata/offchain/index.ts +0 -3
- package/src/metadata/onchain/index.ts +0 -2
- package/src/metadata/onchain/protobuf/OnchainMetadata.proto +0 -21
- package/src/metadata/onchain/protobuf/OnchainMetadata.ts +0 -137
- package/src/metadata/onchain/utils.ts +0 -15
- package/tests/chunker.spec.ts +0 -294
- package/tests/cid.spec.ts +0 -20
- package/tests/nodes.spec.ts +0 -74
- /package/dist/{metadata/offchain/base.js → utils/types.js} +0 -0
package/src/ipld/chunker.ts
DELETED
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
import type { BaseBlockstore } from 'blockstore-core'
|
|
2
|
-
import type { AwaitIterable } from 'interface-store'
|
|
3
|
-
import { CID } from 'multiformats'
|
|
4
|
-
import { cidOfNode } from '../cid/index.js'
|
|
5
|
-
import { decodeIPLDNodeData, OffchainMetadata } from '../metadata/index.js'
|
|
6
|
-
import { Builders, fileBuilders, metadataBuilders } from './builders.js'
|
|
7
|
-
import { createFolderInlinkIpldNode, createFolderIpldNode } from './nodes.js'
|
|
8
|
-
import { chunkBuffer, encodeNode, PBNode } from './utils.js'
|
|
9
|
-
|
|
10
|
-
export const DEFAULT_MAX_CHUNK_SIZE = 64 * 1024
|
|
11
|
-
|
|
12
|
-
const ESTIMATED_LINK_SIZE_IN_BYTES = 64
|
|
13
|
-
export const DEFAULT_MAX_LINK_PER_NODE = DEFAULT_MAX_CHUNK_SIZE / ESTIMATED_LINK_SIZE_IN_BYTES
|
|
14
|
-
|
|
15
|
-
export const processFileToIPLDFormat = (
|
|
16
|
-
blockstore: BaseBlockstore,
|
|
17
|
-
file: AwaitIterable<Buffer>,
|
|
18
|
-
totalSize: number,
|
|
19
|
-
filename?: string,
|
|
20
|
-
{ maxChunkSize, maxLinkPerNode }: { maxChunkSize: number; maxLinkPerNode: number } = {
|
|
21
|
-
maxChunkSize: DEFAULT_MAX_CHUNK_SIZE,
|
|
22
|
-
maxLinkPerNode: DEFAULT_MAX_LINK_PER_NODE,
|
|
23
|
-
},
|
|
24
|
-
): Promise<CID> => {
|
|
25
|
-
return processBufferToIPLDFormat(blockstore, file, filename, totalSize, fileBuilders, {
|
|
26
|
-
maxChunkSize,
|
|
27
|
-
maxLinkPerNode,
|
|
28
|
-
})
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export const processMetadataToIPLDFormat = async (
|
|
32
|
-
blockstore: BaseBlockstore,
|
|
33
|
-
metadata: OffchainMetadata,
|
|
34
|
-
limits: { maxChunkSize: number; maxLinkPerNode: number } = {
|
|
35
|
-
maxChunkSize: DEFAULT_MAX_CHUNK_SIZE,
|
|
36
|
-
maxLinkPerNode: DEFAULT_MAX_LINK_PER_NODE,
|
|
37
|
-
},
|
|
38
|
-
): Promise<CID> => {
|
|
39
|
-
const buffer = Buffer.from(JSON.stringify(metadata))
|
|
40
|
-
const name = `${metadata.name}.metadata.json`
|
|
41
|
-
return processBufferToIPLDFormat(
|
|
42
|
-
blockstore,
|
|
43
|
-
(async function* () {
|
|
44
|
-
yield buffer
|
|
45
|
-
})(),
|
|
46
|
-
name,
|
|
47
|
-
buffer.byteLength,
|
|
48
|
-
metadataBuilders,
|
|
49
|
-
limits,
|
|
50
|
-
)
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const processBufferToIPLDFormat = async (
|
|
54
|
-
blockstore: BaseBlockstore,
|
|
55
|
-
buffer: AwaitIterable<Buffer>,
|
|
56
|
-
filename: string | undefined,
|
|
57
|
-
totalSize: number,
|
|
58
|
-
builders: Builders,
|
|
59
|
-
{ maxChunkSize, maxLinkPerNode }: { maxChunkSize: number; maxLinkPerNode: number } = {
|
|
60
|
-
maxChunkSize: DEFAULT_MAX_CHUNK_SIZE,
|
|
61
|
-
maxLinkPerNode: DEFAULT_MAX_LINK_PER_NODE,
|
|
62
|
-
},
|
|
63
|
-
): Promise<CID> => {
|
|
64
|
-
const bufferChunks = chunkBuffer(buffer, { maxChunkSize })
|
|
65
|
-
|
|
66
|
-
let CIDs: CID[] = []
|
|
67
|
-
for await (const chunk of bufferChunks) {
|
|
68
|
-
const node = builders.chunk(chunk)
|
|
69
|
-
const cid = cidOfNode(node)
|
|
70
|
-
await blockstore.put(cid, encodeNode(node))
|
|
71
|
-
CIDs.push(cid)
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
return processBufferToIPLDFormatFromChunks(blockstore, CIDs, filename, totalSize, builders, {
|
|
75
|
-
maxLinkPerNode,
|
|
76
|
-
maxChunkSize,
|
|
77
|
-
})
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export const processBufferToIPLDFormatFromChunks = async (
|
|
81
|
-
blockstore: BaseBlockstore,
|
|
82
|
-
chunks: AwaitIterable<CID>,
|
|
83
|
-
filename: string | undefined,
|
|
84
|
-
totalSize: number,
|
|
85
|
-
builders: Builders,
|
|
86
|
-
{ maxLinkPerNode, maxChunkSize }: { maxLinkPerNode: number; maxChunkSize: number } = {
|
|
87
|
-
maxLinkPerNode: DEFAULT_MAX_LINK_PER_NODE,
|
|
88
|
-
maxChunkSize: DEFAULT_MAX_CHUNK_SIZE,
|
|
89
|
-
},
|
|
90
|
-
): Promise<CID> => {
|
|
91
|
-
let chunkCount = 0
|
|
92
|
-
let CIDs: CID[] = []
|
|
93
|
-
for await (const chunk of chunks) {
|
|
94
|
-
CIDs.push(chunk)
|
|
95
|
-
chunkCount++
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
if (CIDs.length === 1) {
|
|
99
|
-
const nodeBytes = await blockstore.get(CIDs[0])
|
|
100
|
-
await blockstore.delete(CIDs[0])
|
|
101
|
-
const data = decodeIPLDNodeData(nodeBytes)
|
|
102
|
-
const singleNode = builders.single(Buffer.from(data.data!), filename)
|
|
103
|
-
await blockstore.put(cidOfNode(singleNode), encodeNode(singleNode))
|
|
104
|
-
const headCID = cidOfNode(singleNode)
|
|
105
|
-
|
|
106
|
-
return headCID
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
let depth = 1
|
|
110
|
-
while (CIDs.length > maxLinkPerNode) {
|
|
111
|
-
const newCIDs: CID[] = []
|
|
112
|
-
for (let i = 0; i < CIDs.length; i += maxLinkPerNode) {
|
|
113
|
-
const chunk = CIDs.slice(i, i + maxLinkPerNode)
|
|
114
|
-
|
|
115
|
-
const node = builders.inlink(chunk, chunk.length, depth, maxChunkSize)
|
|
116
|
-
const cid = cidOfNode(node)
|
|
117
|
-
await blockstore.put(cid, encodeNode(node))
|
|
118
|
-
newCIDs.push(cid)
|
|
119
|
-
}
|
|
120
|
-
depth++
|
|
121
|
-
CIDs = newCIDs
|
|
122
|
-
}
|
|
123
|
-
const head = builders.root(CIDs, totalSize, depth, filename, maxChunkSize)
|
|
124
|
-
const headCID = cidOfNode(head)
|
|
125
|
-
await blockstore.put(headCID, encodeNode(head))
|
|
126
|
-
|
|
127
|
-
return headCID
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
export const processFolderToIPLDFormat = async (
|
|
131
|
-
blockstore: BaseBlockstore,
|
|
132
|
-
children: CID[],
|
|
133
|
-
name: string,
|
|
134
|
-
size: number,
|
|
135
|
-
{ maxLinkPerNode }: { maxLinkPerNode: number } = { maxLinkPerNode: DEFAULT_MAX_LINK_PER_NODE },
|
|
136
|
-
): Promise<CID> => {
|
|
137
|
-
let cids = children
|
|
138
|
-
let depth = 0
|
|
139
|
-
while (cids.length > maxLinkPerNode) {
|
|
140
|
-
const newCIDs: CID[] = []
|
|
141
|
-
for (let i = 0; i < cids.length; i += maxLinkPerNode) {
|
|
142
|
-
const chunk = cids.slice(i, i + maxLinkPerNode)
|
|
143
|
-
const node = createFolderInlinkIpldNode(chunk, depth)
|
|
144
|
-
const cid = cidOfNode(node)
|
|
145
|
-
await blockstore.put(cid, encodeNode(node))
|
|
146
|
-
newCIDs.push(cid)
|
|
147
|
-
}
|
|
148
|
-
cids = newCIDs
|
|
149
|
-
depth++
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
const node = createFolderIpldNode(cids, name, depth, size)
|
|
153
|
-
const cid = cidOfNode(node)
|
|
154
|
-
await blockstore.put(cid, encodeNode(node))
|
|
155
|
-
|
|
156
|
-
return cid
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Process chunks to IPLD format, return the last chunk if it's not full
|
|
161
|
-
* @returns the last chunk if it's not full, otherwise an empty buffer
|
|
162
|
-
*/
|
|
163
|
-
export const processChunksToIPLDFormat = async (
|
|
164
|
-
blockstore: BaseBlockstore,
|
|
165
|
-
chunks: AwaitIterable<Buffer>,
|
|
166
|
-
builders: Builders,
|
|
167
|
-
{ maxChunkSize = DEFAULT_MAX_CHUNK_SIZE }: { maxChunkSize?: number },
|
|
168
|
-
): Promise<Buffer> => {
|
|
169
|
-
const bufferChunks = chunkBuffer(chunks, { maxChunkSize, ignoreLastChunk: false })
|
|
170
|
-
|
|
171
|
-
for await (const chunk of bufferChunks) {
|
|
172
|
-
if (chunk.byteLength < maxChunkSize) {
|
|
173
|
-
return chunk
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
const node = builders.chunk(chunk)
|
|
177
|
-
const cid = cidOfNode(node)
|
|
178
|
-
await blockstore.put(cid, encodeNode(node))
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
return Buffer.alloc(0)
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
export const ensureNodeMaxSize = (
|
|
185
|
-
node: PBNode,
|
|
186
|
-
maxSize: number = DEFAULT_MAX_CHUNK_SIZE,
|
|
187
|
-
): PBNode => {
|
|
188
|
-
const nodeSize = encodeNode(node).byteLength
|
|
189
|
-
if (nodeSize > maxSize) {
|
|
190
|
-
throw new Error(`Node is too large to fit in a single chunk: ${nodeSize} > ${maxSize}`)
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
return node
|
|
194
|
-
}
|
package/src/ipld/index.ts
DELETED
package/src/ipld/nodes.ts
DELETED
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
import { CID } from 'multiformats/cid'
|
|
2
|
-
import { createNode, PBNode } from '../ipld/index.js'
|
|
3
|
-
import { OffchainMetadata } from '../metadata/index.js'
|
|
4
|
-
import { encodeIPLDNodeData, MetadataType } from '../metadata/onchain/index.js'
|
|
5
|
-
import { DEFAULT_MAX_CHUNK_SIZE, ensureNodeMaxSize } from './chunker.js'
|
|
6
|
-
|
|
7
|
-
/// Creates a file chunk ipld node
|
|
8
|
-
export const createFileChunkIpldNode = (data: Buffer): PBNode =>
|
|
9
|
-
createNode(
|
|
10
|
-
encodeIPLDNodeData({
|
|
11
|
-
type: MetadataType.FileChunk,
|
|
12
|
-
size: data.length,
|
|
13
|
-
linkDepth: 0,
|
|
14
|
-
data,
|
|
15
|
-
}),
|
|
16
|
-
[],
|
|
17
|
-
)
|
|
18
|
-
|
|
19
|
-
// Creates a file ipld node
|
|
20
|
-
// links: the CIDs of the file's contents
|
|
21
|
-
// @todo: add the file's metadata
|
|
22
|
-
export const createChunkedFileIpldNode = (
|
|
23
|
-
links: CID[],
|
|
24
|
-
size: number,
|
|
25
|
-
linkDepth: number,
|
|
26
|
-
name?: string,
|
|
27
|
-
maxNodeSize: number = DEFAULT_MAX_CHUNK_SIZE,
|
|
28
|
-
): PBNode =>
|
|
29
|
-
ensureNodeMaxSize(
|
|
30
|
-
createNode(
|
|
31
|
-
encodeIPLDNodeData({
|
|
32
|
-
type: MetadataType.File,
|
|
33
|
-
name,
|
|
34
|
-
size,
|
|
35
|
-
linkDepth,
|
|
36
|
-
}),
|
|
37
|
-
links.map((cid) => ({ Hash: cid })),
|
|
38
|
-
),
|
|
39
|
-
maxNodeSize,
|
|
40
|
-
)
|
|
41
|
-
// Creates a file ipld node
|
|
42
|
-
// links: the CIDs of the file's contents
|
|
43
|
-
export const createFileInlinkIpldNode = (
|
|
44
|
-
links: CID[],
|
|
45
|
-
size: number,
|
|
46
|
-
linkDepth: number,
|
|
47
|
-
maxNodeSize: number = DEFAULT_MAX_CHUNK_SIZE,
|
|
48
|
-
): PBNode =>
|
|
49
|
-
ensureNodeMaxSize(
|
|
50
|
-
createNode(
|
|
51
|
-
encodeIPLDNodeData({
|
|
52
|
-
type: MetadataType.FileInlink,
|
|
53
|
-
size,
|
|
54
|
-
linkDepth,
|
|
55
|
-
}),
|
|
56
|
-
links.map((cid) => ({ Hash: cid })),
|
|
57
|
-
),
|
|
58
|
-
maxNodeSize,
|
|
59
|
-
)
|
|
60
|
-
|
|
61
|
-
// Creates a file ipld node
|
|
62
|
-
// links: the CIDs of the file's contents
|
|
63
|
-
// @todo: add the file's metadata
|
|
64
|
-
export const createSingleFileIpldNode = (data: Buffer, name?: string): PBNode =>
|
|
65
|
-
createNode(
|
|
66
|
-
encodeIPLDNodeData({
|
|
67
|
-
type: MetadataType.File,
|
|
68
|
-
name,
|
|
69
|
-
size: data.length,
|
|
70
|
-
linkDepth: 0,
|
|
71
|
-
data,
|
|
72
|
-
}),
|
|
73
|
-
[],
|
|
74
|
-
)
|
|
75
|
-
|
|
76
|
-
// Creates a file ipld node
|
|
77
|
-
// links: the CIDs of the file's contents
|
|
78
|
-
// @todo: add the file's metadata
|
|
79
|
-
export const createMetadataInlinkIpldNode = (
|
|
80
|
-
links: CID[],
|
|
81
|
-
size: number,
|
|
82
|
-
linkDepth: number,
|
|
83
|
-
maxNodeSize: number = DEFAULT_MAX_CHUNK_SIZE,
|
|
84
|
-
): PBNode =>
|
|
85
|
-
ensureNodeMaxSize(
|
|
86
|
-
createNode(
|
|
87
|
-
encodeIPLDNodeData({
|
|
88
|
-
type: MetadataType.FileInlink,
|
|
89
|
-
size,
|
|
90
|
-
linkDepth,
|
|
91
|
-
}),
|
|
92
|
-
links.map((cid) => ({ Hash: cid })),
|
|
93
|
-
),
|
|
94
|
-
maxNodeSize,
|
|
95
|
-
)
|
|
96
|
-
|
|
97
|
-
// Creates a file ipld node
|
|
98
|
-
// links: the CIDs of the file's contents
|
|
99
|
-
// @todo: add the file's metadata
|
|
100
|
-
export const createSingleMetadataIpldNode = (data: Buffer, name?: string): PBNode =>
|
|
101
|
-
createNode(
|
|
102
|
-
encodeIPLDNodeData({
|
|
103
|
-
type: MetadataType.Metadata,
|
|
104
|
-
name,
|
|
105
|
-
size: data.length,
|
|
106
|
-
linkDepth: 0,
|
|
107
|
-
data,
|
|
108
|
-
}),
|
|
109
|
-
[],
|
|
110
|
-
)
|
|
111
|
-
|
|
112
|
-
export const createMetadataChunkIpldNode = (data: Buffer): PBNode =>
|
|
113
|
-
createNode(
|
|
114
|
-
encodeIPLDNodeData({
|
|
115
|
-
type: MetadataType.MetadataChunk,
|
|
116
|
-
size: data.length,
|
|
117
|
-
linkDepth: 0,
|
|
118
|
-
data,
|
|
119
|
-
}),
|
|
120
|
-
)
|
|
121
|
-
|
|
122
|
-
export const createChunkedMetadataIpldNode = (
|
|
123
|
-
links: CID[],
|
|
124
|
-
size: number,
|
|
125
|
-
linkDepth: number,
|
|
126
|
-
name?: string,
|
|
127
|
-
maxNodeSize: number = DEFAULT_MAX_CHUNK_SIZE,
|
|
128
|
-
): PBNode =>
|
|
129
|
-
ensureNodeMaxSize(
|
|
130
|
-
createNode(
|
|
131
|
-
encodeIPLDNodeData({
|
|
132
|
-
type: MetadataType.Metadata,
|
|
133
|
-
name,
|
|
134
|
-
size,
|
|
135
|
-
linkDepth,
|
|
136
|
-
}),
|
|
137
|
-
links.map((cid) => ({ Hash: cid })),
|
|
138
|
-
),
|
|
139
|
-
maxNodeSize,
|
|
140
|
-
)
|
|
141
|
-
|
|
142
|
-
// Creates a folder ipld node
|
|
143
|
-
// links: the CIDs of the folder's contents
|
|
144
|
-
// @todo: add the folder's metadata
|
|
145
|
-
export const createFolderIpldNode = (
|
|
146
|
-
links: CID[],
|
|
147
|
-
name: string,
|
|
148
|
-
linkDepth: number,
|
|
149
|
-
size: number,
|
|
150
|
-
maxNodeSize: number = DEFAULT_MAX_CHUNK_SIZE,
|
|
151
|
-
): PBNode =>
|
|
152
|
-
ensureNodeMaxSize(
|
|
153
|
-
createNode(
|
|
154
|
-
encodeIPLDNodeData({
|
|
155
|
-
type: MetadataType.Folder,
|
|
156
|
-
name,
|
|
157
|
-
size,
|
|
158
|
-
linkDepth,
|
|
159
|
-
}),
|
|
160
|
-
links.map((cid) => ({ Hash: cid })),
|
|
161
|
-
),
|
|
162
|
-
maxNodeSize,
|
|
163
|
-
)
|
|
164
|
-
|
|
165
|
-
export const createFolderInlinkIpldNode = (
|
|
166
|
-
links: CID[],
|
|
167
|
-
linkDepth: number,
|
|
168
|
-
maxNodeSize: number = DEFAULT_MAX_CHUNK_SIZE,
|
|
169
|
-
): PBNode =>
|
|
170
|
-
ensureNodeMaxSize(
|
|
171
|
-
createNode(
|
|
172
|
-
encodeIPLDNodeData({
|
|
173
|
-
type: MetadataType.FolderInlink,
|
|
174
|
-
linkDepth,
|
|
175
|
-
}),
|
|
176
|
-
links.map((cid) => ({ Hash: cid })),
|
|
177
|
-
),
|
|
178
|
-
maxNodeSize,
|
|
179
|
-
)
|
|
180
|
-
|
|
181
|
-
/// Creates a metadata ipld node
|
|
182
|
-
export const createMetadataNode = (
|
|
183
|
-
metadata: OffchainMetadata,
|
|
184
|
-
maxNodeSize: number = DEFAULT_MAX_CHUNK_SIZE,
|
|
185
|
-
): PBNode => {
|
|
186
|
-
const data = Buffer.from(JSON.stringify(metadata))
|
|
187
|
-
|
|
188
|
-
return ensureNodeMaxSize(
|
|
189
|
-
createNode(
|
|
190
|
-
encodeIPLDNodeData({
|
|
191
|
-
type: MetadataType.Metadata,
|
|
192
|
-
name: metadata.name,
|
|
193
|
-
linkDepth: 0,
|
|
194
|
-
data,
|
|
195
|
-
}),
|
|
196
|
-
),
|
|
197
|
-
maxNodeSize,
|
|
198
|
-
)
|
|
199
|
-
}
|
package/src/ipld/utils.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { createNode, decode, encode, PBNode } from '@ipld/dag-pb'
|
|
2
|
-
import { AwaitIterable } from 'interface-store'
|
|
3
|
-
|
|
4
|
-
export const chunkBuffer = async function* (
|
|
5
|
-
buffer: AwaitIterable<Buffer>,
|
|
6
|
-
{ maxChunkSize, ignoreLastChunk = false }: { maxChunkSize: number; ignoreLastChunk?: boolean },
|
|
7
|
-
): AsyncIterable<Buffer> {
|
|
8
|
-
let target = Buffer.alloc(0)
|
|
9
|
-
for await (let chunk of buffer) {
|
|
10
|
-
target = Buffer.concat([target, chunk])
|
|
11
|
-
while (target.length >= maxChunkSize) {
|
|
12
|
-
yield target.subarray(0, maxChunkSize)
|
|
13
|
-
target = target.subarray(maxChunkSize)
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
if (target.length > 0 && !ignoreLastChunk) {
|
|
17
|
-
yield target
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export { createNode, decode as decodeNode, encode as encodeNode, PBNode }
|
package/src/metadata/index.ts
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { CID } from 'multiformats'
|
|
2
|
-
import { cidToString } from '../../index.js'
|
|
3
|
-
|
|
4
|
-
export type OffchainFileMetadata = {
|
|
5
|
-
type: 'file'
|
|
6
|
-
dataCid: string
|
|
7
|
-
name?: string
|
|
8
|
-
mimeType?: string
|
|
9
|
-
totalSize: number
|
|
10
|
-
totalChunks: number
|
|
11
|
-
chunks: ChunkInfo[]
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export interface ChunkInfo {
|
|
15
|
-
size: number
|
|
16
|
-
cid: string
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export const fileMetadata = (
|
|
20
|
-
headCID: CID,
|
|
21
|
-
chunks: ChunkInfo[],
|
|
22
|
-
totalSize: number,
|
|
23
|
-
name?: string | null,
|
|
24
|
-
mimeType?: string | null,
|
|
25
|
-
): OffchainFileMetadata => {
|
|
26
|
-
return {
|
|
27
|
-
type: 'file',
|
|
28
|
-
dataCid: cidToString(headCID),
|
|
29
|
-
name: name ?? undefined,
|
|
30
|
-
mimeType: mimeType ?? undefined,
|
|
31
|
-
totalSize,
|
|
32
|
-
totalChunks: chunks.length,
|
|
33
|
-
chunks,
|
|
34
|
-
}
|
|
35
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { CID } from 'multiformats'
|
|
2
|
-
import { cidOfNode, cidToString } from '../../cid/index.js'
|
|
3
|
-
import { PBNode } from '../../ipld/index.js'
|
|
4
|
-
import { IPLDNodeData, MetadataType } from '../onchain/index.js'
|
|
5
|
-
|
|
6
|
-
interface ChildrenMetadata {
|
|
7
|
-
type: 'folder' | 'file'
|
|
8
|
-
name?: string
|
|
9
|
-
cid: string
|
|
10
|
-
totalSize: number
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export type OffchainFolderMetadata = {
|
|
14
|
-
type: 'folder'
|
|
15
|
-
dataCid: string
|
|
16
|
-
name?: string
|
|
17
|
-
totalSize: number
|
|
18
|
-
totalFiles: number
|
|
19
|
-
children: ChildrenMetadata[]
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export const childrenMetadataFromNode = (node: PBNode): ChildrenMetadata => {
|
|
23
|
-
const ipldData = IPLDNodeData.decode(node.Data!)
|
|
24
|
-
if (ipldData.type !== MetadataType.File && ipldData.type !== MetadataType.Folder) {
|
|
25
|
-
throw new Error('Invalid metadata type')
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
return {
|
|
29
|
-
type: ipldData.type === MetadataType.File ? 'file' : 'folder',
|
|
30
|
-
cid: cidToString(cidOfNode(node)),
|
|
31
|
-
totalSize: ipldData.size ?? 0,
|
|
32
|
-
name: ipldData.name,
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export const folderMetadata = (
|
|
37
|
-
cid: CID | string,
|
|
38
|
-
children: ChildrenMetadata[],
|
|
39
|
-
name?: string | null,
|
|
40
|
-
): OffchainFolderMetadata => {
|
|
41
|
-
cid = typeof cid === 'string' ? cid : cidToString(cid)
|
|
42
|
-
|
|
43
|
-
return {
|
|
44
|
-
dataCid: cid,
|
|
45
|
-
totalSize: children.reduce((acc, child) => acc + child.totalSize, 0),
|
|
46
|
-
totalFiles: children.length,
|
|
47
|
-
children,
|
|
48
|
-
type: 'folder',
|
|
49
|
-
name: name ?? undefined,
|
|
50
|
-
}
|
|
51
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
syntax = "proto3";
|
|
2
|
-
|
|
3
|
-
message IPLDNodeData {
|
|
4
|
-
MetadataType type = 1;
|
|
5
|
-
int32 linkDepth = 2;
|
|
6
|
-
optional int32 size = 3;
|
|
7
|
-
optional string name = 4;
|
|
8
|
-
optional bytes data = 5;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
// MetadataType defines the possible types of metadata.
|
|
12
|
-
enum MetadataType {
|
|
13
|
-
File = 0;
|
|
14
|
-
FileInlink = 1;
|
|
15
|
-
FileChunk = 2;
|
|
16
|
-
Folder = 3;
|
|
17
|
-
FolderInlink = 4;
|
|
18
|
-
Metadata = 5;
|
|
19
|
-
MetadataInlink = 6;
|
|
20
|
-
MetadataChunk = 7;
|
|
21
|
-
}
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
/* eslint-disable import/export */
|
|
2
|
-
/* eslint-disable complexity */
|
|
3
|
-
/* eslint-disable @typescript-eslint/no-namespace */
|
|
4
|
-
/* eslint-disable @typescript-eslint/no-unnecessary-boolean-literal-compare */
|
|
5
|
-
/* eslint-disable @typescript-eslint/no-empty-interface */
|
|
6
|
-
|
|
7
|
-
import { type Codec, decodeMessage, type DecodeOptions, encodeMessage, enumeration, message } from 'protons-runtime'
|
|
8
|
-
import type { Uint8ArrayList } from 'uint8arraylist'
|
|
9
|
-
|
|
10
|
-
export interface IPLDNodeData {
|
|
11
|
-
type: MetadataType
|
|
12
|
-
linkDepth: number
|
|
13
|
-
size?: number
|
|
14
|
-
name?: string
|
|
15
|
-
data?: Uint8Array
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export namespace IPLDNodeData {
|
|
19
|
-
let _codec: Codec<IPLDNodeData>
|
|
20
|
-
|
|
21
|
-
export const codec = (): Codec<IPLDNodeData> => {
|
|
22
|
-
if (_codec == null) {
|
|
23
|
-
_codec = message<IPLDNodeData>((obj, w, opts = {}) => {
|
|
24
|
-
if (opts.lengthDelimited !== false) {
|
|
25
|
-
w.fork()
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
if (obj.type != null && __MetadataTypeValues[obj.type] !== 0) {
|
|
29
|
-
w.uint32(8)
|
|
30
|
-
MetadataType.codec().encode(obj.type, w)
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
if ((obj.linkDepth != null && obj.linkDepth !== 0)) {
|
|
34
|
-
w.uint32(16)
|
|
35
|
-
w.int32(obj.linkDepth)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
if (obj.size != null) {
|
|
39
|
-
w.uint32(24)
|
|
40
|
-
w.int32(obj.size)
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
if (obj.name != null) {
|
|
44
|
-
w.uint32(34)
|
|
45
|
-
w.string(obj.name)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
if (obj.data != null) {
|
|
49
|
-
w.uint32(42)
|
|
50
|
-
w.bytes(obj.data)
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (opts.lengthDelimited !== false) {
|
|
54
|
-
w.ldelim()
|
|
55
|
-
}
|
|
56
|
-
}, (reader, length, opts = {}) => {
|
|
57
|
-
const obj: any = {
|
|
58
|
-
type: MetadataType.File,
|
|
59
|
-
linkDepth: 0
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
const end = length == null ? reader.len : reader.pos + length
|
|
63
|
-
|
|
64
|
-
while (reader.pos < end) {
|
|
65
|
-
const tag = reader.uint32()
|
|
66
|
-
|
|
67
|
-
switch (tag >>> 3) {
|
|
68
|
-
case 1: {
|
|
69
|
-
obj.type = MetadataType.codec().decode(reader)
|
|
70
|
-
break
|
|
71
|
-
}
|
|
72
|
-
case 2: {
|
|
73
|
-
obj.linkDepth = reader.int32()
|
|
74
|
-
break
|
|
75
|
-
}
|
|
76
|
-
case 3: {
|
|
77
|
-
obj.size = reader.int32()
|
|
78
|
-
break
|
|
79
|
-
}
|
|
80
|
-
case 4: {
|
|
81
|
-
obj.name = reader.string()
|
|
82
|
-
break
|
|
83
|
-
}
|
|
84
|
-
case 5: {
|
|
85
|
-
obj.data = reader.bytes()
|
|
86
|
-
break
|
|
87
|
-
}
|
|
88
|
-
default: {
|
|
89
|
-
reader.skipType(tag & 7)
|
|
90
|
-
break
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
return obj
|
|
96
|
-
})
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
return _codec
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
export const encode = (obj: Partial<IPLDNodeData>): Uint8Array => {
|
|
103
|
-
return encodeMessage(obj, IPLDNodeData.codec())
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
export const decode = (buf: Uint8Array | Uint8ArrayList, opts?: DecodeOptions<IPLDNodeData>): IPLDNodeData => {
|
|
107
|
-
return decodeMessage(buf, IPLDNodeData.codec(), opts)
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
export enum MetadataType {
|
|
112
|
-
File = 'File',
|
|
113
|
-
FileInlink = 'FileInlink',
|
|
114
|
-
FileChunk = 'FileChunk',
|
|
115
|
-
Folder = 'Folder',
|
|
116
|
-
FolderInlink = 'FolderInlink',
|
|
117
|
-
Metadata = 'Metadata',
|
|
118
|
-
MetadataInlink = 'MetadataInlink',
|
|
119
|
-
MetadataChunk = 'MetadataChunk'
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
enum __MetadataTypeValues {
|
|
123
|
-
File = 0,
|
|
124
|
-
FileInlink = 1,
|
|
125
|
-
FileChunk = 2,
|
|
126
|
-
Folder = 3,
|
|
127
|
-
FolderInlink = 4,
|
|
128
|
-
Metadata = 5,
|
|
129
|
-
MetadataInlink = 6,
|
|
130
|
-
MetadataChunk = 7
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
export namespace MetadataType {
|
|
134
|
-
export const codec = (): Codec<MetadataType> => {
|
|
135
|
-
return enumeration<MetadataType>(__MetadataTypeValues)
|
|
136
|
-
}
|
|
137
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { decodeNode } from '../../ipld/index.js'
|
|
2
|
-
import { IPLDNodeData } from '../onchain/index.js'
|
|
3
|
-
|
|
4
|
-
export const encodeIPLDNodeData = (metadata: IPLDNodeData): Uint8Array => {
|
|
5
|
-
return IPLDNodeData.encode(metadata)
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export const decodeIPLDNodeData = (data: Uint8Array): IPLDNodeData => {
|
|
9
|
-
const decoded = decodeNode(data)
|
|
10
|
-
if (!decoded.Data) {
|
|
11
|
-
throw new Error('Invalid data')
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
return IPLDNodeData.decode(decoded.Data)
|
|
15
|
-
}
|