@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.
Files changed (136) hide show
  1. package/README.md +44 -137
  2. package/dist/api/calls/download.d.ts +6 -0
  3. package/dist/api/calls/download.d.ts.map +1 -0
  4. package/dist/api/calls/download.js +12 -0
  5. package/dist/api/calls/index.d.ts +5 -0
  6. package/dist/api/calls/index.d.ts.map +1 -0
  7. package/dist/api/calls/index.js +4 -0
  8. package/dist/api/calls/read.d.ts +98 -0
  9. package/dist/api/calls/read.d.ts.map +1 -0
  10. package/dist/api/calls/read.js +140 -0
  11. package/dist/api/calls/upload.d.ts +94 -0
  12. package/dist/api/calls/upload.d.ts.map +1 -0
  13. package/dist/api/calls/upload.js +120 -0
  14. package/dist/api/calls/write.d.ts +49 -0
  15. package/dist/api/calls/write.d.ts.map +1 -0
  16. package/dist/api/calls/write.js +65 -0
  17. package/dist/api/connection.d.ts +8 -0
  18. package/dist/api/connection.d.ts.map +1 -0
  19. package/dist/api/connection.js +17 -0
  20. package/dist/api/index.d.ts +5 -0
  21. package/dist/api/index.d.ts.map +1 -0
  22. package/dist/api/index.js +4 -0
  23. package/dist/api/models/folderTree.d.ts +45 -0
  24. package/dist/api/models/folderTree.d.ts.map +1 -0
  25. package/dist/api/models/folderTree.js +56 -0
  26. package/dist/api/models/index.d.ts +3 -0
  27. package/dist/api/models/index.d.ts.map +1 -0
  28. package/dist/api/models/index.js +2 -0
  29. package/dist/api/models/objects.d.ts +41 -0
  30. package/dist/api/models/objects.d.ts.map +1 -0
  31. package/dist/api/models/objects.js +10 -0
  32. package/dist/api/models/uploads.d.ts +114 -0
  33. package/dist/api/models/uploads.d.ts.map +1 -0
  34. package/dist/api/models/uploads.js +40 -0
  35. package/dist/api/wrappers.d.ts +67 -0
  36. package/dist/api/wrappers.d.ts.map +1 -0
  37. package/dist/api/wrappers.js +158 -0
  38. package/dist/index.d.ts +2 -3
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +2 -3
  41. package/dist/utils/async.d.ts +3 -0
  42. package/dist/utils/async.d.ts.map +1 -0
  43. package/dist/utils/async.js +21 -0
  44. package/dist/utils/folder.d.ts +2 -0
  45. package/dist/utils/folder.d.ts.map +1 -0
  46. package/dist/utils/folder.js +14 -0
  47. package/dist/utils/index.d.ts +5 -0
  48. package/dist/utils/index.d.ts.map +1 -0
  49. package/dist/utils/index.js +4 -0
  50. package/dist/utils/stream.d.ts +3 -0
  51. package/dist/utils/stream.d.ts.map +1 -0
  52. package/dist/utils/stream.js +22 -0
  53. package/dist/utils/types.d.ts +6 -0
  54. package/dist/utils/types.d.ts.map +1 -0
  55. package/package.json +11 -32
  56. package/src/api/calls/download.ts +21 -0
  57. package/src/api/calls/index.ts +4 -0
  58. package/src/api/calls/read.ts +194 -0
  59. package/src/api/calls/upload.ts +198 -0
  60. package/src/api/calls/write.ts +88 -0
  61. package/src/api/connection.ts +32 -0
  62. package/src/api/index.ts +4 -0
  63. package/src/api/models/folderTree.ts +77 -0
  64. package/src/api/models/index.ts +2 -0
  65. package/src/api/models/objects.ts +47 -0
  66. package/src/api/models/uploads.ts +49 -0
  67. package/src/api/wrappers.ts +229 -0
  68. package/src/index.ts +2 -3
  69. package/src/utils/async.ts +29 -0
  70. package/src/utils/folder.ts +15 -0
  71. package/src/utils/index.ts +4 -0
  72. package/src/utils/stream.ts +25 -0
  73. package/src/utils/types.ts +6 -0
  74. package/tsconfig.json +3 -1
  75. package/LICENSE +0 -18
  76. package/dist/cid/index.d.ts +0 -9
  77. package/dist/cid/index.d.ts.map +0 -1
  78. package/dist/cid/index.js +0 -20
  79. package/dist/ipld/builders.d.ts +0 -11
  80. package/dist/ipld/builders.d.ts.map +0 -1
  81. package/dist/ipld/builders.js +0 -13
  82. package/dist/ipld/chunker.d.ts +0 -32
  83. package/dist/ipld/chunker.d.ts.map +0 -1
  84. package/dist/ipld/chunker.js +0 -195
  85. package/dist/ipld/index.d.ts +0 -5
  86. package/dist/ipld/index.d.ts.map +0 -1
  87. package/dist/ipld/index.js +0 -4
  88. package/dist/ipld/nodes.d.ts +0 -15
  89. package/dist/ipld/nodes.d.ts.map +0 -1
  90. package/dist/ipld/nodes.js +0 -89
  91. package/dist/ipld/utils.d.ts +0 -8
  92. package/dist/ipld/utils.d.ts.map +0 -1
  93. package/dist/ipld/utils.js +0 -50
  94. package/dist/metadata/index.d.ts +0 -3
  95. package/dist/metadata/index.d.ts.map +0 -1
  96. package/dist/metadata/index.js +0 -2
  97. package/dist/metadata/offchain/base.d.ts +0 -4
  98. package/dist/metadata/offchain/base.d.ts.map +0 -1
  99. package/dist/metadata/offchain/file.d.ts +0 -16
  100. package/dist/metadata/offchain/file.d.ts.map +0 -1
  101. package/dist/metadata/offchain/file.js +0 -12
  102. package/dist/metadata/offchain/folder.d.ts +0 -20
  103. package/dist/metadata/offchain/folder.d.ts.map +0 -1
  104. package/dist/metadata/offchain/folder.js +0 -26
  105. package/dist/metadata/offchain/index.d.ts +0 -4
  106. package/dist/metadata/offchain/index.d.ts.map +0 -1
  107. package/dist/metadata/offchain/index.js +0 -3
  108. package/dist/metadata/onchain/index.d.ts +0 -3
  109. package/dist/metadata/onchain/index.d.ts.map +0 -1
  110. package/dist/metadata/onchain/index.js +0 -2
  111. package/dist/metadata/onchain/protobuf/OnchainMetadata.d.ts +0 -28
  112. package/dist/metadata/onchain/protobuf/OnchainMetadata.d.ts.map +0 -1
  113. package/dist/metadata/onchain/protobuf/OnchainMetadata.js +0 -112
  114. package/dist/metadata/onchain/utils.d.ts +0 -4
  115. package/dist/metadata/onchain/utils.d.ts.map +0 -1
  116. package/dist/metadata/onchain/utils.js +0 -12
  117. package/jest.config.ts +0 -17
  118. package/src/cid/index.ts +0 -26
  119. package/src/ipld/builders.ts +0 -38
  120. package/src/ipld/chunker.ts +0 -194
  121. package/src/ipld/index.ts +0 -4
  122. package/src/ipld/nodes.ts +0 -199
  123. package/src/ipld/utils.ts +0 -21
  124. package/src/metadata/index.ts +0 -2
  125. package/src/metadata/offchain/base.ts +0 -4
  126. package/src/metadata/offchain/file.ts +0 -35
  127. package/src/metadata/offchain/folder.ts +0 -51
  128. package/src/metadata/offchain/index.ts +0 -3
  129. package/src/metadata/onchain/index.ts +0 -2
  130. package/src/metadata/onchain/protobuf/OnchainMetadata.proto +0 -21
  131. package/src/metadata/onchain/protobuf/OnchainMetadata.ts +0 -137
  132. package/src/metadata/onchain/utils.ts +0 -15
  133. package/tests/chunker.spec.ts +0 -294
  134. package/tests/cid.spec.ts +0 -20
  135. package/tests/nodes.spec.ts +0 -74
  136. /package/dist/{metadata/offchain/base.js → utils/types.js} +0 -0
@@ -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
@@ -1,4 +0,0 @@
1
- export * from './builders.js'
2
- export * from './chunker.js'
3
- export * from './nodes.js'
4
- export * from './utils.js'
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 }
@@ -1,2 +0,0 @@
1
- export * from './offchain/index.js'
2
- export * from './onchain/index.js'
@@ -1,4 +0,0 @@
1
- import { OffchainFileMetadata } from './file.js'
2
- import { OffchainFolderMetadata } from './folder.js'
3
-
4
- export type OffchainMetadata = OffchainFolderMetadata | OffchainFileMetadata
@@ -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,3 +0,0 @@
1
- export * from './base.js'
2
- export * from './file.js'
3
- export * from './folder.js'
@@ -1,2 +0,0 @@
1
- export * from './protobuf/OnchainMetadata.js'
2
- export * from './utils.js'
@@ -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
- }