@autonomys/auto-dag-data 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 (153) hide show
  1. package/LICENSE +18 -0
  2. package/README.md +167 -0
  3. package/dist/cid/index.d.ts +9 -0
  4. package/dist/cid/index.d.ts.map +1 -0
  5. package/dist/cid/index.js +20 -0
  6. package/dist/compression/index.d.ts +7 -0
  7. package/dist/compression/index.d.ts.map +1 -0
  8. package/dist/compression/index.js +106 -0
  9. package/dist/compression/types.d.ts +9 -0
  10. package/dist/compression/types.d.ts.map +1 -0
  11. package/dist/compression/types.js +1 -0
  12. package/dist/encryption/index.d.ts +8 -0
  13. package/dist/encryption/index.d.ts.map +1 -0
  14. package/dist/encryption/index.js +121 -0
  15. package/dist/encryption/types.d.ts +5 -0
  16. package/dist/encryption/types.d.ts.map +1 -0
  17. package/dist/encryption/types.js +1 -0
  18. package/dist/index.d.ts +6 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +5 -0
  21. package/dist/ipld/blockstore/base.d.ts +9 -0
  22. package/dist/ipld/blockstore/base.d.ts.map +1 -0
  23. package/dist/ipld/blockstore/base.js +1 -0
  24. package/dist/ipld/blockstore/index.d.ts +3 -0
  25. package/dist/ipld/blockstore/index.d.ts.map +1 -0
  26. package/dist/ipld/blockstore/index.js +2 -0
  27. package/dist/ipld/blockstore/memory.d.ts +13 -0
  28. package/dist/ipld/blockstore/memory.d.ts.map +1 -0
  29. package/dist/ipld/blockstore/memory.js +57 -0
  30. package/dist/ipld/builders.d.ts +12 -0
  31. package/dist/ipld/builders.d.ts.map +1 -0
  32. package/dist/ipld/builders.js +13 -0
  33. package/dist/ipld/chunker.d.ts +30 -0
  34. package/dist/ipld/chunker.d.ts.map +1 -0
  35. package/dist/ipld/chunker.js +219 -0
  36. package/dist/ipld/index.d.ts +5 -0
  37. package/dist/ipld/index.d.ts.map +1 -0
  38. package/dist/ipld/index.js +4 -0
  39. package/dist/ipld/nodes.d.ts +15 -0
  40. package/dist/ipld/nodes.d.ts.map +1 -0
  41. package/dist/ipld/nodes.js +92 -0
  42. package/dist/ipld/utils.d.ts +8 -0
  43. package/dist/ipld/utils.d.ts.map +1 -0
  44. package/dist/ipld/utils.js +50 -0
  45. package/dist/metadata/index.d.ts +3 -0
  46. package/dist/metadata/index.d.ts.map +1 -0
  47. package/dist/metadata/index.js +2 -0
  48. package/dist/metadata/offchain/base.d.ts +4 -0
  49. package/dist/metadata/offchain/base.d.ts.map +1 -0
  50. package/dist/metadata/offchain/base.js +1 -0
  51. package/dist/metadata/offchain/file.d.ts +18 -0
  52. package/dist/metadata/offchain/file.d.ts.map +1 -0
  53. package/dist/metadata/offchain/file.js +16 -0
  54. package/dist/metadata/offchain/folder.d.ts +22 -0
  55. package/dist/metadata/offchain/folder.d.ts.map +1 -0
  56. package/dist/metadata/offchain/folder.js +27 -0
  57. package/dist/metadata/offchain/index.d.ts +4 -0
  58. package/dist/metadata/offchain/index.d.ts.map +1 -0
  59. package/dist/metadata/offchain/index.js +3 -0
  60. package/dist/metadata/onchain/index.d.ts +3 -0
  61. package/dist/metadata/onchain/index.d.ts.map +1 -0
  62. package/dist/metadata/onchain/index.js +2 -0
  63. package/dist/metadata/onchain/protobuf/OnchainMetadata.d.ts +69 -0
  64. package/dist/metadata/onchain/protobuf/OnchainMetadata.d.ts.map +1 -0
  65. package/dist/metadata/onchain/protobuf/OnchainMetadata.js +322 -0
  66. package/dist/metadata/onchain/utils.d.ts +4 -0
  67. package/dist/metadata/onchain/utils.d.ts.map +1 -0
  68. package/dist/metadata/onchain/utils.js +12 -0
  69. package/dist/src/cid/index.d.ts +9 -0
  70. package/dist/src/cid/index.d.ts.map +1 -0
  71. package/dist/src/cid/index.js +20 -0
  72. package/dist/src/index.d.ts +4 -0
  73. package/dist/src/index.d.ts.map +1 -0
  74. package/dist/src/index.js +3 -0
  75. package/dist/src/ipld/builders.d.ts +11 -0
  76. package/dist/src/ipld/builders.d.ts.map +1 -0
  77. package/dist/src/ipld/builders.js +13 -0
  78. package/dist/src/ipld/chunker.d.ts +22 -0
  79. package/dist/src/ipld/chunker.d.ts.map +1 -0
  80. package/dist/src/ipld/chunker.js +144 -0
  81. package/dist/src/ipld/index.d.ts +4 -0
  82. package/dist/src/ipld/index.d.ts.map +1 -0
  83. package/dist/src/ipld/index.js +3 -0
  84. package/dist/src/ipld/nodes.d.ts +15 -0
  85. package/dist/src/ipld/nodes.d.ts.map +1 -0
  86. package/dist/src/ipld/nodes.js +89 -0
  87. package/dist/src/ipld/utils.d.ts +5 -0
  88. package/dist/src/ipld/utils.d.ts.map +1 -0
  89. package/dist/src/ipld/utils.js +51 -0
  90. package/dist/src/metadata/index.d.ts +3 -0
  91. package/dist/src/metadata/index.d.ts.map +1 -0
  92. package/dist/src/metadata/index.js +2 -0
  93. package/dist/src/metadata/offchain/base.d.ts +4 -0
  94. package/dist/src/metadata/offchain/base.d.ts.map +1 -0
  95. package/dist/src/metadata/offchain/base.js +1 -0
  96. package/dist/src/metadata/offchain/file.d.ts +16 -0
  97. package/dist/src/metadata/offchain/file.d.ts.map +1 -0
  98. package/dist/src/metadata/offchain/file.js +19 -0
  99. package/dist/src/metadata/offchain/folder.d.ts +17 -0
  100. package/dist/src/metadata/offchain/folder.d.ts.map +1 -0
  101. package/dist/src/metadata/offchain/folder.js +10 -0
  102. package/dist/src/metadata/offchain/index.d.ts +4 -0
  103. package/dist/src/metadata/offchain/index.d.ts.map +1 -0
  104. package/dist/src/metadata/offchain/index.js +3 -0
  105. package/dist/src/metadata/onchain/index.d.ts +3 -0
  106. package/dist/src/metadata/onchain/index.d.ts.map +1 -0
  107. package/dist/src/metadata/onchain/index.js +2 -0
  108. package/dist/src/metadata/onchain/protobuf/OnchainMetadata.d.ts +28 -0
  109. package/dist/src/metadata/onchain/protobuf/OnchainMetadata.d.ts.map +1 -0
  110. package/dist/src/metadata/onchain/protobuf/OnchainMetadata.js +112 -0
  111. package/dist/src/metadata/onchain/utils.d.ts +4 -0
  112. package/dist/src/metadata/onchain/utils.d.ts.map +1 -0
  113. package/dist/src/metadata/onchain/utils.js +12 -0
  114. package/dist/utils/async.d.ts +3 -0
  115. package/dist/utils/async.d.ts.map +1 -0
  116. package/dist/utils/async.js +48 -0
  117. package/dist/utils/index.d.ts +2 -0
  118. package/dist/utils/index.d.ts.map +1 -0
  119. package/dist/utils/index.js +1 -0
  120. package/dist/utils/types.d.ts +2 -0
  121. package/dist/utils/types.d.ts.map +1 -0
  122. package/dist/utils/types.js +1 -0
  123. package/jest.config.ts +17 -0
  124. package/package.json +46 -0
  125. package/src/cid/index.ts +26 -0
  126. package/src/compression/index.ts +84 -0
  127. package/src/compression/types.ts +11 -0
  128. package/src/encryption/index.ts +99 -0
  129. package/src/encryption/types.ts +4 -0
  130. package/src/index.ts +5 -0
  131. package/src/ipld/builders.ts +40 -0
  132. package/src/ipld/chunker.ts +245 -0
  133. package/src/ipld/index.ts +4 -0
  134. package/src/ipld/nodes.ts +208 -0
  135. package/src/ipld/utils.ts +21 -0
  136. package/src/metadata/index.ts +2 -0
  137. package/src/metadata/offchain/base.ts +4 -0
  138. package/src/metadata/offchain/file.ts +41 -0
  139. package/src/metadata/offchain/folder.ts +54 -0
  140. package/src/metadata/offchain/index.ts +3 -0
  141. package/src/metadata/onchain/index.ts +2 -0
  142. package/src/metadata/onchain/protobuf/OnchainMetadata.proto +46 -0
  143. package/src/metadata/onchain/protobuf/OnchainMetadata.ts +397 -0
  144. package/src/metadata/onchain/utils.ts +15 -0
  145. package/src/utils/async.ts +20 -0
  146. package/src/utils/index.ts +1 -0
  147. package/src/utils/types.ts +1 -0
  148. package/tests/chunker.spec.ts +294 -0
  149. package/tests/cid.spec.ts +20 -0
  150. package/tests/compression.spec.ts +58 -0
  151. package/tests/encryption.spec.ts +67 -0
  152. package/tests/nodes.spec.ts +74 -0
  153. package/tsconfig.json +14 -0
