@autonomys/auto-drive 0.5.0
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 -0
- package/dist/cid/index.d.ts +9 -0
- package/dist/cid/index.d.ts.map +1 -0
- package/dist/cid/index.js +20 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/ipld/chunker.d.ts +17 -0
- package/dist/ipld/chunker.d.ts.map +1 -0
- package/dist/ipld/chunker.js +77 -0
- package/dist/ipld/index.d.ts +4 -0
- package/dist/ipld/index.d.ts.map +1 -0
- package/dist/ipld/index.js +3 -0
- package/dist/ipld/nodes.d.ts +11 -0
- package/dist/ipld/nodes.d.ts.map +1 -0
- package/dist/ipld/nodes.js +60 -0
- package/dist/ipld/utils.d.ts +5 -0
- package/dist/ipld/utils.d.ts.map +1 -0
- package/dist/ipld/utils.js +10 -0
- package/dist/metadata/index.d.ts +3 -0
- package/dist/metadata/index.d.ts.map +1 -0
- package/dist/metadata/index.js +2 -0
- package/dist/metadata/offchain/base.d.ts +4 -0
- package/dist/metadata/offchain/base.d.ts.map +1 -0
- package/dist/metadata/offchain/base.js +1 -0
- package/dist/metadata/offchain/file.d.ts +16 -0
- package/dist/metadata/offchain/file.d.ts.map +1 -0
- package/dist/metadata/offchain/file.js +18 -0
- package/dist/metadata/offchain/folder.d.ts +17 -0
- package/dist/metadata/offchain/folder.d.ts.map +1 -0
- package/dist/metadata/offchain/folder.js +9 -0
- package/dist/metadata/offchain/index.d.ts +4 -0
- package/dist/metadata/offchain/index.d.ts.map +1 -0
- package/dist/metadata/offchain/index.js +3 -0
- package/dist/metadata/onchain/index.d.ts +3 -0
- package/dist/metadata/onchain/index.d.ts.map +1 -0
- package/dist/metadata/onchain/index.js +2 -0
- package/dist/metadata/onchain/protobuf/OnchainMetadat.d.ts +26 -0
- package/dist/metadata/onchain/protobuf/OnchainMetadat.d.ts.map +1 -0
- package/dist/metadata/onchain/protobuf/OnchainMetadat.js +108 -0
- package/dist/metadata/onchain/protobuf/onchainMetadata.d.ts +26 -0
- package/dist/metadata/onchain/protobuf/onchainMetadata.d.ts.map +1 -0
- package/dist/metadata/onchain/protobuf/onchainMetadata.js +108 -0
- package/dist/metadata/onchain/utils.d.ts +4 -0
- package/dist/metadata/onchain/utils.d.ts.map +1 -0
- package/dist/metadata/onchain/utils.js +12 -0
- package/jest.config.ts +17 -0
- package/package.json +42 -0
- package/src/cid/index.ts +26 -0
- package/src/index.ts +3 -0
- package/src/ipld/chunker.ts +117 -0
- package/src/ipld/index.ts +3 -0
- package/src/ipld/nodes.ts +134 -0
- package/src/ipld/utils.ts +15 -0
- package/src/metadata/index.ts +2 -0
- package/src/metadata/offchain/base.ts +4 -0
- package/src/metadata/offchain/file.ts +36 -0
- package/src/metadata/offchain/folder.ts +28 -0
- package/src/metadata/offchain/index.ts +3 -0
- package/src/metadata/onchain/index.ts +2 -0
- package/src/metadata/onchain/protobuf/OnchainMetadata.proto +19 -0
- package/src/metadata/onchain/protobuf/OnchainMetadata.ts +133 -0
- package/src/metadata/onchain/utils.ts +15 -0
- package/tests/chunker.spec.ts +157 -0
- package/tests/cid.spec.ts +20 -0
- package/tests/nodes.spec.ts +70 -0
- package/tsconfig.json +14 -0
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# auto-drive
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { PBNode } from '@ipld/dag-pb';
|
|
2
|
+
import { CID } from 'multiformats/cid';
|
|
3
|
+
export declare const BLAKE3_CODE = 31;
|
|
4
|
+
export declare const cidOfNode: (node: PBNode) => CID<unknown, 85, 31, 1>;
|
|
5
|
+
export declare const cidToString: (cid: CID) => string;
|
|
6
|
+
export declare const stringToCid: (str: string) => CID<unknown, number, number, import("multiformats/cid").Version>;
|
|
7
|
+
export declare const cidFromBlakeHash: (hash: Buffer) => CID<unknown, 85, 31, 1>;
|
|
8
|
+
export declare const blake3HashFromCid: (cid: CID) => Uint8Array;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cid/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,MAAM,EAAE,MAAM,cAAc,CAAA;AAE7C,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAKtC,eAAO,MAAM,WAAW,KAAO,CAAA;AAE/B,eAAO,MAAM,SAAS,SAAU,MAAM,4BAErC,CAAA;AAED,eAAO,MAAM,WAAW,QAAS,GAAG,WAEnC,CAAA;AAED,eAAO,MAAM,WAAW,QAAS,MAAM,qEAEtC,CAAA;AAED,eAAO,MAAM,gBAAgB,SAAU,MAAM,4BAE5C,CAAA;AAED,eAAO,MAAM,iBAAiB,QAAS,GAAG,eAAyB,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { encode } from '@ipld/dag-pb';
|
|
2
|
+
import { hash } from 'blake3';
|
|
3
|
+
import { CID } from 'multiformats/cid';
|
|
4
|
+
import * as base32 from 'multiformats/bases/base32';
|
|
5
|
+
import * as raw from 'multiformats/codecs/raw';
|
|
6
|
+
import { create } from 'multiformats/hashes/digest';
|
|
7
|
+
export const BLAKE3_CODE = 0x1f;
|
|
8
|
+
export const cidOfNode = (node) => {
|
|
9
|
+
return cidFromBlakeHash(hash(encode(node)));
|
|
10
|
+
};
|
|
11
|
+
export const cidToString = (cid) => {
|
|
12
|
+
return cid.toString(base32.base32);
|
|
13
|
+
};
|
|
14
|
+
export const stringToCid = (str) => {
|
|
15
|
+
return CID.parse(str, base32.base32);
|
|
16
|
+
};
|
|
17
|
+
export const cidFromBlakeHash = (hash) => {
|
|
18
|
+
return CID.create(1, raw.code, create(BLAKE3_CODE, hash));
|
|
19
|
+
};
|
|
20
|
+
export const blake3HashFromCid = (cid) => cid.multihash.digest;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,qBAAqB,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { PBNode } from '@ipld/dag-pb';
|
|
2
|
+
import { CID } from 'multiformats';
|
|
3
|
+
export declare const DEFAULT_MAX_CHUNK_SIZE: number;
|
|
4
|
+
export declare const DEFAULT_MAX_LINK_PER_NODE: number;
|
|
5
|
+
export interface IPLDDag {
|
|
6
|
+
headCID: CID;
|
|
7
|
+
nodes: Map<CID, PBNode>;
|
|
8
|
+
}
|
|
9
|
+
export declare const createFileIPLDDag: (file: Buffer, filename?: string, { chunkSize, maxLinkPerNode }?: {
|
|
10
|
+
chunkSize: number;
|
|
11
|
+
maxLinkPerNode: number;
|
|
12
|
+
}) => IPLDDag;
|
|
13
|
+
export declare const createFolderIPLDDag: (children: CID[], name: string, size: number, { maxLinkPerNode }?: {
|
|
14
|
+
maxLinkPerNode: number;
|
|
15
|
+
}) => IPLDDag;
|
|
16
|
+
export declare const ensureNodeMaxSize: (node: PBNode, maxSize?: number) => PBNode;
|
|
17
|
+
//# sourceMappingURL=chunker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.d.ts","sourceRoot":"","sources":["../../src/ipld/chunker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAYlC,eAAO,MAAM,sBAAsB,QAAY,CAAA;AAC/C,eAAO,MAAM,yBAAyB,QAA8B,CAAA;AAEpE,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,GAAG,CAAA;IACZ,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;CACxB;AAED,eAAO,MAAM,iBAAiB,SACtB,MAAM,aACD,MAAM,kCACc;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,KAI3E,OA4CF,CAAA;AAED,eAAO,MAAM,mBAAmB,aACpB,GAAG,EAAE,QACT,MAAM,QACN,MAAM,uBACQ;IAAE,cAAc,EAAE,MAAM,CAAA;CAAE,KAC7C,OAyBF,CAAA;AAED,eAAO,MAAM,iBAAiB,SACtB,MAAM,YACH,MAAM,KACd,MAOF,CAAA"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { cidOfNode } from '../cid/index.js';
|
|
2
|
+
import { createChunkedFileIpldNode, createChunkIpldNode, createFileInlinkIpldNode, createFolderInlinkIpldNode, createFolderIpldNode, createSingleFileIpldNode, } from './nodes.js';
|
|
3
|
+
import { chunkBuffer, encodeNode } from './utils.js';
|
|
4
|
+
export const DEFAULT_MAX_CHUNK_SIZE = 1024 * 64;
|
|
5
|
+
export const DEFAULT_MAX_LINK_PER_NODE = DEFAULT_MAX_CHUNK_SIZE / 64;
|
|
6
|
+
export const createFileIPLDDag = (file, filename, { chunkSize, maxLinkPerNode } = {
|
|
7
|
+
chunkSize: DEFAULT_MAX_CHUNK_SIZE,
|
|
8
|
+
maxLinkPerNode: DEFAULT_MAX_LINK_PER_NODE,
|
|
9
|
+
}) => {
|
|
10
|
+
if (file.length <= chunkSize) {
|
|
11
|
+
const head = createSingleFileIpldNode(file, filename);
|
|
12
|
+
const headCID = cidOfNode(head);
|
|
13
|
+
return {
|
|
14
|
+
headCID,
|
|
15
|
+
nodes: new Map([[headCID, head]]),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
const bufferChunks = chunkBuffer(file, chunkSize);
|
|
19
|
+
const nodes = new Map();
|
|
20
|
+
let CIDs = bufferChunks.map((chunk) => {
|
|
21
|
+
const node = createChunkIpldNode(chunk);
|
|
22
|
+
const cid = cidOfNode(node);
|
|
23
|
+
nodes.set(cid, node);
|
|
24
|
+
return cid;
|
|
25
|
+
});
|
|
26
|
+
let depth = 1;
|
|
27
|
+
while (CIDs.length > maxLinkPerNode) {
|
|
28
|
+
const newCIDs = [];
|
|
29
|
+
for (let i = 0; i < CIDs.length; i += maxLinkPerNode) {
|
|
30
|
+
const chunk = CIDs.slice(i, i + maxLinkPerNode);
|
|
31
|
+
const node = createFileInlinkIpldNode(chunk, chunk.length, depth, chunkSize);
|
|
32
|
+
const cid = cidOfNode(node);
|
|
33
|
+
nodes.set(cid, node);
|
|
34
|
+
newCIDs.push(cid);
|
|
35
|
+
}
|
|
36
|
+
depth++;
|
|
37
|
+
CIDs = newCIDs;
|
|
38
|
+
}
|
|
39
|
+
const head = createChunkedFileIpldNode(CIDs, file.length, depth, filename, chunkSize);
|
|
40
|
+
const headCID = cidOfNode(head);
|
|
41
|
+
nodes.set(headCID, head);
|
|
42
|
+
return {
|
|
43
|
+
headCID,
|
|
44
|
+
nodes,
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
export const createFolderIPLDDag = (children, name, size, { maxLinkPerNode } = { maxLinkPerNode: DEFAULT_MAX_LINK_PER_NODE }) => {
|
|
48
|
+
const nodes = new Map();
|
|
49
|
+
let cids = children;
|
|
50
|
+
let depth = 0;
|
|
51
|
+
while (cids.length > maxLinkPerNode) {
|
|
52
|
+
const newCIDs = [];
|
|
53
|
+
for (let i = 0; i < cids.length; i += maxLinkPerNode) {
|
|
54
|
+
const chunk = cids.slice(i, i + maxLinkPerNode);
|
|
55
|
+
const node = createFolderInlinkIpldNode(chunk, depth);
|
|
56
|
+
const cid = cidOfNode(node);
|
|
57
|
+
nodes.set(cid, node);
|
|
58
|
+
newCIDs.push(cid);
|
|
59
|
+
}
|
|
60
|
+
cids = newCIDs;
|
|
61
|
+
depth++;
|
|
62
|
+
}
|
|
63
|
+
const node = createFolderIpldNode(cids, name, depth, size);
|
|
64
|
+
const cid = cidOfNode(node);
|
|
65
|
+
nodes.set(cid, node);
|
|
66
|
+
return {
|
|
67
|
+
headCID: cid,
|
|
68
|
+
nodes,
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
export const ensureNodeMaxSize = (node, maxSize = DEFAULT_MAX_CHUNK_SIZE) => {
|
|
72
|
+
const nodeSize = encodeNode(node).byteLength;
|
|
73
|
+
if (nodeSize > maxSize) {
|
|
74
|
+
throw new Error(`Node is too large to fit in a single chunk: ${nodeSize} > ${maxSize}`);
|
|
75
|
+
}
|
|
76
|
+
return node;
|
|
77
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ipld/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { PBNode } from '@ipld/dag-pb';
|
|
2
|
+
import { CID } from 'multiformats/cid';
|
|
3
|
+
import { OffchainMetadata } from '../metadata/index.js';
|
|
4
|
+
export declare const createChunkIpldNode: (data: Buffer) => PBNode;
|
|
5
|
+
export declare const createChunkedFileIpldNode: (links: CID[], size: number, linkDepth: number, name?: string, maxNodeSize?: number) => PBNode;
|
|
6
|
+
export declare const createFileInlinkIpldNode: (links: CID[], size: number, linkDepth: number, maxNodeSize?: number) => PBNode;
|
|
7
|
+
export declare const createSingleFileIpldNode: (data: Buffer, name?: string) => PBNode;
|
|
8
|
+
export declare const createFolderIpldNode: (links: CID[], name: string, linkDepth: number, size: number, maxNodeSize?: number) => PBNode;
|
|
9
|
+
export declare const createFolderInlinkIpldNode: (links: CID[], linkDepth: number, maxNodeSize?: number) => PBNode;
|
|
10
|
+
export declare const createMetadataNode: (metadata: OffchainMetadata, maxNodeSize?: number) => PBNode;
|
|
11
|
+
//# sourceMappingURL=nodes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../src/ipld/nodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,MAAM,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAKvD,eAAO,MAAM,mBAAmB,SAAU,MAAM,KAAG,MAShD,CAAA;AAKH,eAAO,MAAM,yBAAyB,UAC7B,GAAG,EAAE,QACN,MAAM,aACD,MAAM,SACV,MAAM,gBACA,MAAM,KAClB,MAYA,CAAA;AAIH,eAAO,MAAM,wBAAwB,UAC5B,GAAG,EAAE,QACN,MAAM,aACD,MAAM,gBACJ,MAAM,KAClB,MAWA,CAAA;AAKH,eAAO,MAAM,wBAAwB,SAAU,MAAM,SAAS,MAAM,KAAG,MAUpE,CAAA;AAKH,eAAO,MAAM,oBAAoB,UACxB,GAAG,EAAE,QACN,MAAM,aACD,MAAM,QACX,MAAM,gBACC,MAAM,KAClB,MAYA,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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { createNode } from '@ipld/dag-pb';
|
|
2
|
+
import { encodeIPLDNodeData, MetadataType } from '../metadata/onchain/index.js';
|
|
3
|
+
import { DEFAULT_MAX_CHUNK_SIZE, ensureNodeMaxSize } from './chunker.js';
|
|
4
|
+
/// Creates a chunk ipld node
|
|
5
|
+
export const createChunkIpldNode = (data) => createNode(encodeIPLDNodeData({
|
|
6
|
+
type: MetadataType.FileChunk,
|
|
7
|
+
size: data.length,
|
|
8
|
+
linkDepth: 0,
|
|
9
|
+
data,
|
|
10
|
+
}), []);
|
|
11
|
+
// Creates a file ipld node
|
|
12
|
+
// links: the CIDs of the file's contents
|
|
13
|
+
// @todo: add the file's metadata
|
|
14
|
+
export const createChunkedFileIpldNode = (links, size, linkDepth, name, maxNodeSize = DEFAULT_MAX_CHUNK_SIZE) => ensureNodeMaxSize(createNode(encodeIPLDNodeData({
|
|
15
|
+
type: MetadataType.File,
|
|
16
|
+
name,
|
|
17
|
+
size,
|
|
18
|
+
linkDepth,
|
|
19
|
+
}), links.map((cid) => ({ Hash: cid }))), maxNodeSize);
|
|
20
|
+
// Creates a file ipld node
|
|
21
|
+
// links: the CIDs of the file's contents
|
|
22
|
+
// @todo: add the file's metadata
|
|
23
|
+
export const createFileInlinkIpldNode = (links, size, linkDepth, maxNodeSize = DEFAULT_MAX_CHUNK_SIZE) => ensureNodeMaxSize(createNode(encodeIPLDNodeData({
|
|
24
|
+
type: MetadataType.FileInlink,
|
|
25
|
+
size,
|
|
26
|
+
linkDepth,
|
|
27
|
+
}), links.map((cid) => ({ Hash: cid }))), maxNodeSize);
|
|
28
|
+
// Creates a file ipld node
|
|
29
|
+
// links: the CIDs of the file's contents
|
|
30
|
+
// @todo: add the file's metadata
|
|
31
|
+
export const createSingleFileIpldNode = (data, name) => createNode(encodeIPLDNodeData({
|
|
32
|
+
type: MetadataType.File,
|
|
33
|
+
name,
|
|
34
|
+
size: data.length,
|
|
35
|
+
linkDepth: 0,
|
|
36
|
+
data,
|
|
37
|
+
}), []);
|
|
38
|
+
// Creates a folder ipld node
|
|
39
|
+
// links: the CIDs of the folder's contents
|
|
40
|
+
// @todo: add the folder's metadata
|
|
41
|
+
export const createFolderIpldNode = (links, name, linkDepth, size, maxNodeSize = DEFAULT_MAX_CHUNK_SIZE) => ensureNodeMaxSize(createNode(encodeIPLDNodeData({
|
|
42
|
+
type: MetadataType.Folder,
|
|
43
|
+
name,
|
|
44
|
+
size,
|
|
45
|
+
linkDepth,
|
|
46
|
+
}), links.map((cid) => ({ Hash: cid }))), maxNodeSize);
|
|
47
|
+
export const createFolderInlinkIpldNode = (links, linkDepth, maxNodeSize = DEFAULT_MAX_CHUNK_SIZE) => ensureNodeMaxSize(createNode(encodeIPLDNodeData({
|
|
48
|
+
type: MetadataType.FolderInlink,
|
|
49
|
+
linkDepth,
|
|
50
|
+
}), links.map((cid) => ({ Hash: cid }))), maxNodeSize);
|
|
51
|
+
/// Creates a metadata ipld node
|
|
52
|
+
export const createMetadataNode = (metadata, maxNodeSize = DEFAULT_MAX_CHUNK_SIZE) => {
|
|
53
|
+
const data = Buffer.from(JSON.stringify(metadata));
|
|
54
|
+
return ensureNodeMaxSize(createNode(encodeIPLDNodeData({
|
|
55
|
+
type: MetadataType.Metadata,
|
|
56
|
+
name: metadata.name,
|
|
57
|
+
linkDepth: 0,
|
|
58
|
+
data,
|
|
59
|
+
})), maxNodeSize);
|
|
60
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { PBNode } from '@ipld/dag-pb';
|
|
2
|
+
export declare const chunkBuffer: (buffer: Buffer, chunkSize: number) => Buffer[];
|
|
3
|
+
export declare const encodeNode: (node: PBNode) => Buffer;
|
|
4
|
+
export declare const decodeNode: (data: Uint8Array) => PBNode;
|
|
5
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/ipld/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,MAAM,EAAE,MAAM,cAAc,CAAA;AAErD,eAAO,MAAM,WAAW,WAAY,MAAM,aAAa,MAAM,aAQ5D,CAAA;AAED,eAAO,MAAM,UAAU,SAAU,MAAM,KAAG,MAAmC,CAAA;AAE7E,eAAO,MAAM,UAAU,SAAU,UAAU,KAAG,MAAsB,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { decode, encode } from '@ipld/dag-pb';
|
|
2
|
+
export const chunkBuffer = (buffer, chunkSize) => {
|
|
3
|
+
const chunks = [];
|
|
4
|
+
for (let i = 0; i < buffer.length; i += chunkSize) {
|
|
5
|
+
chunks.push(Buffer.from(buffer.buffer.slice(i, i + chunkSize)));
|
|
6
|
+
}
|
|
7
|
+
return chunks;
|
|
8
|
+
};
|
|
9
|
+
export const encodeNode = (node) => Buffer.from(encode(node));
|
|
10
|
+
export const decodeNode = (data) => decode(data);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/metadata/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/metadata/offchain/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAEpD,MAAM,MAAM,gBAAgB,GAAG,sBAAsB,GAAG,oBAAoB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { IPLDDag } from '../../index.js';
|
|
2
|
+
export type OffchainFileMetadata = {
|
|
3
|
+
type: 'file';
|
|
4
|
+
dataCid: string;
|
|
5
|
+
name?: string;
|
|
6
|
+
mimeType?: string;
|
|
7
|
+
totalSize: number;
|
|
8
|
+
totalChunks: number;
|
|
9
|
+
chunks: ChunkInfo[];
|
|
10
|
+
};
|
|
11
|
+
export interface ChunkInfo {
|
|
12
|
+
size: number;
|
|
13
|
+
cid: string;
|
|
14
|
+
}
|
|
15
|
+
export declare const fileMetadata: (dag: IPLDDag, totalSize: number, name?: string, mimeType?: string) => OffchainFileMetadata;
|
|
16
|
+
//# sourceMappingURL=file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../../src/metadata/offchain/file.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAEhE,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,SAAS,EAAE,CAAA;CACpB,CAAA;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,eAAO,MAAM,YAAY,QAClB,OAAO,aACD,MAAM,SACV,MAAM,aACF,MAAM,KAChB,oBAaF,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { cidOfNode, cidToString } from '../../index.js';
|
|
2
|
+
export const fileMetadata = (dag, totalSize, name, mimeType) => {
|
|
3
|
+
return {
|
|
4
|
+
type: 'file',
|
|
5
|
+
dataCid: cidToString(dag.headCID),
|
|
6
|
+
name,
|
|
7
|
+
mimeType,
|
|
8
|
+
totalSize,
|
|
9
|
+
totalChunks: dag.nodes.size,
|
|
10
|
+
chunks: Array.from(dag.nodes.values()).map((chunk) => {
|
|
11
|
+
var _a, _b;
|
|
12
|
+
return ({
|
|
13
|
+
cid: cidToString(cidOfNode(chunk)),
|
|
14
|
+
size: (_b = (_a = chunk.Data) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0,
|
|
15
|
+
});
|
|
16
|
+
}),
|
|
17
|
+
};
|
|
18
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface ChildrenMetadata {
|
|
2
|
+
type: 'folder' | 'file';
|
|
3
|
+
name?: string;
|
|
4
|
+
cid: string;
|
|
5
|
+
totalSize: number;
|
|
6
|
+
}
|
|
7
|
+
export type OffchainFolderMetadata = {
|
|
8
|
+
type: 'folder';
|
|
9
|
+
dataCid: string;
|
|
10
|
+
name?: string;
|
|
11
|
+
totalSize: number;
|
|
12
|
+
totalFiles: number;
|
|
13
|
+
children: ChildrenMetadata[];
|
|
14
|
+
};
|
|
15
|
+
export declare const folderMetadata: (cid: string, children: ChildrenMetadata[]) => OffchainFolderMetadata;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=folder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folder.d.ts","sourceRoot":"","sources":["../../../src/metadata/offchain/folder.ts"],"names":[],"mappings":"AAAA,UAAU,gBAAgB;IACxB,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAA;IACvB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,QAAQ,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,gBAAgB,EAAE,CAAA;CAC7B,CAAA;AAED,eAAO,MAAM,cAAc,QACpB,MAAM,YACD,gBAAgB,EAAE,KAC3B,sBAQF,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/metadata/offchain/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,aAAa,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/metadata/onchain/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAA;AAC5C,cAAc,YAAY,CAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type Codec, type DecodeOptions } from 'protons-runtime';
|
|
2
|
+
import type { Uint8ArrayList } from 'uint8arraylist';
|
|
3
|
+
export interface IPLDNodeData {
|
|
4
|
+
type: MetadataType;
|
|
5
|
+
linkDepth: number;
|
|
6
|
+
size?: number;
|
|
7
|
+
name?: string;
|
|
8
|
+
data?: Uint8Array;
|
|
9
|
+
}
|
|
10
|
+
export declare namespace IPLDNodeData {
|
|
11
|
+
const codec: () => Codec<IPLDNodeData>;
|
|
12
|
+
const encode: (obj: Partial<IPLDNodeData>) => Uint8Array;
|
|
13
|
+
const decode: (buf: Uint8Array | Uint8ArrayList, opts?: DecodeOptions<IPLDNodeData>) => IPLDNodeData;
|
|
14
|
+
}
|
|
15
|
+
export declare enum MetadataType {
|
|
16
|
+
File = "File",
|
|
17
|
+
FileInlink = "FileInlink",
|
|
18
|
+
FileChunk = "FileChunk",
|
|
19
|
+
Folder = "Folder",
|
|
20
|
+
FolderInlink = "FolderInlink",
|
|
21
|
+
Metadata = "Metadata"
|
|
22
|
+
}
|
|
23
|
+
export declare namespace MetadataType {
|
|
24
|
+
const codec: () => Codec<MetadataType>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=OnchainMetadat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OnchainMetadat.d.ts","sourceRoot":"","sources":["../../../../src/metadata/onchain/protobuf/OnchainMetadat.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,KAAK,EAAiB,KAAK,aAAa,EAAuC,MAAM,iBAAiB,CAAA;AACpH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,YAAY,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,UAAU,CAAA;CAClB;AAED,yBAAiB,YAAY,CAAC;IAGrB,MAAM,KAAK,QAAO,KAAK,CAAC,YAAY,CA+E1C,CAAA;IAEM,MAAM,MAAM,QAAS,OAAO,CAAC,YAAY,CAAC,KAAG,UAEnD,CAAA;IAEM,MAAM,MAAM,QAAS,UAAU,GAAG,cAAc,SAAS,aAAa,CAAC,YAAY,CAAC,KAAG,YAE7F,CAAA;CACF;AAED,oBAAY,YAAY;IACtB,IAAI,SAAS;IACb,UAAU,eAAe;IACzB,SAAS,cAAc;IACvB,MAAM,WAAW;IACjB,YAAY,iBAAiB;IAC7B,QAAQ,aAAa;CACtB;AAWD,yBAAiB,YAAY,CAAC;IACrB,MAAM,KAAK,QAAO,KAAK,CAAC,YAAY,CAE1C,CAAA;CACF"}
|
|
@@ -0,0 +1,108 @@
|
|
|
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
|
+
import { decodeMessage, encodeMessage, enumeration, message } from 'protons-runtime';
|
|
7
|
+
export var IPLDNodeData;
|
|
8
|
+
(function (IPLDNodeData) {
|
|
9
|
+
let _codec;
|
|
10
|
+
IPLDNodeData.codec = () => {
|
|
11
|
+
if (_codec == null) {
|
|
12
|
+
_codec = message((obj, w, opts = {}) => {
|
|
13
|
+
if (opts.lengthDelimited !== false) {
|
|
14
|
+
w.fork();
|
|
15
|
+
}
|
|
16
|
+
if (obj.type != null && __MetadataTypeValues[obj.type] !== 0) {
|
|
17
|
+
w.uint32(8);
|
|
18
|
+
MetadataType.codec().encode(obj.type, w);
|
|
19
|
+
}
|
|
20
|
+
if ((obj.linkDepth != null && obj.linkDepth !== 0)) {
|
|
21
|
+
w.uint32(16);
|
|
22
|
+
w.int32(obj.linkDepth);
|
|
23
|
+
}
|
|
24
|
+
if (obj.size != null) {
|
|
25
|
+
w.uint32(24);
|
|
26
|
+
w.int32(obj.size);
|
|
27
|
+
}
|
|
28
|
+
if (obj.name != null) {
|
|
29
|
+
w.uint32(34);
|
|
30
|
+
w.string(obj.name);
|
|
31
|
+
}
|
|
32
|
+
if (obj.data != null) {
|
|
33
|
+
w.uint32(42);
|
|
34
|
+
w.bytes(obj.data);
|
|
35
|
+
}
|
|
36
|
+
if (opts.lengthDelimited !== false) {
|
|
37
|
+
w.ldelim();
|
|
38
|
+
}
|
|
39
|
+
}, (reader, length, opts = {}) => {
|
|
40
|
+
const obj = {
|
|
41
|
+
type: MetadataType.File,
|
|
42
|
+
linkDepth: 0
|
|
43
|
+
};
|
|
44
|
+
const end = length == null ? reader.len : reader.pos + length;
|
|
45
|
+
while (reader.pos < end) {
|
|
46
|
+
const tag = reader.uint32();
|
|
47
|
+
switch (tag >>> 3) {
|
|
48
|
+
case 1: {
|
|
49
|
+
obj.type = MetadataType.codec().decode(reader);
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
case 2: {
|
|
53
|
+
obj.linkDepth = reader.int32();
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
case 3: {
|
|
57
|
+
obj.size = reader.int32();
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
case 4: {
|
|
61
|
+
obj.name = reader.string();
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
case 5: {
|
|
65
|
+
obj.data = reader.bytes();
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
default: {
|
|
69
|
+
reader.skipType(tag & 7);
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return obj;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return _codec;
|
|
78
|
+
};
|
|
79
|
+
IPLDNodeData.encode = (obj) => {
|
|
80
|
+
return encodeMessage(obj, IPLDNodeData.codec());
|
|
81
|
+
};
|
|
82
|
+
IPLDNodeData.decode = (buf, opts) => {
|
|
83
|
+
return decodeMessage(buf, IPLDNodeData.codec(), opts);
|
|
84
|
+
};
|
|
85
|
+
})(IPLDNodeData || (IPLDNodeData = {}));
|
|
86
|
+
export var MetadataType;
|
|
87
|
+
(function (MetadataType) {
|
|
88
|
+
MetadataType["File"] = "File";
|
|
89
|
+
MetadataType["FileInlink"] = "FileInlink";
|
|
90
|
+
MetadataType["FileChunk"] = "FileChunk";
|
|
91
|
+
MetadataType["Folder"] = "Folder";
|
|
92
|
+
MetadataType["FolderInlink"] = "FolderInlink";
|
|
93
|
+
MetadataType["Metadata"] = "Metadata";
|
|
94
|
+
})(MetadataType || (MetadataType = {}));
|
|
95
|
+
var __MetadataTypeValues;
|
|
96
|
+
(function (__MetadataTypeValues) {
|
|
97
|
+
__MetadataTypeValues[__MetadataTypeValues["File"] = 0] = "File";
|
|
98
|
+
__MetadataTypeValues[__MetadataTypeValues["FileInlink"] = 1] = "FileInlink";
|
|
99
|
+
__MetadataTypeValues[__MetadataTypeValues["FileChunk"] = 2] = "FileChunk";
|
|
100
|
+
__MetadataTypeValues[__MetadataTypeValues["Folder"] = 3] = "Folder";
|
|
101
|
+
__MetadataTypeValues[__MetadataTypeValues["FolderInlink"] = 4] = "FolderInlink";
|
|
102
|
+
__MetadataTypeValues[__MetadataTypeValues["Metadata"] = 5] = "Metadata";
|
|
103
|
+
})(__MetadataTypeValues || (__MetadataTypeValues = {}));
|
|
104
|
+
(function (MetadataType) {
|
|
105
|
+
MetadataType.codec = () => {
|
|
106
|
+
return enumeration(__MetadataTypeValues);
|
|
107
|
+
};
|
|
108
|
+
})(MetadataType || (MetadataType = {}));
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type Codec, type DecodeOptions } from 'protons-runtime';
|
|
2
|
+
import type { Uint8ArrayList } from 'uint8arraylist';
|
|
3
|
+
export interface IPLDNodeData {
|
|
4
|
+
type: MetadataType;
|
|
5
|
+
linkDepth: number;
|
|
6
|
+
size?: number;
|
|
7
|
+
name?: string;
|
|
8
|
+
data?: Uint8Array;
|
|
9
|
+
}
|
|
10
|
+
export declare namespace IPLDNodeData {
|
|
11
|
+
const codec: () => Codec<IPLDNodeData>;
|
|
12
|
+
const encode: (obj: Partial<IPLDNodeData>) => Uint8Array;
|
|
13
|
+
const decode: (buf: Uint8Array | Uint8ArrayList, opts?: DecodeOptions<IPLDNodeData>) => IPLDNodeData;
|
|
14
|
+
}
|
|
15
|
+
export declare enum MetadataType {
|
|
16
|
+
File = "File",
|
|
17
|
+
FileInlink = "FileInlink",
|
|
18
|
+
FileChunk = "FileChunk",
|
|
19
|
+
Folder = "Folder",
|
|
20
|
+
FolderInlink = "FolderInlink",
|
|
21
|
+
Metadata = "Metadata"
|
|
22
|
+
}
|
|
23
|
+
export declare namespace MetadataType {
|
|
24
|
+
const codec: () => Codec<MetadataType>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=OnchainMetadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OnchainMetadata.d.ts","sourceRoot":"","sources":["../../../../src/metadata/onchain/protobuf/OnchainMetadata.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,KAAK,EAAiB,KAAK,aAAa,EAAuC,MAAM,iBAAiB,CAAA;AACpH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,YAAY,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,UAAU,CAAA;CAClB;AAED,yBAAiB,YAAY,CAAC;IAGrB,MAAM,KAAK,QAAO,KAAK,CAAC,YAAY,CA+E1C,CAAA;IAEM,MAAM,MAAM,QAAS,OAAO,CAAC,YAAY,CAAC,KAAG,UAEnD,CAAA;IAEM,MAAM,MAAM,QAAS,UAAU,GAAG,cAAc,SAAS,aAAa,CAAC,YAAY,CAAC,KAAG,YAE7F,CAAA;CACF;AAED,oBAAY,YAAY;IACtB,IAAI,SAAS;IACb,UAAU,eAAe;IACzB,SAAS,cAAc;IACvB,MAAM,WAAW;IACjB,YAAY,iBAAiB;IAC7B,QAAQ,aAAa;CACtB;AAWD,yBAAiB,YAAY,CAAC;IACrB,MAAM,KAAK,QAAO,KAAK,CAAC,YAAY,CAE1C,CAAA;CACF"}
|