@autonomys/auto-dag-data 1.0.6 → 1.0.7
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 +1 -1
- package/dist/ipld/builders.d.ts +2 -2
- package/dist/ipld/builders.d.ts.map +1 -1
- package/dist/ipld/chunker.d.ts +9 -7
- package/dist/ipld/chunker.d.ts.map +1 -1
- package/dist/ipld/chunker.js +63 -24
- package/dist/ipld/nodes.d.ts +6 -6
- package/dist/ipld/nodes.d.ts.map +1 -1
- package/dist/ipld/nodes.js +14 -13
- package/dist/metadata/offchain/file.d.ts +3 -3
- package/dist/metadata/offchain/folder.d.ts +2 -2
- package/dist/metadata/offchain/folder.js +2 -2
- package/dist/metadata/onchain/protobuf/OnchainMetadata.d.ts +1 -1
- package/dist/metadata/onchain/protobuf/OnchainMetadata.js +2 -2
- package/dist/utils/metadata.d.ts +3 -0
- package/dist/utils/metadata.d.ts.map +1 -0
- package/dist/utils/metadata.js +1 -0
- package/package.json +2 -1
- package/src/ipld/builders.ts +2 -2
- package/src/ipld/chunker.ts +80 -31
- package/src/ipld/nodes.ts +51 -34
- package/src/metadata/offchain/file.ts +3 -3
- package/src/metadata/offchain/folder.ts +4 -4
- package/src/metadata/onchain/protobuf/OnchainMetadata.proto +7 -6
- package/src/metadata/onchain/protobuf/OnchainMetadata.ts +3 -3
- package/src/utils/metadata.ts +6 -0
- package/tests/chunker.spec.ts +85 -22
- package/tests/nodes.spec.ts +15 -9
package/README.md
CHANGED
package/dist/ipld/builders.d.ts
CHANGED
|
@@ -3,8 +3,8 @@ import { FileUploadOptions } from '../metadata/index.js';
|
|
|
3
3
|
import { PBNode } from './index.js';
|
|
4
4
|
export interface Builders {
|
|
5
5
|
inlink: (links: CID[], size: number, linkDepth: number, chunkSize: number) => PBNode;
|
|
6
|
-
chunk: (data: Buffer) => PBNode;
|
|
7
|
-
root: (links: CID[], size:
|
|
6
|
+
chunk: (data: Buffer, maxNodeSize?: number) => PBNode;
|
|
7
|
+
root: (links: CID[], size: bigint, linkDepth: number, name?: string, maxNodeSize?: number, fileUploadOptions?: FileUploadOptions) => PBNode;
|
|
8
8
|
single: (data: Buffer, filename?: string, fileUploadOptions?: FileUploadOptions) => PBNode;
|
|
9
9
|
}
|
|
10
10
|
export declare const metadataBuilders: Builders;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builders.d.ts","sourceRoot":"","sources":["../../src/ipld/builders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAYnC,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,CAAA;IACpF,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"builders.d.ts","sourceRoot":"","sources":["../../src/ipld/builders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAYnC,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,CAAA;IACpF,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IACrD,IAAI,EAAE,CACJ,KAAK,EAAE,GAAG,EAAE,EACZ,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,EACpB,iBAAiB,CAAC,EAAE,iBAAiB,KAClC,MAAM,CAAA;IACX,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,iBAAiB,KAAK,MAAM,CAAA;CAC3F;AACD,eAAO,MAAM,gBAAgB,EAAE,QAK9B,CAAA;AAED,eAAO,MAAM,YAAY,EAAE,QAK1B,CAAA"}
|
package/dist/ipld/chunker.d.ts
CHANGED
|
@@ -5,25 +5,27 @@ import { FileUploadOptions, OffchainMetadata } from '../metadata/index.js';
|
|
|
5
5
|
import { Builders } from './builders.js';
|
|
6
6
|
import { PBNode } from './utils.js';
|
|
7
7
|
type ChunkerLimits = {
|
|
8
|
-
|
|
8
|
+
maxNodeSize: number;
|
|
9
9
|
maxLinkPerNode: number;
|
|
10
10
|
};
|
|
11
11
|
type ChunkerOptions = ChunkerLimits & FileUploadOptions;
|
|
12
|
+
export declare const NODE_METADATA_SIZE: number;
|
|
12
13
|
export declare const DEFAULT_MAX_CHUNK_SIZE: number;
|
|
14
|
+
export declare const LINK_SIZE_IN_BYTES = 40;
|
|
13
15
|
export declare const DEFAULT_MAX_LINK_PER_NODE: number;
|
|
14
|
-
export declare const processFileToIPLDFormat: (blockstore: BaseBlockstore, file: AwaitIterable<Buffer>, totalSize:
|
|
16
|
+
export declare const processFileToIPLDFormat: (blockstore: BaseBlockstore, file: AwaitIterable<Buffer>, totalSize: bigint, filename?: string, { maxNodeSize, maxLinkPerNode, encryption, compression, }?: Partial<ChunkerOptions>) => Promise<CID>;
|
|
15
17
|
export declare const processMetadataToIPLDFormat: (blockstore: BaseBlockstore, metadata: OffchainMetadata, limits?: {
|
|
16
|
-
|
|
18
|
+
maxNodeSize: number;
|
|
17
19
|
maxLinkPerNode: number;
|
|
18
20
|
}) => Promise<CID>;
|
|
19
|
-
export declare const processBufferToIPLDFormatFromChunks: (blockstore: BaseBlockstore, chunks: AwaitIterable<CID>, filename: string | undefined, totalSize:
|
|
20
|
-
export declare const processFolderToIPLDFormat: (blockstore: BaseBlockstore, children: CID[], name: string, size:
|
|
21
|
+
export declare const processBufferToIPLDFormatFromChunks: (blockstore: BaseBlockstore, chunks: AwaitIterable<CID>, filename: string | undefined, totalSize: bigint, builders: Builders, { maxNodeSize: maxNodeSize, maxLinkPerNode, encryption, compression, }?: Partial<ChunkerOptions>) => Promise<CID>;
|
|
22
|
+
export declare const processFolderToIPLDFormat: (blockstore: BaseBlockstore, children: CID[], name: string, size: bigint, { maxLinkPerNode, maxNodeSize: maxNodeSize, compression, encryption, }?: Partial<ChunkerOptions>) => Promise<CID>;
|
|
21
23
|
/**
|
|
22
24
|
* Process chunks to IPLD format, return the last chunk if it's not full
|
|
23
25
|
* @returns the last chunk if it's not full, otherwise an empty buffer
|
|
24
26
|
*/
|
|
25
|
-
export declare const processChunksToIPLDFormat: (blockstore: BaseBlockstore, chunks: AwaitIterable<Buffer>, builders: Builders, {
|
|
26
|
-
|
|
27
|
+
export declare const processChunksToIPLDFormat: (blockstore: BaseBlockstore, chunks: AwaitIterable<Buffer>, builders: Builders, { maxNodeSize }: {
|
|
28
|
+
maxNodeSize?: number;
|
|
27
29
|
}) => Promise<Buffer>;
|
|
28
30
|
export declare const ensureNodeMaxSize: (node: PBNode, maxSize?: number) => PBNode;
|
|
29
31
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunker.d.ts","sourceRoot":"","sources":["../../src/ipld/chunker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAElC,OAAO,EAAsB,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"chunker.d.ts","sourceRoot":"","sources":["../../src/ipld/chunker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAElC,OAAO,EAAsB,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAE9F,OAAO,EAAE,QAAQ,EAAkC,MAAM,eAAe,CAAA;AAExE,OAAO,EAA2B,MAAM,EAAE,MAAM,YAAY,CAAA;AAE5D,KAAK,aAAa,GAAG;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,KAAK,cAAc,GAAG,aAAa,GAAG,iBAAiB,CAAA;AAmBvD,eAAO,MAAM,kBAAkB,QAML,CAAA;AAE1B,eAAO,MAAM,sBAAsB,QAA6C,CAAA;AAEhF,eAAO,MAAM,kBAAkB,KAAK,CAAA;AACpC,eAAO,MAAM,yBAAyB,QAA0D,CAAA;AAEhG,eAAO,MAAM,uBAAuB,eACtB,cAAc,QACpB,aAAa,CAAC,MAAM,CAAC,aAChB,MAAM,aACN,MAAM,8DAMd,OAAO,CAAC,cAAc,CAAC,KAMzB,OAAO,CAAC,GAAG,CAWb,CAAA;AAED,eAAO,MAAM,2BAA2B,eAC1B,cAAc,YAChB,gBAAgB,WAClB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,KAItD,OAAO,CAAC,GAAG,CAiBb,CAAA;AA0CD,eAAO,MAAM,mCAAmC,eAClC,cAAc,UAClB,aAAa,CAAC,GAAG,CAAC,YAChB,MAAM,GAAG,SAAS,aACjB,MAAM,YACP,QAAQ,2EAMf,OAAO,CAAC,cAAc,CAAC,KAMzB,OAAO,CAAC,GAAG,CAgDb,CAAA;AAED,eAAO,MAAM,yBAAyB,eACxB,cAAc,YAChB,GAAG,EAAE,QACT,MAAM,QACN,MAAM,2EAMT,OAAO,CAAC,cAAc,CAAC,KAMzB,OAAO,CAAC,GAAG,CA4Bb,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,eACxB,cAAc,UAClB,aAAa,CAAC,MAAM,CAAC,YACnB,QAAQ,mBACwB;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,KACjE,OAAO,CAAC,MAAM,CAiBhB,CAAA;AAED,eAAO,MAAM,iBAAiB,SACtB,MAAM,YACH,MAAM,KACd,MAOF,CAAA"}
|
package/dist/ipld/chunker.js
CHANGED
|
@@ -29,45 +29,75 @@ var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
|
29
29
|
};
|
|
30
30
|
import { cidOfNode } from '../cid/index.js';
|
|
31
31
|
import { decodeIPLDNodeData } from '../metadata/index.js';
|
|
32
|
+
import { stringifyMetadata } from '../utils/metadata.js';
|
|
32
33
|
import { fileBuilders, metadataBuilders } from './builders.js';
|
|
33
34
|
import { createFolderInlinkIpldNode, createFolderIpldNode } from './nodes.js';
|
|
34
35
|
import { chunkBuffer, encodeNode } from './utils.js';
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
const DEFAULT_NODE_MAX_SIZE = 65535;
|
|
37
|
+
// u8 -> 1 byte (may grow in the future but unlikely further than 255)
|
|
38
|
+
const NODE_TYPE_SIZE = 1;
|
|
39
|
+
// u32 -> 4 bytes
|
|
40
|
+
const NODE_LINK_DEPTH_SIZE = 4;
|
|
41
|
+
// u64 -> 8 bytes
|
|
42
|
+
const NODE_SIZE_SIZE = 8;
|
|
43
|
+
// Limit at 255 string length (Mac Limit)
|
|
44
|
+
const MAX_NAME_SIZE = 255;
|
|
45
|
+
const END_OF_STRING_BYTE = 1;
|
|
46
|
+
const NODE_NAME_SIZE = MAX_NAME_SIZE + END_OF_STRING_BYTE;
|
|
47
|
+
// Upload options may be amplified in the future
|
|
48
|
+
const NODE_UPLOAD_OPTIONS_SIZE = 100;
|
|
49
|
+
// Reserve 100 bytes for future use
|
|
50
|
+
const NODE_RESERVED_SIZE = 100;
|
|
51
|
+
export const NODE_METADATA_SIZE = NODE_TYPE_SIZE +
|
|
52
|
+
NODE_LINK_DEPTH_SIZE +
|
|
53
|
+
NODE_SIZE_SIZE +
|
|
54
|
+
NODE_NAME_SIZE +
|
|
55
|
+
NODE_RESERVED_SIZE +
|
|
56
|
+
NODE_UPLOAD_OPTIONS_SIZE;
|
|
57
|
+
export const DEFAULT_MAX_CHUNK_SIZE = DEFAULT_NODE_MAX_SIZE - NODE_METADATA_SIZE;
|
|
58
|
+
export const LINK_SIZE_IN_BYTES = 40;
|
|
59
|
+
export const DEFAULT_MAX_LINK_PER_NODE = Math.floor(DEFAULT_MAX_CHUNK_SIZE / LINK_SIZE_IN_BYTES);
|
|
60
|
+
export const processFileToIPLDFormat = (blockstore, file, totalSize, filename, { maxNodeSize = DEFAULT_MAX_CHUNK_SIZE, maxLinkPerNode = DEFAULT_MAX_LINK_PER_NODE, encryption = undefined, compression = undefined, } = {
|
|
61
|
+
maxNodeSize: DEFAULT_MAX_CHUNK_SIZE,
|
|
40
62
|
maxLinkPerNode: DEFAULT_MAX_LINK_PER_NODE,
|
|
41
63
|
encryption: undefined,
|
|
42
64
|
compression: undefined,
|
|
43
65
|
}) => {
|
|
66
|
+
if (filename && filename.length > MAX_NAME_SIZE) {
|
|
67
|
+
throw new Error(`Filename is too long: ${filename.length} > ${MAX_NAME_SIZE}`);
|
|
68
|
+
}
|
|
44
69
|
return processBufferToIPLDFormat(blockstore, file, filename, totalSize, fileBuilders, {
|
|
45
|
-
|
|
70
|
+
maxNodeSize,
|
|
46
71
|
maxLinkPerNode,
|
|
47
72
|
encryption,
|
|
48
73
|
compression,
|
|
49
74
|
});
|
|
50
75
|
};
|
|
51
76
|
export const processMetadataToIPLDFormat = (blockstore_1, metadata_1, ...args_1) => __awaiter(void 0, [blockstore_1, metadata_1, ...args_1], void 0, function* (blockstore, metadata, limits = {
|
|
52
|
-
|
|
77
|
+
maxNodeSize: DEFAULT_MAX_CHUNK_SIZE,
|
|
53
78
|
maxLinkPerNode: DEFAULT_MAX_LINK_PER_NODE,
|
|
54
79
|
}) {
|
|
55
|
-
|
|
56
|
-
|
|
80
|
+
if (metadata.name && metadata.name.length > MAX_NAME_SIZE) {
|
|
81
|
+
throw new Error(`Filename is too long: ${metadata.name.length} > ${MAX_NAME_SIZE}`);
|
|
82
|
+
}
|
|
83
|
+
const buffer = Buffer.from(stringifyMetadata(metadata));
|
|
57
84
|
return processBufferToIPLDFormat(blockstore, (function () {
|
|
58
85
|
return __asyncGenerator(this, arguments, function* () {
|
|
59
86
|
yield yield __await(buffer);
|
|
60
87
|
});
|
|
61
|
-
})(), name, buffer.byteLength, metadataBuilders, limits);
|
|
88
|
+
})(), metadata.name, BigInt(buffer.byteLength), metadataBuilders, limits);
|
|
62
89
|
});
|
|
63
|
-
const processBufferToIPLDFormat = (blockstore_1, buffer_1, filename_1, totalSize_1, builders_1, ...args_1) => __awaiter(void 0, [blockstore_1, buffer_1, filename_1, totalSize_1, builders_1, ...args_1], void 0, function* (blockstore, buffer, filename, totalSize, builders, {
|
|
64
|
-
|
|
90
|
+
const processBufferToIPLDFormat = (blockstore_1, buffer_1, filename_1, totalSize_1, builders_1, ...args_1) => __awaiter(void 0, [blockstore_1, buffer_1, filename_1, totalSize_1, builders_1, ...args_1], void 0, function* (blockstore, buffer, filename, totalSize, builders, { maxNodeSize: maxNodeSize = DEFAULT_MAX_CHUNK_SIZE, maxLinkPerNode = DEFAULT_MAX_LINK_PER_NODE, encryption = undefined, compression = undefined, } = {
|
|
91
|
+
maxNodeSize: DEFAULT_MAX_CHUNK_SIZE,
|
|
65
92
|
maxLinkPerNode: DEFAULT_MAX_LINK_PER_NODE,
|
|
66
93
|
encryption: undefined,
|
|
67
94
|
compression: undefined,
|
|
68
95
|
}) {
|
|
69
96
|
var _a, e_1, _b, _c;
|
|
70
|
-
|
|
97
|
+
if (filename && filename.length > MAX_NAME_SIZE) {
|
|
98
|
+
throw new Error(`Filename is too long: ${filename.length} > ${MAX_NAME_SIZE}`);
|
|
99
|
+
}
|
|
100
|
+
const bufferChunks = chunkBuffer(buffer, { maxChunkSize: maxNodeSize - NODE_METADATA_SIZE });
|
|
71
101
|
let CIDs = [];
|
|
72
102
|
try {
|
|
73
103
|
for (var _d = true, bufferChunks_1 = __asyncValues(bufferChunks), bufferChunks_1_1; bufferChunks_1_1 = yield bufferChunks_1.next(), _a = bufferChunks_1_1.done, !_a; _d = true) {
|
|
@@ -89,19 +119,22 @@ const processBufferToIPLDFormat = (blockstore_1, buffer_1, filename_1, totalSize
|
|
|
89
119
|
}
|
|
90
120
|
return processBufferToIPLDFormatFromChunks(blockstore, CIDs, filename, totalSize, builders, {
|
|
91
121
|
maxLinkPerNode,
|
|
92
|
-
|
|
122
|
+
maxNodeSize,
|
|
93
123
|
encryption,
|
|
94
124
|
compression,
|
|
95
125
|
});
|
|
96
126
|
});
|
|
97
|
-
export const processBufferToIPLDFormatFromChunks = (blockstore_1, chunks_1, filename_1, totalSize_1, builders_1, ...args_1) => __awaiter(void 0, [blockstore_1, chunks_1, filename_1, totalSize_1, builders_1, ...args_1], void 0, function* (blockstore, chunks, filename, totalSize, builders, {
|
|
98
|
-
|
|
127
|
+
export const processBufferToIPLDFormatFromChunks = (blockstore_1, chunks_1, filename_1, totalSize_1, builders_1, ...args_1) => __awaiter(void 0, [blockstore_1, chunks_1, filename_1, totalSize_1, builders_1, ...args_1], void 0, function* (blockstore, chunks, filename, totalSize, builders, { maxNodeSize: maxNodeSize = DEFAULT_MAX_CHUNK_SIZE, maxLinkPerNode = DEFAULT_MAX_LINK_PER_NODE, encryption = undefined, compression = undefined, } = {
|
|
128
|
+
maxNodeSize: DEFAULT_MAX_CHUNK_SIZE,
|
|
99
129
|
maxLinkPerNode: DEFAULT_MAX_LINK_PER_NODE,
|
|
100
130
|
encryption: undefined,
|
|
101
131
|
compression: undefined,
|
|
102
132
|
}) {
|
|
103
133
|
var _a, chunks_2, chunks_2_1;
|
|
104
134
|
var _b, e_2, _c, _d;
|
|
135
|
+
if (filename && filename.length > MAX_NAME_SIZE) {
|
|
136
|
+
throw new Error(`Filename is too long: ${filename.length} > ${MAX_NAME_SIZE}`);
|
|
137
|
+
}
|
|
105
138
|
let chunkCount = 0;
|
|
106
139
|
let CIDs = [];
|
|
107
140
|
try {
|
|
@@ -137,7 +170,7 @@ export const processBufferToIPLDFormatFromChunks = (blockstore_1, chunks_1, file
|
|
|
137
170
|
const newCIDs = [];
|
|
138
171
|
for (let i = 0; i < CIDs.length; i += maxLinkPerNode) {
|
|
139
172
|
const chunk = CIDs.slice(i, i + maxLinkPerNode);
|
|
140
|
-
const node = builders.inlink(chunk, chunk.length, depth,
|
|
173
|
+
const node = builders.inlink(chunk, chunk.length, depth, maxNodeSize);
|
|
141
174
|
const cid = cidOfNode(node);
|
|
142
175
|
yield blockstore.put(cid, encodeNode(node));
|
|
143
176
|
newCIDs.push(cid);
|
|
@@ -145,7 +178,7 @@ export const processBufferToIPLDFormatFromChunks = (blockstore_1, chunks_1, file
|
|
|
145
178
|
depth++;
|
|
146
179
|
CIDs = newCIDs;
|
|
147
180
|
}
|
|
148
|
-
const head = builders.root(CIDs, totalSize, depth, filename,
|
|
181
|
+
const head = builders.root(CIDs, totalSize, depth, filename, maxNodeSize, {
|
|
149
182
|
compression,
|
|
150
183
|
encryption,
|
|
151
184
|
});
|
|
@@ -153,12 +186,15 @@ export const processBufferToIPLDFormatFromChunks = (blockstore_1, chunks_1, file
|
|
|
153
186
|
yield blockstore.put(headCID, encodeNode(head));
|
|
154
187
|
return headCID;
|
|
155
188
|
});
|
|
156
|
-
export const processFolderToIPLDFormat = (blockstore_1, children_1, name_1, size_1, ...args_1) => __awaiter(void 0, [blockstore_1, children_1, name_1, size_1, ...args_1], void 0, function* (blockstore, children, name, size, { maxLinkPerNode = DEFAULT_MAX_LINK_PER_NODE,
|
|
189
|
+
export const processFolderToIPLDFormat = (blockstore_1, children_1, name_1, size_1, ...args_1) => __awaiter(void 0, [blockstore_1, children_1, name_1, size_1, ...args_1], void 0, function* (blockstore, children, name, size, { maxLinkPerNode = DEFAULT_MAX_LINK_PER_NODE, maxNodeSize: maxNodeSize = DEFAULT_MAX_CHUNK_SIZE, compression = undefined, encryption = undefined, } = {
|
|
157
190
|
maxLinkPerNode: DEFAULT_MAX_LINK_PER_NODE,
|
|
158
|
-
|
|
191
|
+
maxNodeSize: DEFAULT_MAX_CHUNK_SIZE,
|
|
159
192
|
compression: undefined,
|
|
160
193
|
encryption: undefined,
|
|
161
194
|
}) {
|
|
195
|
+
if (name.length > MAX_NAME_SIZE) {
|
|
196
|
+
throw new Error(`Filename is too long: ${name.length} > ${MAX_NAME_SIZE}`);
|
|
197
|
+
}
|
|
162
198
|
let cids = children;
|
|
163
199
|
let depth = 0;
|
|
164
200
|
while (cids.length > maxLinkPerNode) {
|
|
@@ -173,7 +209,7 @@ export const processFolderToIPLDFormat = (blockstore_1, children_1, name_1, size
|
|
|
173
209
|
cids = newCIDs;
|
|
174
210
|
depth++;
|
|
175
211
|
}
|
|
176
|
-
const node = createFolderIpldNode(cids, name, depth, size,
|
|
212
|
+
const node = createFolderIpldNode(cids, name, depth, size, maxNodeSize, {
|
|
177
213
|
compression,
|
|
178
214
|
encryption,
|
|
179
215
|
});
|
|
@@ -185,15 +221,18 @@ export const processFolderToIPLDFormat = (blockstore_1, children_1, name_1, size
|
|
|
185
221
|
* Process chunks to IPLD format, return the last chunk if it's not full
|
|
186
222
|
* @returns the last chunk if it's not full, otherwise an empty buffer
|
|
187
223
|
*/
|
|
188
|
-
export const processChunksToIPLDFormat = (blockstore_1, chunks_1, builders_1, _a) => __awaiter(void 0, [blockstore_1, chunks_1, builders_1, _a], void 0, function* (blockstore, chunks, builders, {
|
|
224
|
+
export const processChunksToIPLDFormat = (blockstore_1, chunks_1, builders_1, _a) => __awaiter(void 0, [blockstore_1, chunks_1, builders_1, _a], void 0, function* (blockstore, chunks, builders, { maxNodeSize = DEFAULT_MAX_CHUNK_SIZE }) {
|
|
189
225
|
var _b, e_3, _c, _d;
|
|
190
|
-
const bufferChunks = chunkBuffer(chunks, {
|
|
226
|
+
const bufferChunks = chunkBuffer(chunks, {
|
|
227
|
+
maxChunkSize: maxNodeSize - NODE_METADATA_SIZE,
|
|
228
|
+
ignoreLastChunk: false,
|
|
229
|
+
});
|
|
191
230
|
try {
|
|
192
231
|
for (var _e = true, bufferChunks_2 = __asyncValues(bufferChunks), bufferChunks_2_1; bufferChunks_2_1 = yield bufferChunks_2.next(), _b = bufferChunks_2_1.done, !_b; _e = true) {
|
|
193
232
|
_d = bufferChunks_2_1.value;
|
|
194
233
|
_e = false;
|
|
195
234
|
const chunk = _d;
|
|
196
|
-
if (chunk.byteLength <
|
|
235
|
+
if (chunk.byteLength < maxNodeSize) {
|
|
197
236
|
return chunk;
|
|
198
237
|
}
|
|
199
238
|
const node = builders.chunk(chunk);
|
package/dist/ipld/nodes.d.ts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { CID } from 'multiformats/cid';
|
|
2
2
|
import { FileUploadOptions, OffchainMetadata } from '../metadata/index.js';
|
|
3
3
|
import { PBNode } from './index.js';
|
|
4
|
-
export declare const createFileChunkIpldNode: (data: Buffer) => PBNode;
|
|
5
|
-
export declare const createChunkedFileIpldNode: (links: CID[], size:
|
|
4
|
+
export declare const createFileChunkIpldNode: (data: Buffer, maxNodeSize?: number) => PBNode;
|
|
5
|
+
export declare const createChunkedFileIpldNode: (links: CID[], size: bigint, linkDepth: number, name?: string, maxNodeSize?: number, uploadOptions?: FileUploadOptions) => PBNode;
|
|
6
6
|
export declare const createFileInlinkIpldNode: (links: CID[], size: number, linkDepth: number, maxNodeSize?: number) => PBNode;
|
|
7
|
-
export declare const createSingleFileIpldNode: (data: Buffer, name?: string, uploadOptions?: FileUploadOptions) => PBNode;
|
|
7
|
+
export declare const createSingleFileIpldNode: (data: Buffer, name?: string, uploadOptions?: FileUploadOptions, maxNodeSize?: number) => PBNode;
|
|
8
8
|
export declare const createMetadataInlinkIpldNode: (links: CID[], size: number, linkDepth: number, maxNodeSize?: number) => PBNode;
|
|
9
9
|
export declare const createSingleMetadataIpldNode: (data: Buffer, name?: string) => PBNode;
|
|
10
|
-
export declare const createMetadataChunkIpldNode: (data: Buffer) => PBNode;
|
|
11
|
-
export declare const createChunkedMetadataIpldNode: (links: CID[], size:
|
|
12
|
-
export declare const createFolderIpldNode: (links: CID[], name: string, linkDepth: number, size:
|
|
10
|
+
export declare const createMetadataChunkIpldNode: (data: Buffer, maxNodeSize?: number) => PBNode;
|
|
11
|
+
export declare const createChunkedMetadataIpldNode: (links: CID[], size: bigint, linkDepth: number, name?: string, maxNodeSize?: number) => PBNode;
|
|
12
|
+
export declare const createFolderIpldNode: (links: CID[], name: string, linkDepth: number, size: bigint, maxNodeSize?: number, uploadOptions?: FileUploadOptions) => PBNode;
|
|
13
13
|
export declare const createFolderInlinkIpldNode: (links: CID[], linkDepth: number, maxNodeSize?: number) => PBNode;
|
|
14
14
|
export declare const createMetadataNode: (metadata: OffchainMetadata, maxNodeSize?: number) => PBNode;
|
|
15
15
|
//# sourceMappingURL=nodes.d.ts.map
|
package/dist/ipld/nodes.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../src/ipld/nodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../src/ipld/nodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAI1E,OAAO,EAAc,MAAM,EAAE,MAAM,YAAY,CAAA;AAG/C,eAAO,MAAM,uBAAuB,SAC5B,MAAM,gBACC,MAAM,KAClB,MAYA,CAAA;AAKH,eAAO,MAAM,yBAAyB,UAC7B,GAAG,EAAE,QACN,MAAM,aACD,MAAM,SACV,MAAM,gBACA,MAAM,kBACH,iBAAiB,KAChC,MAaA,CAAA;AAGH,eAAO,MAAM,wBAAwB,UAC5B,GAAG,EAAE,QACN,MAAM,aACD,MAAM,gBACJ,MAAM,KAClB,MAWA,CAAA;AAKH,eAAO,MAAM,wBAAwB,SAC7B,MAAM,SACL,MAAM,kBACG,iBAAiB,gBACpB,MAAM,KAClB,MAcA,CAAA;AAKH,eAAO,MAAM,4BAA4B,UAChC,GAAG,EAAE,QACN,MAAM,aACD,MAAM,gBACJ,MAAM,KAClB,MAWA,CAAA;AAKH,eAAO,MAAM,4BAA4B,SAAU,MAAM,SAAS,MAAM,KAAG,MAUxE,CAAA;AAEH,eAAO,MAAM,2BAA2B,SAChC,MAAM,gBACC,MAAM,KAClB,MAWA,CAAA;AAEH,eAAO,MAAM,6BAA6B,UACjC,GAAG,EAAE,QACN,MAAM,aACD,MAAM,SACV,MAAM,gBACA,MAAM,KAClB,MAYA,CAAA;AAKH,eAAO,MAAM,oBAAoB,UACxB,GAAG,EAAE,QACN,MAAM,aACD,MAAM,QACX,MAAM,gBACC,MAAM,kBACH,iBAAiB,KAChC,MAaA,CAAA;AAEH,eAAO,MAAM,0BAA0B,UAC9B,GAAG,EAAE,aACD,MAAM,gBACJ,MAAM,KAClB,MAUA,CAAA;AAGH,eAAO,MAAM,kBAAkB,aACnB,gBAAgB,gBACb,MAAM,KAClB,MAcF,CAAA"}
|
package/dist/ipld/nodes.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { encodeIPLDNodeData, MetadataType } from '../metadata/onchain/index.js';
|
|
2
|
+
import { stringifyMetadata } from '../utils/metadata.js';
|
|
2
3
|
import { DEFAULT_MAX_CHUNK_SIZE, ensureNodeMaxSize } from './chunker.js';
|
|
3
4
|
import { createNode } from './index.js';
|
|
4
5
|
/// Creates a file chunk ipld node
|
|
5
|
-
export const createFileChunkIpldNode = (data) => createNode(encodeIPLDNodeData({
|
|
6
|
+
export const createFileChunkIpldNode = (data, maxNodeSize = DEFAULT_MAX_CHUNK_SIZE) => ensureNodeMaxSize(createNode(encodeIPLDNodeData({
|
|
6
7
|
type: MetadataType.FileChunk,
|
|
7
|
-
size: data.length,
|
|
8
|
+
size: BigInt(data.length).valueOf(),
|
|
8
9
|
linkDepth: 0,
|
|
9
10
|
data,
|
|
10
|
-
}), []);
|
|
11
|
+
}), []), maxNodeSize);
|
|
11
12
|
// Creates a file ipld node
|
|
12
13
|
// links: the CIDs of the file's contents
|
|
13
14
|
// @todo: add the file's metadata
|
|
@@ -22,26 +23,26 @@ export const createChunkedFileIpldNode = (links, size, linkDepth, name, maxNodeS
|
|
|
22
23
|
// links: the CIDs of the file's contents
|
|
23
24
|
export const createFileInlinkIpldNode = (links, size, linkDepth, maxNodeSize = DEFAULT_MAX_CHUNK_SIZE) => ensureNodeMaxSize(createNode(encodeIPLDNodeData({
|
|
24
25
|
type: MetadataType.FileInlink,
|
|
25
|
-
size,
|
|
26
|
+
size: BigInt(size).valueOf(),
|
|
26
27
|
linkDepth,
|
|
27
28
|
}), links.map((cid) => ({ Hash: cid }))), maxNodeSize);
|
|
28
29
|
// Creates a file ipld node
|
|
29
30
|
// links: the CIDs of the file's contents
|
|
30
31
|
// @todo: add the file's metadata
|
|
31
|
-
export const createSingleFileIpldNode = (data, name, uploadOptions) => createNode(encodeIPLDNodeData({
|
|
32
|
+
export const createSingleFileIpldNode = (data, name, uploadOptions, maxNodeSize = DEFAULT_MAX_CHUNK_SIZE) => ensureNodeMaxSize(createNode(encodeIPLDNodeData({
|
|
32
33
|
type: MetadataType.File,
|
|
33
34
|
name,
|
|
34
|
-
size: data.length,
|
|
35
|
+
size: BigInt(data.length).valueOf(),
|
|
35
36
|
linkDepth: 0,
|
|
36
37
|
data,
|
|
37
38
|
uploadOptions,
|
|
38
|
-
}), []);
|
|
39
|
+
}), []), maxNodeSize);
|
|
39
40
|
// Creates a file ipld node
|
|
40
41
|
// links: the CIDs of the file's contents
|
|
41
42
|
// @todo: add the file's metadata
|
|
42
43
|
export const createMetadataInlinkIpldNode = (links, size, linkDepth, maxNodeSize = DEFAULT_MAX_CHUNK_SIZE) => ensureNodeMaxSize(createNode(encodeIPLDNodeData({
|
|
43
44
|
type: MetadataType.FileInlink,
|
|
44
|
-
size,
|
|
45
|
+
size: BigInt(size).valueOf(),
|
|
45
46
|
linkDepth,
|
|
46
47
|
}), links.map((cid) => ({ Hash: cid }))), maxNodeSize);
|
|
47
48
|
// Creates a file ipld node
|
|
@@ -50,16 +51,16 @@ export const createMetadataInlinkIpldNode = (links, size, linkDepth, maxNodeSize
|
|
|
50
51
|
export const createSingleMetadataIpldNode = (data, name) => createNode(encodeIPLDNodeData({
|
|
51
52
|
type: MetadataType.Metadata,
|
|
52
53
|
name,
|
|
53
|
-
size: data.length,
|
|
54
|
+
size: BigInt(data.length).valueOf(),
|
|
54
55
|
linkDepth: 0,
|
|
55
56
|
data,
|
|
56
57
|
}), []);
|
|
57
|
-
export const createMetadataChunkIpldNode = (data) => createNode(encodeIPLDNodeData({
|
|
58
|
+
export const createMetadataChunkIpldNode = (data, maxNodeSize = DEFAULT_MAX_CHUNK_SIZE) => ensureNodeMaxSize(createNode(encodeIPLDNodeData({
|
|
58
59
|
type: MetadataType.MetadataChunk,
|
|
59
|
-
size: data.length,
|
|
60
|
+
size: BigInt(data.length).valueOf(),
|
|
60
61
|
linkDepth: 0,
|
|
61
62
|
data,
|
|
62
|
-
}));
|
|
63
|
+
})), maxNodeSize);
|
|
63
64
|
export const createChunkedMetadataIpldNode = (links, size, linkDepth, name, maxNodeSize = DEFAULT_MAX_CHUNK_SIZE) => ensureNodeMaxSize(createNode(encodeIPLDNodeData({
|
|
64
65
|
type: MetadataType.Metadata,
|
|
65
66
|
name,
|
|
@@ -82,7 +83,7 @@ export const createFolderInlinkIpldNode = (links, linkDepth, maxNodeSize = DEFAU
|
|
|
82
83
|
}), links.map((cid) => ({ Hash: cid }))), maxNodeSize);
|
|
83
84
|
/// Creates a metadata ipld node
|
|
84
85
|
export const createMetadataNode = (metadata, maxNodeSize = DEFAULT_MAX_CHUNK_SIZE) => {
|
|
85
|
-
const data = Buffer.from(
|
|
86
|
+
const data = Buffer.from(stringifyMetadata(metadata));
|
|
86
87
|
return ensureNodeMaxSize(createNode(encodeIPLDNodeData({
|
|
87
88
|
type: MetadataType.Metadata,
|
|
88
89
|
name: metadata.name,
|
|
@@ -5,14 +5,14 @@ export type OffchainFileMetadata = {
|
|
|
5
5
|
dataCid: string;
|
|
6
6
|
name?: string;
|
|
7
7
|
mimeType?: string;
|
|
8
|
-
totalSize:
|
|
8
|
+
totalSize: bigint;
|
|
9
9
|
totalChunks: number;
|
|
10
10
|
chunks: ChunkInfo[];
|
|
11
11
|
uploadOptions?: FileUploadOptions;
|
|
12
12
|
};
|
|
13
13
|
export interface ChunkInfo {
|
|
14
|
-
size:
|
|
14
|
+
size: bigint;
|
|
15
15
|
cid: string;
|
|
16
16
|
}
|
|
17
|
-
export declare const fileMetadata: (headCID: CID, chunks: ChunkInfo[], totalSize:
|
|
17
|
+
export declare const fileMetadata: (headCID: CID, chunks: ChunkInfo[], totalSize: bigint, name?: string | null, mimeType?: string | null, uploadOptions?: FileUploadOptions) => OffchainFileMetadata;
|
|
18
18
|
//# sourceMappingURL=file.d.ts.map
|
|
@@ -5,13 +5,13 @@ interface ChildrenMetadata {
|
|
|
5
5
|
type: 'folder' | 'file';
|
|
6
6
|
name?: string;
|
|
7
7
|
cid: string;
|
|
8
|
-
totalSize:
|
|
8
|
+
totalSize: bigint;
|
|
9
9
|
}
|
|
10
10
|
export type OffchainFolderMetadata = {
|
|
11
11
|
type: 'folder';
|
|
12
12
|
dataCid: string;
|
|
13
13
|
name?: string;
|
|
14
|
-
totalSize:
|
|
14
|
+
totalSize: bigint;
|
|
15
15
|
totalFiles: number;
|
|
16
16
|
children: ChildrenMetadata[];
|
|
17
17
|
uploadOptions: FileUploadOptions;
|
|
@@ -9,7 +9,7 @@ export const childrenMetadataFromNode = (node) => {
|
|
|
9
9
|
return {
|
|
10
10
|
type: ipldData.type === MetadataType.File ? 'file' : 'folder',
|
|
11
11
|
cid: cidToString(cidOfNode(node)),
|
|
12
|
-
totalSize: (_a = ipldData.size) !== null && _a !== void 0 ? _a : 0,
|
|
12
|
+
totalSize: (_a = ipldData.size) !== null && _a !== void 0 ? _a : BigInt(0).valueOf(),
|
|
13
13
|
name: ipldData.name,
|
|
14
14
|
};
|
|
15
15
|
};
|
|
@@ -17,7 +17,7 @@ export const folderMetadata = (cid, children, name, uploadOptions = {}) => {
|
|
|
17
17
|
cid = typeof cid === 'string' ? cid : cidToString(cid);
|
|
18
18
|
return {
|
|
19
19
|
dataCid: cid,
|
|
20
|
-
totalSize: children.reduce((acc, child) => acc + child.totalSize, 0),
|
|
20
|
+
totalSize: children.reduce((acc, child) => acc + child.totalSize, BigInt(0).valueOf()),
|
|
21
21
|
totalFiles: children.length,
|
|
22
22
|
children,
|
|
23
23
|
type: 'folder',
|
|
@@ -23,7 +23,7 @@ export var IPLDNodeData;
|
|
|
23
23
|
}
|
|
24
24
|
if (obj.size != null) {
|
|
25
25
|
w.uint32(24);
|
|
26
|
-
w.
|
|
26
|
+
w.int64(obj.size);
|
|
27
27
|
}
|
|
28
28
|
if (obj.name != null) {
|
|
29
29
|
w.uint32(34);
|
|
@@ -59,7 +59,7 @@ export var IPLDNodeData;
|
|
|
59
59
|
break;
|
|
60
60
|
}
|
|
61
61
|
case 3: {
|
|
62
|
-
obj.size = reader.
|
|
62
|
+
obj.size = reader.int64();
|
|
63
63
|
break;
|
|
64
64
|
}
|
|
65
65
|
case 4: {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/utils/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAEvD,eAAO,MAAM,iBAAiB,aAAc,gBAAgB,KAAG,MAG5D,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const stringifyMetadata = (metadata) => JSON.stringify(metadata, (_, v) => typeof v === 'bigint' || v instanceof BigInt ? v.toString() : v);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@autonomys/auto-dag-data",
|
|
3
3
|
"packageManager": "yarn@4.1.1",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.7",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"repository": {
|
|
@@ -38,6 +38,7 @@
|
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"@ipld/dag-pb": "^4.1.2",
|
|
41
|
+
"@peculiar/webcrypto": "^1.5.0",
|
|
41
42
|
"@webbuf/blake3": "^3.0.26",
|
|
42
43
|
"@webbuf/fixedbuf": "^3.0.26",
|
|
43
44
|
"@webbuf/webbuf": "^3.0.26",
|
package/src/ipld/builders.ts
CHANGED
|
@@ -14,10 +14,10 @@ import {
|
|
|
14
14
|
|
|
15
15
|
export interface Builders {
|
|
16
16
|
inlink: (links: CID[], size: number, linkDepth: number, chunkSize: number) => PBNode
|
|
17
|
-
chunk: (data: Buffer) => PBNode
|
|
17
|
+
chunk: (data: Buffer, maxNodeSize?: number) => PBNode
|
|
18
18
|
root: (
|
|
19
19
|
links: CID[],
|
|
20
|
-
size:
|
|
20
|
+
size: bigint,
|
|
21
21
|
linkDepth: number,
|
|
22
22
|
name?: string,
|
|
23
23
|
maxNodeSize?: number,
|