@@ -0,0 +1,208 @@
1
+ import { CID } from 'multiformats/cid'
2
+ import { FileUploadOptions, OffchainMetadata } from '../metadata/index.js'
3
+ import { encodeIPLDNodeData, MetadataType } from '../metadata/onchain/index.js'
4
+ import { DEFAULT_MAX_CHUNK_SIZE, ensureNodeMaxSize } from './chunker.js'
5
+ import { createNode, PBNode } from './index.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
+ uploadOptions?: FileUploadOptions,
29
+ ): PBNode =>
30
+ ensureNodeMaxSize(
31
+ createNode(
32
+ encodeIPLDNodeData({
33
+ type: MetadataType.File,
34
+ name,
35
+ size,
36
+ linkDepth,
37
+ uploadOptions,
38
+ }),
39
+ links.map((cid) => ({ Hash: cid })),
40
+ ),
41
+ maxNodeSize,
42
+ )
43
+ // Creates a file ipld node
44
+ // links: the CIDs of the file's contents
45
+ export const createFileInlinkIpldNode = (
46
+ links: CID[],
47
+ size: number,
48
+ linkDepth: number,
49
+ maxNodeSize: number = DEFAULT_MAX_CHUNK_SIZE,
50
+ ): PBNode =>
51
+ ensureNodeMaxSize(
52
+ createNode(
53
+ encodeIPLDNodeData({
54
+ type: MetadataType.FileInlink,
55
+ size,
56
+ linkDepth,
57
+ }),
58
+ links.map((cid) => ({ Hash: cid })),
59
+ ),
60
+ maxNodeSize,
61
+ )
62
+
63
+ // Creates a file ipld node
64
+ // links: the CIDs of the file's contents
65
+ // @todo: add the file's metadata
66
+ export const createSingleFileIpldNode = (
67
+ data: Buffer,
68
+ name?: string,
69
+ uploadOptions?: FileUploadOptions,
70
+ ): PBNode =>
71
+ createNode(
72
+ encodeIPLDNodeData({
73
+ type: MetadataType.File,
74
+ name,
75
+ size: data.length,
76
+ linkDepth: 0,
77
+ data,
78
+ uploadOptions,
79
+ }),
80
+ [],
81
+ )
82
+
83
+ // Creates a file ipld node
84
+ // links: the CIDs of the file's contents
85
+ // @todo: add the file's metadata
86
+ export const createMetadataInlinkIpldNode = (
87
+ links: CID[],
88
+ size: number,
89
+ linkDepth: number,
90
+ maxNodeSize: number = DEFAULT_MAX_CHUNK_SIZE,
91
+ ): PBNode =>
92
+ ensureNodeMaxSize(
93
+ createNode(
94
+ encodeIPLDNodeData({
95
+ type: MetadataType.FileInlink,
96
+ size,
97
+ linkDepth,
98
+ }),
99
+ links.map((cid) => ({ Hash: cid })),
100
+ ),
101
+ maxNodeSize,
102
+ )
103
+
104
+ // Creates a file ipld node
105
+ // links: the CIDs of the file's contents
106
+ // @todo: add the file's metadata
107
+ export const createSingleMetadataIpldNode = (data: Buffer, name?: string): PBNode =>
108
+ createNode(
109
+ encodeIPLDNodeData({
110
+ type: MetadataType.Metadata,
111
+ name,
112
+ size: data.length,
113
+ linkDepth: 0,
114
+ data,
115
+ }),
116
+ [],
117
+ )
118
+
119
+ export const createMetadataChunkIpldNode = (data: Buffer): PBNode =>
120
+ createNode(
121
+ encodeIPLDNodeData({
122
+ type: MetadataType.MetadataChunk,
123
+ size: data.length,
124
+ linkDepth: 0,
125
+ data,
126
+ }),
127
+ )
128
+
129
+ export const createChunkedMetadataIpldNode = (
130
+ links: CID[],
131
+ size: number,
132
+ linkDepth: number,
133
+ name?: string,
134
+ maxNodeSize: number = DEFAULT_MAX_CHUNK_SIZE,
135
+ ): PBNode =>
136
+ ensureNodeMaxSize(
137
+ createNode(
138
+ encodeIPLDNodeData({
139
+ type: MetadataType.Metadata,
140
+ name,
141
+ size,
142
+ linkDepth,
143
+ }),
144
+ links.map((cid) => ({ Hash: cid })),
145
+ ),
146
+ maxNodeSize,
147
+ )
148
+
149
+ // Creates a folder ipld node
150
+ // links: the CIDs of the folder's contents
151
+ // @todo: add the folder's metadata
152
+ export const createFolderIpldNode = (
153
+ links: CID[],
154
+ name: string,
155
+ linkDepth: number,
156
+ size: number,
157
+ maxNodeSize: number = DEFAULT_MAX_CHUNK_SIZE,
158
+ uploadOptions?: FileUploadOptions,
159
+ ): PBNode =>
160
+ ensureNodeMaxSize(
161
+ createNode(
162
+ encodeIPLDNodeData({
163
+ type: MetadataType.Folder,
164
+ name,
165
+ size,
166
+ linkDepth,
167
+ uploadOptions,
168
+ }),
169
+ links.map((cid) => ({ Hash: cid })),
170
+ ),
171
+ maxNodeSize,
172
+ )
173
+
174
+ export const createFolderInlinkIpldNode = (
175
+ links: CID[],
176
+ linkDepth: number,
177
+ maxNodeSize: number = DEFAULT_MAX_CHUNK_SIZE,
178
+ ): PBNode =>
179
+ ensureNodeMaxSize(
180
+ createNode(
181
+ encodeIPLDNodeData({
182
+ type: MetadataType.FolderInlink,
183
+ linkDepth,
184
+ }),
185
+ links.map((cid) => ({ Hash: cid })),
186
+ ),
187
+ maxNodeSize,
188
+ )
189
+
190
+ /// Creates a metadata ipld node
191
+ export const createMetadataNode = (
192
+ metadata: OffchainMetadata,
193
+ maxNodeSize: number = DEFAULT_MAX_CHUNK_SIZE,
194
+ ): PBNode => {
195
+ const data = Buffer.from(JSON.stringify(metadata))
196
+
197
+ return ensureNodeMaxSize(
198
+ createNode(
199
+ encodeIPLDNodeData({
200
+ type: MetadataType.Metadata,
201
+ name: metadata.name,
202
+ linkDepth: 0,
203
+ data,
204
+ }),
205
+ ),
206
+ maxNodeSize,
207
+ )
208
+ }
@@ -0,0 +1,21 @@
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 }
@@ -0,0 +1,2 @@
1
+ export * from './offchain/index.js'
2
+ export * from './onchain/index.js'
@@ -0,0 +1,4 @@
1
+ import { OffchainFileMetadata } from './file.js'
2
+ import { OffchainFolderMetadata } from './folder.js'
3
+
4
+ export type OffchainMetadata = OffchainFolderMetadata | OffchainFileMetadata
@@ -0,0 +1,41 @@
1
+ import { CID } from 'multiformats'
2
+ import { cidToString, FileUploadOptions } 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
+ uploadOptions?: FileUploadOptions
13
+ }
14
+
15
+ export interface ChunkInfo {
16
+ size: number
17
+ cid: string
18
+ }
19
+
20
+ export const fileMetadata = (
21
+ headCID: CID,
22
+ chunks: ChunkInfo[],
23
+ totalSize: number,
24
+ name?: string | null,
25
+ mimeType?: string | null,
26
+ uploadOptions: FileUploadOptions = {
27
+ compression: undefined,
28
+ encryption: undefined,
29
+ },
30
+ ): OffchainFileMetadata => {
31
+ return {
32
+ type: 'file',
33
+ dataCid: cidToString(headCID),
34
+ name: name ?? undefined,
35
+ mimeType: mimeType ?? undefined,
36
+ totalSize,
37
+ totalChunks: chunks.length,
38
+ chunks,
39
+ uploadOptions,
40
+ }
41
+ }
@@ -0,0 +1,54 @@
1
+ import { CID } from 'multiformats'
2
+ import { cidOfNode, cidToString } from '../../cid/index.js'
3
+ import { PBNode } from '../../ipld/index.js'
4
+ import { FileUploadOptions, 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
+ uploadOptions: FileUploadOptions
21
+ }
22
+
23
+ export const childrenMetadataFromNode = (node: PBNode): ChildrenMetadata => {
24
+ const ipldData = IPLDNodeData.decode(node.Data!)
25
+ if (ipldData.type !== MetadataType.File && ipldData.type !== MetadataType.Folder) {
26
+ throw new Error('Invalid metadata type')
27
+ }
28
+
29
+ return {
30
+ type: ipldData.type === MetadataType.File ? 'file' : 'folder',
31
+ cid: cidToString(cidOfNode(node)),
32
+ totalSize: ipldData.size ?? 0,
33
+ name: ipldData.name,
34
+ }
35
+ }
36
+
37
+ export const folderMetadata = (
38
+ cid: CID | string,
39
+ children: ChildrenMetadata[],
40
+ name?: string | null,
41
+ uploadOptions: FileUploadOptions = {},
42
+ ): OffchainFolderMetadata => {
43
+ cid = typeof cid === 'string' ? cid : cidToString(cid)
44
+
45
+ return {
46
+ dataCid: cid,
47
+ totalSize: children.reduce((acc, child) => acc + child.totalSize, 0),
48
+ totalFiles: children.length,
49
+ children,
50
+ type: 'folder',
51
+ name: name ?? undefined,
52
+ uploadOptions,
53
+ }
54
+ }
@@ -0,0 +1,3 @@
1
+ export * from './base.js'
2
+ export * from './file.js'
3
+ export * from './folder.js'
@@ -0,0 +1,2 @@
1
+ export * from './protobuf/OnchainMetadata.js'
2
+ export * from './utils.js'
@@ -0,0 +1,46 @@
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
+ optional FileUploadOptions uploadOptions = 6;
10
+ }
11
+
12
+ // MetadataType defines the possible types of metadata.
13
+ enum MetadataType {
14
+ File = 0;
15
+ FileInlink = 1;
16
+ FileChunk = 2;
17
+ Folder = 3;
18
+ FolderInlink = 4;
19
+ Metadata = 5;
20
+ MetadataInlink = 6;
21
+ MetadataChunk = 7;
22
+ }
23
+
24
+ message FileUploadOptions {
25
+ optional CompressionOptions compression = 1;
26
+ optional EncryptionOptions encryption = 2;
27
+ }
28
+
29
+ message CompressionOptions {
30
+ CompressionAlgorithm algorithm = 1;
31
+ optional int32 level = 2;
32
+ optional int32 chunkSize = 3;
33
+ }
34
+
35
+ message EncryptionOptions {
36
+ EncryptionAlgorithm algorithm = 1;
37
+ optional int32 chunkSize = 2;
38
+ }
39
+
40
+ enum CompressionAlgorithm {
41
+ ZLIB = 0;
42
+ }
43
+
44
+ enum EncryptionAlgorithm {
45
+ AES_256_GCM = 0;
46
+ }