@helia/unixfs 0.0.0 → 1.0.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 +10 -4
- package/dist/index.min.js +1 -1
- package/dist/src/commands/cat.d.ts +1 -1
- package/dist/src/commands/cat.d.ts.map +1 -1
- package/dist/src/commands/cat.js +1 -1
- package/dist/src/commands/cat.js.map +1 -1
- package/dist/src/commands/chmod.d.ts.map +1 -1
- package/dist/src/commands/chmod.js +12 -7
- package/dist/src/commands/chmod.js.map +1 -1
- package/dist/src/commands/cp.d.ts +1 -1
- package/dist/src/commands/cp.d.ts.map +1 -1
- package/dist/src/commands/cp.js +5 -2
- package/dist/src/commands/cp.js.map +1 -1
- package/dist/src/commands/ls.d.ts +2 -1
- package/dist/src/commands/ls.d.ts.map +1 -1
- package/dist/src/commands/ls.js +1 -1
- package/dist/src/commands/ls.js.map +1 -1
- package/dist/src/commands/mkdir.d.ts.map +1 -1
- package/dist/src/commands/mkdir.js +4 -2
- package/dist/src/commands/mkdir.js.map +1 -1
- package/dist/src/commands/rm.d.ts +1 -1
- package/dist/src/commands/rm.d.ts.map +1 -1
- package/dist/src/commands/rm.js +9 -3
- package/dist/src/commands/rm.js.map +1 -1
- package/dist/src/commands/stat.d.ts +1 -1
- package/dist/src/commands/stat.d.ts.map +1 -1
- package/dist/src/commands/stat.js +19 -15
- package/dist/src/commands/stat.js.map +1 -1
- package/dist/src/commands/touch.d.ts.map +1 -1
- package/dist/src/commands/touch.js +13 -8
- package/dist/src/commands/touch.js.map +1 -1
- package/dist/src/commands/utils/add-link.d.ts +4 -2
- package/dist/src/commands/utils/add-link.d.ts.map +1 -1
- package/dist/src/commands/utils/add-link.js +24 -24
- package/dist/src/commands/utils/add-link.js.map +1 -1
- package/dist/src/commands/utils/cid-to-directory.d.ts +3 -3
- package/dist/src/commands/utils/cid-to-directory.d.ts.map +1 -1
- package/dist/src/commands/utils/cid-to-directory.js +1 -1
- package/dist/src/commands/utils/cid-to-directory.js.map +1 -1
- package/dist/src/commands/utils/cid-to-pblink.d.ts +3 -3
- package/dist/src/commands/utils/cid-to-pblink.d.ts.map +1 -1
- package/dist/src/commands/utils/cid-to-pblink.js.map +1 -1
- package/dist/src/commands/utils/constants.d.ts +2 -0
- package/dist/src/commands/utils/constants.d.ts.map +1 -0
- package/dist/src/commands/utils/constants.js +2 -0
- package/dist/src/commands/utils/constants.js.map +1 -0
- package/dist/src/commands/utils/dir-sharded.d.ts +47 -41
- package/dist/src/commands/utils/dir-sharded.d.ts.map +1 -1
- package/dist/src/commands/utils/dir-sharded.js +99 -15
- package/dist/src/commands/utils/dir-sharded.js.map +1 -1
- package/dist/src/commands/utils/errors.d.ts +22 -6
- package/dist/src/commands/utils/errors.d.ts.map +1 -1
- package/dist/src/commands/utils/errors.js +34 -8
- package/dist/src/commands/utils/errors.js.map +1 -1
- package/dist/src/commands/utils/hamt-constants.d.ts +1 -1
- package/dist/src/commands/utils/hamt-constants.d.ts.map +1 -1
- package/dist/src/commands/utils/hamt-constants.js +1 -1
- package/dist/src/commands/utils/hamt-constants.js.map +1 -1
- package/dist/src/commands/utils/hamt-utils.d.ts +15 -12
- package/dist/src/commands/utils/hamt-utils.d.ts.map +1 -1
- package/dist/src/commands/utils/hamt-utils.js +40 -39
- package/dist/src/commands/utils/hamt-utils.js.map +1 -1
- package/dist/src/commands/utils/is-over-shard-threshold.d.ts +10 -0
- package/dist/src/commands/utils/is-over-shard-threshold.d.ts.map +1 -0
- package/dist/src/commands/utils/is-over-shard-threshold.js +62 -0
- package/dist/src/commands/utils/is-over-shard-threshold.js.map +1 -0
- package/dist/src/commands/utils/persist.d.ts +7 -6
- package/dist/src/commands/utils/persist.d.ts.map +1 -1
- package/dist/src/commands/utils/persist.js +6 -3
- package/dist/src/commands/utils/persist.js.map +1 -1
- package/dist/src/commands/utils/remove-link.d.ts +6 -2
- package/dist/src/commands/utils/remove-link.d.ts.map +1 -1
- package/dist/src/commands/utils/remove-link.js +143 -55
- package/dist/src/commands/utils/remove-link.js.map +1 -1
- package/dist/src/commands/utils/resolve.d.ts +6 -3
- package/dist/src/commands/utils/resolve.d.ts.map +1 -1
- package/dist/src/commands/utils/resolve.js +4 -4
- package/dist/src/commands/utils/resolve.js.map +1 -1
- package/dist/src/index.d.ts +14 -7
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +0 -7
- package/dist/src/index.js.map +1 -1
- package/dist/typedoc-urls.json +14 -0
- package/package.json +8 -7
- package/src/commands/cat.ts +3 -2
- package/src/commands/chmod.ts +12 -7
- package/src/commands/cp.ts +7 -4
- package/src/commands/ls.ts +4 -3
- package/src/commands/mkdir.ts +5 -3
- package/src/commands/rm.ts +9 -5
- package/src/commands/stat.ts +22 -17
- package/src/commands/touch.ts +14 -9
- package/src/commands/utils/add-link.ts +32 -31
- package/src/commands/utils/cid-to-directory.ts +4 -4
- package/src/commands/utils/cid-to-pblink.ts +3 -3
- package/src/commands/utils/constants.ts +2 -0
- package/src/commands/utils/dir-sharded.ts +162 -63
- package/src/commands/utils/errors.ts +42 -8
- package/src/commands/utils/hamt-constants.ts +1 -1
- package/src/commands/utils/hamt-utils.ts +59 -50
- package/src/commands/utils/is-over-shard-threshold.ts +78 -0
- package/src/commands/utils/persist.ts +13 -8
- package/src/commands/utils/remove-link.ts +178 -77
- package/src/commands/utils/resolve.ts +12 -7
- package/src/index.ts +15 -17
- package/dist/src/commands/add.d.ts +0 -6
- package/dist/src/commands/add.d.ts.map +0 -1
- package/dist/src/commands/add.js +0 -38
- package/dist/src/commands/add.js.map +0 -1
- package/src/commands/add.ts +0 -46
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/commands/utils/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/commands/utils/errors.ts"],"names":[],"mappings":"AAAA,8BAAsB,WAAY,SAAQ,KAAK;IAC7C,SAAgB,IAAI,EAAE,MAAM,CAAA;IAC5B,SAAgB,IAAI,EAAE,MAAM,CAAA;gBAEf,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAMzD;AAED,qBAAa,cAAe,SAAQ,WAAW;gBAChC,OAAO,SAAsB;CAG3C;AAED,qBAAa,kBAAmB,SAAQ,WAAW;gBACpC,OAAO,SAAmB;CAGxC;AAED,qBAAa,YAAa,SAAQ,WAAW;gBAC9B,OAAO,SAAkB;CAGvC;AAED,qBAAa,kBAAmB,SAAQ,WAAW;gBACpC,OAAO,SAAwB;CAG7C;AAED,qBAAa,iBAAkB,SAAQ,WAAW;gBACnC,OAAO,SAAwB;CAG7C;AAED,qBAAa,cAAe,SAAQ,WAAW;gBAChC,OAAO,SAAe;CAGpC;AAED,qBAAa,aAAc,SAAQ,WAAW;gBAC/B,OAAO,SAAe;CAGpC;AAED,qBAAa,kBAAmB,SAAQ,WAAW;gBACpC,OAAO,SAAoB;CAGzC;AAED,qBAAa,sBAAuB,SAAQ,WAAW;gBACxC,OAAO,SAAuB;CAG5C"}
|
|
@@ -1,27 +1,53 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export class UnixFSError extends Error {
|
|
2
|
+
constructor(message, name, code) {
|
|
3
|
+
super(message);
|
|
4
|
+
this.name = name;
|
|
5
|
+
this.code = code;
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export class NotUnixFSError extends UnixFSError {
|
|
3
9
|
constructor(message = 'not a Unixfs node') {
|
|
4
10
|
super(message, 'NotUnixFSError', 'ERR_NOT_UNIXFS');
|
|
5
11
|
}
|
|
6
12
|
}
|
|
7
|
-
export class InvalidPBNodeError extends
|
|
13
|
+
export class InvalidPBNodeError extends UnixFSError {
|
|
8
14
|
constructor(message = 'invalid PBNode') {
|
|
9
15
|
super(message, 'InvalidPBNodeError', 'ERR_INVALID_PBNODE');
|
|
10
16
|
}
|
|
11
17
|
}
|
|
12
|
-
export class UnknownError extends
|
|
18
|
+
export class UnknownError extends UnixFSError {
|
|
13
19
|
constructor(message = 'unknown error') {
|
|
14
20
|
super(message, 'InvalidPBNodeError', 'ERR_UNKNOWN_ERROR');
|
|
15
21
|
}
|
|
16
22
|
}
|
|
17
|
-
export class AlreadyExistsError extends
|
|
23
|
+
export class AlreadyExistsError extends UnixFSError {
|
|
18
24
|
constructor(message = 'path already exists') {
|
|
19
|
-
super(message, '
|
|
25
|
+
super(message, 'AlreadyExistsError', 'ERR_ALREADY_EXISTS');
|
|
20
26
|
}
|
|
21
27
|
}
|
|
22
|
-
export class DoesNotExistError extends
|
|
28
|
+
export class DoesNotExistError extends UnixFSError {
|
|
23
29
|
constructor(message = 'path does not exist') {
|
|
24
|
-
super(message, '
|
|
30
|
+
super(message, 'DoesNotExistError', 'ERR_DOES_NOT_EXIST');
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export class NoContentError extends UnixFSError {
|
|
34
|
+
constructor(message = 'no content') {
|
|
35
|
+
super(message, 'NoContentError', 'ERR_NO_CONTENT');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export class NotAFileError extends UnixFSError {
|
|
39
|
+
constructor(message = 'not a file') {
|
|
40
|
+
super(message, 'NotAFileError', 'ERR_NOT_A_FILE');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export class NotADirectoryError extends UnixFSError {
|
|
44
|
+
constructor(message = 'not a directory') {
|
|
45
|
+
super(message, 'NotADirectoryError', 'ERR_NOT_A_DIRECTORY');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export class InvalidParametersError extends UnixFSError {
|
|
49
|
+
constructor(message = 'invalid parameters') {
|
|
50
|
+
super(message, 'InvalidParametersError', 'ERR_INVALID_PARAMETERS');
|
|
25
51
|
}
|
|
26
52
|
}
|
|
27
53
|
//# sourceMappingURL=errors.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/commands/utils/errors.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/commands/utils/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAgB,WAAY,SAAQ,KAAK;IAI7C,YAAa,OAAe,EAAE,IAAY,EAAE,IAAY;QACtD,KAAK,CAAC,OAAO,CAAC,CAAA;QAEd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,WAAW;IAC7C,YAAa,OAAO,GAAG,mBAAmB;QACxC,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAA;IACpD,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,WAAW;IACjD,YAAa,OAAO,GAAG,gBAAgB;QACrC,KAAK,CAAC,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,CAAC,CAAA;IAC5D,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,WAAW;IAC3C,YAAa,OAAO,GAAG,eAAe;QACpC,KAAK,CAAC,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,CAAA;IAC3D,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,WAAW;IACjD,YAAa,OAAO,GAAG,qBAAqB;QAC1C,KAAK,CAAC,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,CAAC,CAAA;IAC5D,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,WAAW;IAChD,YAAa,OAAO,GAAG,qBAAqB;QAC1C,KAAK,CAAC,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,CAAC,CAAA;IAC3D,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,WAAW;IAC7C,YAAa,OAAO,GAAG,YAAY;QACjC,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,CAAA;IACpD,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,WAAW;IAC5C,YAAa,OAAO,GAAG,YAAY;QACjC,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAA;IACnD,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,WAAW;IACjD,YAAa,OAAO,GAAG,iBAAiB;QACtC,KAAK,CAAC,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,CAAC,CAAA;IAC7D,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,WAAW;IACrD,YAAa,OAAO,GAAG,oBAAoB;QACzC,KAAK,CAAC,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,CAAC,CAAA;IACpE,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hamt-constants.d.ts","sourceRoot":"","sources":["../../../../src/commands/utils/hamt-constants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"hamt-constants.d.ts","sourceRoot":"","sources":["../../../../src/commands/utils/hamt-constants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,QAA0B,CAAA;AACnD,eAAO,MAAM,cAAc,IAAI,CAAA;AAE/B,wBAAsB,UAAU,CAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAQtE"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { murmur3128 } from '@multiformats/murmur3';
|
|
2
|
-
export const hamtHashCode = murmur3128.code;
|
|
2
|
+
export const hamtHashCode = BigInt(murmur3128.code);
|
|
3
3
|
export const hamtBucketBits = 8;
|
|
4
4
|
export async function hamtHashFn(buf) {
|
|
5
5
|
return (await murmur3128.encode(buf))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hamt-constants.js","sourceRoot":"","sources":["../../../../src/commands/utils/hamt-constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAElD,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"hamt-constants.js","sourceRoot":"","sources":["../../../../src/commands/utils/hamt-constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAElD,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;AACnD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAA;AAE/B,MAAM,CAAC,KAAK,UAAU,UAAU,CAAE,GAAe;IAC/C,OAAO,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnC,uDAAuD;QACvD,gEAAgE;QAChE,eAAe;SACd,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;QACf,mDAAmD;SAClD,OAAO,EAAE,CAAA;AACd,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Bucket } from 'hamt-sharding';
|
|
2
|
-
import { CID } from 'multiformats/cid';
|
|
2
|
+
import type { CID, Version } from 'multiformats/cid';
|
|
3
3
|
import type { PBLink, PBNode } from '@ipld/dag-pb/interface';
|
|
4
4
|
import type { Blockstore } from 'interface-blockstore';
|
|
5
5
|
import type { Mtime } from 'ipfs-unixfs';
|
|
@@ -11,27 +11,30 @@ export interface UpdateHamtResult {
|
|
|
11
11
|
cid: CID;
|
|
12
12
|
size: number;
|
|
13
13
|
}
|
|
14
|
-
export
|
|
14
|
+
export interface UpdateHamtDirectoryOptions extends AbortOptions {
|
|
15
|
+
cidVersion: Version;
|
|
16
|
+
}
|
|
17
|
+
export declare const updateHamtDirectory: (pbNode: PBNode, blockstore: Blockstore, bucket: Bucket<any>, options: UpdateHamtDirectoryOptions) => Promise<UpdateHamtResult>;
|
|
15
18
|
export declare const recreateHamtLevel: (blockstore: Blockstore, links: PBLink[], rootBucket: Bucket<any>, parentBucket: Bucket<any>, positionAtParent: number, options: AbortOptions) => Promise<Bucket<any>>;
|
|
16
19
|
export declare const recreateInitialHamtLevel: (links: PBLink[]) => Promise<Bucket<any>>;
|
|
17
20
|
export declare const addLinksToHamtBucket: (blockstore: Blockstore, links: PBLink[], bucket: Bucket<any>, rootBucket: Bucket<any>, options: AbortOptions) => Promise<void>;
|
|
18
21
|
export declare const toPrefix: (position: number) => string;
|
|
19
|
-
export interface
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}>;
|
|
22
|
+
export interface HamtPathSegment {
|
|
23
|
+
bucket?: Bucket<any>;
|
|
24
|
+
prefix?: string;
|
|
25
|
+
node?: PBNode;
|
|
26
|
+
cid?: CID;
|
|
27
|
+
size?: number;
|
|
26
28
|
}
|
|
27
|
-
export declare const generatePath: (
|
|
29
|
+
export declare const generatePath: (root: Directory, name: string, blockstore: Blockstore, options: AbortOptions) => Promise<HamtPathSegment[]>;
|
|
28
30
|
export interface CreateShardOptions {
|
|
29
31
|
mtime?: Mtime;
|
|
30
32
|
mode?: number;
|
|
33
|
+
cidVersion: Version;
|
|
31
34
|
}
|
|
32
35
|
export declare const createShard: (blockstore: Blockstore, contents: Array<{
|
|
33
36
|
name: string;
|
|
34
|
-
size:
|
|
37
|
+
size: bigint;
|
|
35
38
|
cid: CID;
|
|
36
|
-
}>, options
|
|
39
|
+
}>, options: CreateShardOptions) => Promise<ImportResult>;
|
|
37
40
|
//# sourceMappingURL=hamt-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hamt-utils.d.ts","sourceRoot":"","sources":["../../../../src/commands/utils/hamt-utils.ts"],"names":[],"mappings":"AACA,OAAO,EACL,MAAM,EAEP,MAAM,eAAe,CAAA;AAKtB,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"hamt-utils.d.ts","sourceRoot":"","sources":["../../../../src/commands/utils/hamt-utils.ts"],"names":[],"mappings":"AACA,OAAO,EACL,MAAM,EAEP,MAAM,eAAe,CAAA;AAKtB,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAMpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAKxD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,GAAG,CAAA;IACR,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,0BAA2B,SAAQ,YAAY;IAC9D,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,eAAO,MAAM,mBAAmB,WAAkB,MAAM,cAAc,UAAU,UAAU,OAAO,GAAG,CAAC,WAAW,0BAA0B,KAAG,QAAQ,gBAAgB,CA6BpK,CAAA;AAED,eAAO,MAAM,iBAAiB,eAAsB,UAAU,SAAS,MAAM,EAAE,cAAc,OAAO,GAAG,CAAC,gBAAgB,OAAO,GAAG,CAAC,oBAAoB,MAAM,WAAW,YAAY,KAAG,QAAQ,OAAO,GAAG,CAAC,CAWzM,CAAA;AAED,eAAO,MAAM,wBAAwB,UAAiB,MAAM,EAAE,KAAG,QAAQ,OAAO,GAAG,CAAC,CA6BnF,CAAA;AAED,eAAO,MAAM,oBAAoB,eAAsB,UAAU,SAAS,MAAM,EAAE,UAAU,OAAO,GAAG,CAAC,cAAc,OAAO,GAAG,CAAC,WAAW,YAAY,KAAG,QAAQ,IAAI,CA0BrK,CAAA;AAED,eAAO,MAAM,QAAQ,aAAc,MAAM,KAAG,MAM3C,CAAA;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,GAAG,CAAA;IACT,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,eAAO,MAAM,YAAY,SAAgB,SAAS,QAAQ,MAAM,cAAc,UAAU,WAAW,YAAY,KAAG,QAAQ,eAAe,EAAE,CAwG1I,CAAA;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,eAAO,MAAM,WAAW,eAAsB,UAAU,YAAY,MAAM;IAAE,MAAM,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,GAAG,CAAA;CAAE,CAAC,WAAW,kBAAkB,KAAG,QAAQ,YAAY,CA2BtK,CAAA"}
|
|
@@ -4,37 +4,33 @@ import { DirSharded } from './dir-sharded.js';
|
|
|
4
4
|
import { logger } from '@libp2p/logger';
|
|
5
5
|
import { UnixFS } from 'ipfs-unixfs';
|
|
6
6
|
import last from 'it-last';
|
|
7
|
-
import { CID } from 'multiformats/cid';
|
|
8
7
|
import { hamtHashCode, hamtHashFn, hamtBucketBits } from './hamt-constants.js';
|
|
9
|
-
import {
|
|
8
|
+
import { persist } from './persist.js';
|
|
10
9
|
const log = logger('helia:unixfs:commands:utils:hamt-utils');
|
|
11
|
-
export const updateHamtDirectory = async (
|
|
12
|
-
if (
|
|
10
|
+
export const updateHamtDirectory = async (pbNode, blockstore, bucket, options) => {
|
|
11
|
+
if (pbNode.Data == null) {
|
|
13
12
|
throw new Error('Could not update HAMT directory because parent had no data');
|
|
14
13
|
}
|
|
15
14
|
// update parent with new bit field
|
|
16
|
-
const
|
|
17
|
-
const node = UnixFS.unmarshal(parent.node.Data);
|
|
15
|
+
const node = UnixFS.unmarshal(pbNode.Data);
|
|
18
16
|
const dir = new UnixFS({
|
|
19
17
|
type: 'hamt-sharded-directory',
|
|
20
|
-
data,
|
|
21
|
-
fanout: bucket.tableSize(),
|
|
18
|
+
data: Uint8Array.from(bucket._children.bitField().reverse()),
|
|
19
|
+
fanout: BigInt(bucket.tableSize()),
|
|
22
20
|
hashType: hamtHashCode,
|
|
23
21
|
mode: node.mode,
|
|
24
22
|
mtime: node.mtime
|
|
25
23
|
});
|
|
26
|
-
|
|
24
|
+
const updatedPbNode = {
|
|
27
25
|
Data: dir.marshal(),
|
|
28
|
-
Links:
|
|
26
|
+
Links: pbNode.Links
|
|
29
27
|
};
|
|
30
|
-
const buf = dagPB.encode(
|
|
31
|
-
const
|
|
32
|
-
const cid = CID.create(parent.cid.version, dagPB.code, hash);
|
|
33
|
-
await blockstore.put(cid, buf, options);
|
|
28
|
+
const buf = dagPB.encode(dagPB.prepare(updatedPbNode));
|
|
29
|
+
const cid = await persist(buf, blockstore, options);
|
|
34
30
|
return {
|
|
35
|
-
node:
|
|
31
|
+
node: updatedPbNode,
|
|
36
32
|
cid,
|
|
37
|
-
size:
|
|
33
|
+
size: pbNode.Links.reduce((sum, link) => sum + (link.Tsize ?? 0), buf.byteLength)
|
|
38
34
|
};
|
|
39
35
|
};
|
|
40
36
|
export const recreateHamtLevel = async (blockstore, links, rootBucket, parentBucket, positionAtParent, options) => {
|
|
@@ -52,7 +48,7 @@ export const recreateInitialHamtLevel = async (links) => {
|
|
|
52
48
|
hashFn: hamtHashFn,
|
|
53
49
|
bits: hamtBucketBits
|
|
54
50
|
});
|
|
55
|
-
// populate sub bucket but do not recurse as we do not want to
|
|
51
|
+
// populate sub bucket but do not recurse as we do not want to load the whole shard
|
|
56
52
|
await Promise.all(links.map(async (link) => {
|
|
57
53
|
const linkName = (link.Name ?? '');
|
|
58
54
|
if (linkName.length === 2) {
|
|
@@ -62,8 +58,6 @@ export const recreateInitialHamtLevel = async (links) => {
|
|
|
62
58
|
bits: bucket._options.bits
|
|
63
59
|
}, bucket, pos);
|
|
64
60
|
bucket._putObjectAt(pos, subBucket);
|
|
65
|
-
await Promise.resolve();
|
|
66
|
-
return;
|
|
67
61
|
}
|
|
68
62
|
await bucket.put(linkName.substring(2), {
|
|
69
63
|
size: link.Tsize,
|
|
@@ -86,8 +80,6 @@ export const addLinksToHamtBucket = async (blockstore, links, bucket, rootBucket
|
|
|
86
80
|
}, bucket, pos);
|
|
87
81
|
bucket._putObjectAt(pos, subBucket);
|
|
88
82
|
await addLinksToHamtBucket(blockstore, node.Links, subBucket, rootBucket, options);
|
|
89
|
-
await Promise.resolve();
|
|
90
|
-
return;
|
|
91
83
|
}
|
|
92
84
|
await rootBucket.put(linkName.substring(2), {
|
|
93
85
|
size: link.Tsize,
|
|
@@ -102,11 +94,10 @@ export const toPrefix = (position) => {
|
|
|
102
94
|
.padStart(2, '0')
|
|
103
95
|
.substring(0, 2);
|
|
104
96
|
};
|
|
105
|
-
export const generatePath = async (
|
|
97
|
+
export const generatePath = async (root, name, blockstore, options) => {
|
|
106
98
|
// start at the root bucket and descend, loading nodes as we go
|
|
107
|
-
const rootBucket = await recreateInitialHamtLevel(
|
|
99
|
+
const rootBucket = await recreateInitialHamtLevel(root.node.Links);
|
|
108
100
|
const position = await rootBucket._findNewBucketAndPos(name);
|
|
109
|
-
// the path to the root bucket
|
|
110
101
|
const path = [{
|
|
111
102
|
bucket: position.bucket,
|
|
112
103
|
prefix: toPrefix(position.pos)
|
|
@@ -117,19 +108,26 @@ export const generatePath = async (parent, name, blockstore, options) => {
|
|
|
117
108
|
bucket: currentBucket,
|
|
118
109
|
prefix: toPrefix(currentBucket._posAtParent)
|
|
119
110
|
});
|
|
120
|
-
|
|
111
|
+
if (currentBucket._parent == null) {
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
121
114
|
currentBucket = currentBucket._parent;
|
|
122
115
|
}
|
|
116
|
+
// add the root bucket to the path
|
|
117
|
+
path.push({
|
|
118
|
+
bucket: rootBucket,
|
|
119
|
+
node: root.node
|
|
120
|
+
});
|
|
123
121
|
path.reverse();
|
|
124
|
-
path[0].node = parent.node;
|
|
125
122
|
// load PbNode for each path segment
|
|
126
|
-
for (let i =
|
|
123
|
+
for (let i = 1; i < path.length; i++) {
|
|
127
124
|
const segment = path[i];
|
|
128
|
-
|
|
125
|
+
const previousSegment = path[i - 1];
|
|
126
|
+
if (previousSegment.node == null) {
|
|
129
127
|
throw new Error('Could not generate HAMT path');
|
|
130
128
|
}
|
|
131
129
|
// find prefix in links
|
|
132
|
-
const link =
|
|
130
|
+
const link = previousSegment.node.Links
|
|
133
131
|
.filter(link => (link.Name ?? '').substring(0, 2) === segment.prefix)
|
|
134
132
|
.pop();
|
|
135
133
|
// entry was not in shard
|
|
@@ -139,8 +137,9 @@ export const generatePath = async (parent, name, blockstore, options) => {
|
|
|
139
137
|
// return path
|
|
140
138
|
continue;
|
|
141
139
|
}
|
|
140
|
+
const linkName = link.Name ?? '';
|
|
142
141
|
// found entry
|
|
143
|
-
if (
|
|
142
|
+
if (linkName === `${segment.prefix}${name}`) {
|
|
144
143
|
log(`Link ${segment.prefix}${name} will be replaced`);
|
|
145
144
|
// file already existed, file will be added to the current bucket
|
|
146
145
|
// return path
|
|
@@ -148,11 +147,14 @@ export const generatePath = async (parent, name, blockstore, options) => {
|
|
|
148
147
|
}
|
|
149
148
|
// found subshard
|
|
150
149
|
log(`Found subshard ${segment.prefix}`);
|
|
151
|
-
const block = await blockstore.get(link.Hash
|
|
150
|
+
const block = await blockstore.get(link.Hash);
|
|
152
151
|
const node = dagPB.decode(block);
|
|
153
152
|
// subshard hasn't been loaded, descend to the next level of the HAMT
|
|
154
153
|
if (path[i + 1] == null) {
|
|
155
154
|
log(`Loaded new subshard ${segment.prefix}`);
|
|
155
|
+
if (segment.bucket == null || segment.prefix == null) {
|
|
156
|
+
throw new Error('Shard was invalid');
|
|
157
|
+
}
|
|
156
158
|
await recreateHamtLevel(blockstore, node.Links, rootBucket, segment.bucket, parseInt(segment.prefix, 16), options);
|
|
157
159
|
const position = await rootBucket._findNewBucketAndPos(name);
|
|
158
160
|
// i--
|
|
@@ -163,19 +165,18 @@ export const generatePath = async (parent, name, blockstore, options) => {
|
|
|
163
165
|
});
|
|
164
166
|
continue;
|
|
165
167
|
}
|
|
166
|
-
|
|
168
|
+
if (segment.bucket == null) {
|
|
169
|
+
throw new Error('Shard was invalid');
|
|
170
|
+
}
|
|
167
171
|
// add intermediate links to bucket
|
|
168
|
-
await addLinksToHamtBucket(blockstore, node.Links,
|
|
169
|
-
|
|
172
|
+
await addLinksToHamtBucket(blockstore, node.Links, segment.bucket, rootBucket, options);
|
|
173
|
+
segment.node = node;
|
|
170
174
|
}
|
|
171
175
|
await rootBucket.put(name, true);
|
|
172
176
|
path.reverse();
|
|
173
|
-
return
|
|
174
|
-
rootBucket,
|
|
175
|
-
path
|
|
176
|
-
};
|
|
177
|
+
return path;
|
|
177
178
|
};
|
|
178
|
-
export const createShard = async (blockstore, contents, options
|
|
179
|
+
export const createShard = async (blockstore, contents, options) => {
|
|
179
180
|
const shard = new DirSharded({
|
|
180
181
|
root: true,
|
|
181
182
|
dir: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hamt-utils.js","sourceRoot":"","sources":["../../../../src/commands/utils/hamt-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,EACL,MAAM,EACN,UAAU,EACX,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,IAAI,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"hamt-utils.js","sourceRoot":"","sources":["../../../../src/commands/utils/hamt-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { PBNode } from '@ipld/dag-pb';
|
|
2
|
+
import type { Blockstore } from 'interface-blockstore';
|
|
3
|
+
/**
|
|
4
|
+
* Estimate node size only based on DAGLink name and CID byte lengths
|
|
5
|
+
* https://github.com/ipfs/go-unixfsnode/blob/37b47f1f917f1b2f54c207682f38886e49896ef9/data/builder/directory.go#L81-L96
|
|
6
|
+
*
|
|
7
|
+
* If the node is a hamt sharded directory the calculation is based on if it was a regular directory.
|
|
8
|
+
*/
|
|
9
|
+
export declare function isOverShardThreshold(node: PBNode, blockstore: Blockstore, threshold: number): Promise<boolean>;
|
|
10
|
+
//# sourceMappingURL=is-over-shard-threshold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-over-shard-threshold.d.ts","sourceRoot":"","sources":["../../../../src/commands/utils/is-over-shard-threshold.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAKtD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBrH"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { UnixFS } from 'ipfs-unixfs';
|
|
2
|
+
import * as dagPb from '@ipld/dag-pb';
|
|
3
|
+
import { CID_V0, CID_V1 } from './dir-sharded.js';
|
|
4
|
+
/**
|
|
5
|
+
* Estimate node size only based on DAGLink name and CID byte lengths
|
|
6
|
+
* https://github.com/ipfs/go-unixfsnode/blob/37b47f1f917f1b2f54c207682f38886e49896ef9/data/builder/directory.go#L81-L96
|
|
7
|
+
*
|
|
8
|
+
* If the node is a hamt sharded directory the calculation is based on if it was a regular directory.
|
|
9
|
+
*/
|
|
10
|
+
export async function isOverShardThreshold(node, blockstore, threshold) {
|
|
11
|
+
if (node.Data == null) {
|
|
12
|
+
throw new Error('DagPB node had no data');
|
|
13
|
+
}
|
|
14
|
+
const unixfs = UnixFS.unmarshal(node.Data);
|
|
15
|
+
let size;
|
|
16
|
+
if (unixfs.type === 'directory') {
|
|
17
|
+
size = estimateNodeSize(node);
|
|
18
|
+
}
|
|
19
|
+
else if (unixfs.type === 'hamt-sharded-directory') {
|
|
20
|
+
size = await estimateShardSize(node, 0, threshold, blockstore);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
throw new Error('Can only estimate the size of directories or shards');
|
|
24
|
+
}
|
|
25
|
+
return size > threshold;
|
|
26
|
+
}
|
|
27
|
+
function estimateNodeSize(node) {
|
|
28
|
+
let size = 0;
|
|
29
|
+
// estimate size only based on DAGLink name and CID byte lengths
|
|
30
|
+
// https://github.com/ipfs/go-unixfsnode/blob/37b47f1f917f1b2f54c207682f38886e49896ef9/data/builder/directory.go#L81-L96
|
|
31
|
+
for (const link of node.Links) {
|
|
32
|
+
size += (link.Name ?? '').length;
|
|
33
|
+
size += link.Hash.version === 1 ? CID_V1.bytes.byteLength : CID_V0.bytes.byteLength;
|
|
34
|
+
}
|
|
35
|
+
return size;
|
|
36
|
+
}
|
|
37
|
+
async function estimateShardSize(node, current, max, blockstore) {
|
|
38
|
+
if (current > max) {
|
|
39
|
+
return max;
|
|
40
|
+
}
|
|
41
|
+
if (node.Data == null) {
|
|
42
|
+
return current;
|
|
43
|
+
}
|
|
44
|
+
const unixfs = UnixFS.unmarshal(node.Data);
|
|
45
|
+
if (!unixfs.isDirectory()) {
|
|
46
|
+
return current;
|
|
47
|
+
}
|
|
48
|
+
for (const link of node.Links) {
|
|
49
|
+
let name = link.Name ?? '';
|
|
50
|
+
// remove hamt hash prefix from name
|
|
51
|
+
name = name.substring(2);
|
|
52
|
+
current += name.length;
|
|
53
|
+
current += link.Hash.bytes.byteLength;
|
|
54
|
+
if (link.Hash.code === dagPb.code) {
|
|
55
|
+
const block = await blockstore.get(link.Hash);
|
|
56
|
+
const node = dagPb.decode(block);
|
|
57
|
+
current += await estimateShardSize(node, current, max, blockstore);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return current;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=is-over-shard-threshold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-over-shard-threshold.js","sourceRoot":"","sources":["../../../../src/commands/utils/is-over-shard-threshold.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAEjD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAE,IAAY,EAAE,UAAsB,EAAE,SAAiB;IACjG,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE;QACrB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;KAC1C;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC1C,IAAI,IAAY,CAAA;IAEhB,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE;QAC/B,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAA;KAC9B;SAAM,IAAI,MAAM,CAAC,IAAI,KAAK,wBAAwB,EAAE;QACnD,IAAI,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;KAC/D;SAAM;QACL,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAA;KACvE;IAED,OAAO,IAAI,GAAG,SAAS,CAAA;AACzB,CAAC;AAED,SAAS,gBAAgB,CAAE,IAAY;IACrC,IAAI,IAAI,GAAG,CAAC,CAAA;IAEZ,gEAAgE;IAChE,wHAAwH;IACxH,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;QAC7B,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAA;QAChC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAA;KACpF;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAE,IAAY,EAAE,OAAe,EAAE,GAAW,EAAE,UAAsB;IAClG,IAAI,OAAO,GAAG,GAAG,EAAE;QACjB,OAAO,GAAG,CAAA;KACX;IAED,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE;QACrB,OAAO,OAAO,CAAA;KACf;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAE1C,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE;QACzB,OAAO,OAAO,CAAA;KACf;IAED,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;QAC7B,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA;QAE1B,oCAAoC;QACpC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QAExB,OAAO,IAAI,IAAI,CAAC,MAAM,CAAA;QACtB,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAA;QAErC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE;YACjC,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAEhC,OAAO,IAAI,MAAM,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,CAAC,CAAA;SACnE;KACF;IAED,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { CID
|
|
2
|
-
import type { BlockCodec } from 'multiformats/codecs/interface';
|
|
3
|
-
import type { AbortOptions } from '@libp2p/interfaces';
|
|
1
|
+
import { CID } from 'multiformats/cid';
|
|
4
2
|
import type { Blockstore } from 'interface-blockstore';
|
|
5
|
-
|
|
3
|
+
import type { BlockCodec } from 'multiformats/codecs/interface';
|
|
4
|
+
import type { Version as CIDVersion } from 'multiformats/cid';
|
|
5
|
+
export interface PersistOptions {
|
|
6
6
|
codec?: BlockCodec<any, any>;
|
|
7
|
-
cidVersion
|
|
7
|
+
cidVersion: CIDVersion;
|
|
8
|
+
signal?: AbortSignal;
|
|
8
9
|
}
|
|
9
|
-
export declare const persist: (buffer: Uint8Array, blockstore: Blockstore, options
|
|
10
|
+
export declare const persist: (buffer: Uint8Array, blockstore: Blockstore, options: PersistOptions) => Promise<CID>;
|
|
10
11
|
//# sourceMappingURL=persist.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persist.d.ts","sourceRoot":"","sources":["../../../../src/commands/utils/persist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"persist.d.ts","sourceRoot":"","sources":["../../../../src/commands/utils/persist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAGtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,KAAK,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7D,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC5B,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,eAAO,MAAM,OAAO,WAAkB,UAAU,cAAc,UAAU,WAAW,cAAc,KAAG,QAAQ,GAAG,CAa9G,CAAA"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { CID } from 'multiformats/cid';
|
|
2
|
-
import * as
|
|
2
|
+
import * as dagPb from '@ipld/dag-pb';
|
|
3
3
|
import { sha256 } from 'multiformats/hashes/sha2';
|
|
4
|
-
export const persist = async (buffer, blockstore, options
|
|
4
|
+
export const persist = async (buffer, blockstore, options) => {
|
|
5
|
+
if (options.codec == null) {
|
|
6
|
+
options.codec = dagPb;
|
|
7
|
+
}
|
|
5
8
|
const multihash = await sha256.digest(buffer);
|
|
6
|
-
const cid = CID.create(options.cidVersion
|
|
9
|
+
const cid = CID.create(options.cidVersion, options.codec.code, multihash);
|
|
7
10
|
await blockstore.put(cid, buffer, {
|
|
8
11
|
signal: options.signal
|
|
9
12
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persist.js","sourceRoot":"","sources":["../../../../src/commands/utils/persist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"persist.js","sourceRoot":"","sources":["../../../../src/commands/utils/persist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AAWjD,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,MAAkB,EAAE,UAAsB,EAAE,OAAuB,EAAgB,EAAE;IACjH,IAAI,OAAO,CAAC,KAAK,IAAI,IAAI,EAAE;QACzB,OAAO,CAAC,KAAK,GAAG,KAAK,CAAA;KACtB;IAED,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC7C,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IAEzE,MAAM,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE;QAChC,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAA;IAEF,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA"}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import { CID } from 'multiformats/cid';
|
|
1
|
+
import type { CID, Version } from 'multiformats/cid';
|
|
2
2
|
import type { PBNode } from '@ipld/dag-pb';
|
|
3
3
|
import type { Blockstore } from 'interface-blockstore';
|
|
4
4
|
import type { Directory } from './cid-to-directory.js';
|
|
5
5
|
import type { AbortOptions } from '@libp2p/interfaces';
|
|
6
|
+
export interface RmLinkOptions extends AbortOptions {
|
|
7
|
+
shardSplitThresholdBytes: number;
|
|
8
|
+
cidVersion: Version;
|
|
9
|
+
}
|
|
6
10
|
export interface RemoveLinkResult {
|
|
7
11
|
node: PBNode;
|
|
8
12
|
cid: CID;
|
|
9
13
|
}
|
|
10
|
-
export declare function removeLink(parent: Directory, name: string, blockstore: Blockstore, options:
|
|
14
|
+
export declare function removeLink(parent: Directory, name: string, blockstore: Blockstore, options: RmLinkOptions): Promise<RemoveLinkResult>;
|
|
11
15
|
//# sourceMappingURL=remove-link.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove-link.d.ts","sourceRoot":"","sources":["../../../../src/commands/utils/remove-link.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"remove-link.d.ts","sourceRoot":"","sources":["../../../../src/commands/utils/remove-link.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AASpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAQtD,MAAM,WAAW,aAAc,SAAQ,YAAY;IACjD,wBAAwB,EAAE,MAAM,CAAA;IAChC,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,GAAG,CAAA;CACT;AAED,wBAAsB,UAAU,CAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwB5I"}
|