@helia/unixfs 1.0.3 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/index.min.js +1 -1
  2. package/dist/src/commands/add.d.ts +1 -1
  3. package/dist/src/commands/add.d.ts.map +1 -1
  4. package/dist/src/commands/add.js +35 -5
  5. package/dist/src/commands/add.js.map +1 -1
  6. package/dist/src/commands/utils/add-link.d.ts +0 -7
  7. package/dist/src/commands/utils/add-link.d.ts.map +1 -1
  8. package/dist/src/commands/utils/add-link.js +97 -128
  9. package/dist/src/commands/utils/add-link.js.map +1 -1
  10. package/dist/src/commands/utils/consumable-hash.d.ts +25 -0
  11. package/dist/src/commands/utils/consumable-hash.d.ts.map +1 -0
  12. package/dist/src/commands/utils/consumable-hash.js +136 -0
  13. package/dist/src/commands/utils/consumable-hash.js.map +1 -0
  14. package/dist/src/commands/utils/hamt-utils.d.ts +17 -20
  15. package/dist/src/commands/utils/hamt-utils.d.ts.map +1 -1
  16. package/dist/src/commands/utils/hamt-utils.js +105 -164
  17. package/dist/src/commands/utils/hamt-utils.js.map +1 -1
  18. package/dist/src/commands/utils/persist.d.ts +1 -1
  19. package/dist/src/commands/utils/remove-link.d.ts.map +1 -1
  20. package/dist/src/commands/utils/remove-link.js +35 -91
  21. package/dist/src/commands/utils/remove-link.js.map +1 -1
  22. package/dist/src/commands/utils/resolve.d.ts.map +1 -1
  23. package/dist/src/commands/utils/resolve.js +5 -2
  24. package/dist/src/commands/utils/resolve.js.map +1 -1
  25. package/package.json +3 -3
  26. package/src/commands/add.ts +37 -6
  27. package/src/commands/utils/add-link.ts +107 -170
  28. package/src/commands/utils/consumable-hash.ts +174 -0
  29. package/src/commands/utils/hamt-utils.ts +140 -226
  30. package/src/commands/utils/persist.ts +1 -1
  31. package/src/commands/utils/remove-link.ts +38 -110
  32. package/src/commands/utils/resolve.ts +8 -3
@@ -1,5 +1,5 @@
1
1
  import type { CID } from 'multiformats/cid';
2
- import type { Blockstore } from 'interface-blockstore';
2
+ import type { Blockstore } from 'ipfs-unixfs-importer';
3
3
  import { ByteStream, DirectoryCandidate, FileCandidate, ImportCandidateStream, ImporterOptions, ImportResult } from 'ipfs-unixfs-importer';
4
4
  export declare function addAll(source: ImportCandidateStream, blockstore: Blockstore, options?: Partial<ImporterOptions>): AsyncGenerator<ImportResult, void, unknown>;
5
5
  export declare function addBytes(bytes: Uint8Array, blockstore: Blockstore, options?: Partial<ImporterOptions>): Promise<CID>;
@@ -1 +1 @@
1
- {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,aAAa,EAAiC,qBAAqB,EAA6B,eAAe,EAAc,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEhN,wBAAwB,MAAM,CAAE,MAAM,EAAE,qBAAqB,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,GAAE,OAAO,CAAC,eAAe,CAAM,GAAG,cAAc,CAAC,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC,CAE1K;AAED,wBAAsB,QAAQ,CAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,GAAE,OAAO,CAAC,eAAe,CAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAI/H;AAED,wBAAsB,aAAa,CAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,GAAE,OAAO,CAAC,eAAe,CAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAIpI;AAED,wBAAsB,OAAO,CAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,GAAE,OAAO,CAAC,eAAe,CAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAIhI;AAED,wBAAsB,YAAY,CAAE,GAAG,EAAE,OAAO,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,GAAE,OAAO,CAAC,eAAe,CAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAOlJ"}
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,aAAa,EAAiC,qBAAqB,EAA6B,eAAe,EAAc,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAkBhN,wBAAwB,MAAM,CAAE,MAAM,EAAE,qBAAqB,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,GAAE,OAAO,CAAC,eAAe,CAAM,GAAG,cAAc,CAAC,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC,CAK1K;AAED,wBAAsB,QAAQ,CAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,GAAE,OAAO,CAAC,eAAe,CAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAO/H;AAED,wBAAsB,aAAa,CAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,GAAE,OAAO,CAAC,eAAe,CAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAOpI;AAED,wBAAsB,OAAO,CAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,GAAE,OAAO,CAAC,eAAe,CAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAOhI;AAED,wBAAsB,YAAY,CAAE,GAAG,EAAE,OAAO,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,GAAE,OAAO,CAAC,eAAe,CAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAUlJ"}
@@ -1,24 +1,54 @@
1
1
  import { importBytes, importByteStream, importDirectory, importer, importFile } from 'ipfs-unixfs-importer';
2
+ import { balanced } from 'ipfs-unixfs-importer/layout';
3
+ import { fixedSize } from 'ipfs-unixfs-importer/chunker';
4
+ /**
5
+ * Default importer settings match Filecoin
6
+ */
7
+ const defaultImporterSettings = {
8
+ cidVersion: 1,
9
+ rawLeaves: true,
10
+ layout: balanced({
11
+ maxChildrenPerNode: 1024
12
+ }),
13
+ chunker: fixedSize({
14
+ chunkSize: 1048576
15
+ })
16
+ };
2
17
  export async function* addAll(source, blockstore, options = {}) {
3
- yield* importer(source, blockstore, options);
18
+ yield* importer(source, blockstore, {
19
+ ...defaultImporterSettings,
20
+ ...options
21
+ });
4
22
  }
5
23
  export async function addBytes(bytes, blockstore, options = {}) {
6
- const { cid } = await importBytes(bytes, blockstore, options);
24
+ const { cid } = await importBytes(bytes, blockstore, {
25
+ ...defaultImporterSettings,
26
+ ...options
27
+ });
7
28
  return cid;
8
29
  }
9
30
  export async function addByteStream(bytes, blockstore, options = {}) {
10
- const { cid } = await importByteStream(bytes, blockstore, options);
31
+ const { cid } = await importByteStream(bytes, blockstore, {
32
+ ...defaultImporterSettings,
33
+ ...options
34
+ });
11
35
  return cid;
12
36
  }
13
37
  export async function addFile(file, blockstore, options = {}) {
14
- const { cid } = await importFile(file, blockstore, options);
38
+ const { cid } = await importFile(file, blockstore, {
39
+ ...defaultImporterSettings,
40
+ ...options
41
+ });
15
42
  return cid;
16
43
  }
17
44
  export async function addDirectory(dir, blockstore, options = {}) {
18
45
  const { cid } = await importDirectory({
19
46
  ...dir,
20
47
  path: dir.path ?? '-'
21
- }, blockstore, options);
48
+ }, blockstore, {
49
+ ...defaultImporterSettings,
50
+ ...options
51
+ });
22
52
  return cid;
23
53
  }
24
54
  //# sourceMappingURL=add.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/commands/add.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiD,WAAW,EAAE,gBAAgB,EAAyB,eAAe,EAAE,QAAQ,EAAmB,UAAU,EAAgB,MAAM,sBAAsB,CAAA;AAEhN,MAAM,CAAC,KAAK,SAAU,CAAC,CAAC,MAAM,CAAE,MAA6B,EAAE,UAAsB,EAAE,UAAoC,EAAE;IAC3H,KAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAE,KAAiB,EAAE,UAAsB,EAAE,UAAoC,EAAE;IAC/G,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;IAE7D,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAE,KAAiB,EAAE,UAAsB,EAAE,UAAoC,EAAE;IACpH,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;IAElE,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAE,IAAmB,EAAE,UAAsB,EAAE,UAAoC,EAAE;IAChH,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;IAE3D,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAE,GAAgC,EAAE,UAAsB,EAAE,UAAoC,EAAE;IAClI,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,eAAe,CAAC;QACpC,GAAG,GAAG;QACN,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,GAAG;KACtB,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;IAEvB,OAAO,GAAG,CAAA;AACZ,CAAC"}
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/commands/add.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiD,WAAW,EAAE,gBAAgB,EAAyB,eAAe,EAAE,QAAQ,EAAmB,UAAU,EAAgB,MAAM,sBAAsB,CAAA;AAChN,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAExD;;GAEG;AACH,MAAM,uBAAuB,GAAoB;IAC/C,UAAU,EAAE,CAAC;IACb,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,QAAQ,CAAC;QACf,kBAAkB,EAAE,IAAI;KACzB,CAAC;IACF,OAAO,EAAE,SAAS,CAAC;QACjB,SAAS,EAAE,OAAO;KACnB,CAAC;CACH,CAAA;AAED,MAAM,CAAC,KAAK,SAAU,CAAC,CAAC,MAAM,CAAE,MAA6B,EAAE,UAAsB,EAAE,UAAoC,EAAE;IAC3H,KAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE;QACnC,GAAG,uBAAuB;QAC1B,GAAG,OAAO;KACX,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAE,KAAiB,EAAE,UAAsB,EAAE,UAAoC,EAAE;IAC/G,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE;QACnD,GAAG,uBAAuB;QAC1B,GAAG,OAAO;KACX,CAAC,CAAA;IAEF,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAE,KAAiB,EAAE,UAAsB,EAAE,UAAoC,EAAE;IACpH,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE;QACxD,GAAG,uBAAuB;QAC1B,GAAG,OAAO;KACX,CAAC,CAAA;IAEF,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAE,IAAmB,EAAE,UAAsB,EAAE,UAAoC,EAAE;IAChH,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE;QACjD,GAAG,uBAAuB;QAC1B,GAAG,OAAO;KACX,CAAC,CAAA;IAEF,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAE,GAAgC,EAAE,UAAsB,EAAE,UAAoC,EAAE;IAClI,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,eAAe,CAAC;QACpC,GAAG,GAAG;QACN,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,GAAG;KACtB,EAAE,UAAU,EAAE;QACb,GAAG,uBAAuB;QAC1B,GAAG,OAAO;KACX,CAAC,CAAA;IAEF,OAAO,GAAG,CAAA;AACZ,CAAC"}
@@ -1,13 +1,11 @@
1
1
  import { CID, Version } from 'multiformats/cid';
2
2
  import type { PBNode, PBLink } from '@ipld/dag-pb/interface';
3
- import type { Bucket } from 'hamt-sharding';
4
3
  import type { AbortOptions } from '@libp2p/interfaces';
5
4
  import type { Directory } from './cid-to-directory.js';
6
5
  import type { Blockstore } from 'interface-blockstore';
7
6
  export interface AddLinkResult {
8
7
  node: PBNode;
9
8
  cid: CID;
10
- size: number;
11
9
  }
12
10
  export interface AddLinkOptions extends AbortOptions {
13
11
  allowOverwriting: boolean;
@@ -15,9 +13,4 @@ export interface AddLinkOptions extends AbortOptions {
15
13
  cidVersion: Version;
16
14
  }
17
15
  export declare function addLink(parent: Directory, child: Required<PBLink>, blockstore: Blockstore, options: AddLinkOptions): Promise<AddLinkResult>;
18
- export interface BucketPath {
19
- bucket: Bucket<any>;
20
- prefix: string;
21
- node?: PBNode;
22
- }
23
16
  //# sourceMappingURL=add-link.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"add-link.d.ts","sourceRoot":"","sources":["../../../../src/commands/utils/add-link.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAa/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAE5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAG3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAKtD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,GAAG,CAAA;IACR,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,gBAAgB,EAAE,OAAO,CAAA;IACzB,wBAAwB,EAAE,MAAM,CAAA;IAChC,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,wBAAsB,OAAO,CAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA0BlJ;AAmOD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;CACd"}
1
+ {"version":3,"file":"add-link.d.ts","sourceRoot":"","sources":["../../../../src/commands/utils/add-link.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAS/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAI5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAUtD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,GAAG,CAAA;CACT;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,gBAAgB,EAAE,OAAO,CAAA;IACzB,wBAAwB,EAAE,MAAM,CAAA;IAChC,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,wBAAsB,OAAO,CAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA0BlJ"}
@@ -2,12 +2,15 @@ import * as dagPB from '@ipld/dag-pb';
2
2
  import { CID } from 'multiformats/cid';
3
3
  import { logger } from '@libp2p/logger';
4
4
  import { UnixFS } from 'ipfs-unixfs';
5
- import { DirSharded } from './dir-sharded.js';
6
- import { updateHamtDirectory, recreateHamtLevel, recreateInitialHamtLevel, createShard, toPrefix, addLinksToHamtBucket } from './hamt-utils.js';
7
- import last from 'it-last';
5
+ import { createShard, recreateShardedDirectory, toPrefix, updateShardedDirectory } from './hamt-utils.js';
8
6
  import { sha256 } from 'multiformats/hashes/sha2';
9
7
  import { AlreadyExistsError, InvalidParametersError, InvalidPBNodeError } from './errors.js';
10
8
  import { isOverShardThreshold } from './is-over-shard-threshold.js';
9
+ import { hamtBucketBits, hamtHashFn } from './hamt-constants.js';
10
+ // @ts-expect-error no types
11
+ import SparseArray from 'sparse-array';
12
+ import { wrapHash } from './consumable-hash.js';
13
+ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
11
14
  const log = logger('helia:unixfs:components:utils:add-link');
12
15
  export async function addLink(parent, child, blockstore, options) {
13
16
  if (parent.node.Data == null) {
@@ -42,7 +45,7 @@ const convertToShardedDirectory = async (parent, blockstore) => {
42
45
  mtime: unixfs.mtime,
43
46
  cidVersion: parent.cid.version
44
47
  });
45
- log(`Converted directory to sharded directory ${result.cid}`);
48
+ log(`converted directory to sharded directory ${result.cid}`);
46
49
  return result;
47
50
  };
48
51
  const addToDirectory = async (parent, child, blockstore, options) => {
@@ -84,141 +87,107 @@ const addToDirectory = async (parent, child, blockstore, options) => {
84
87
  await blockstore.put(cid, buf);
85
88
  return {
86
89
  node: parent.node,
87
- cid,
88
- size: buf.length
90
+ cid
89
91
  };
90
92
  };
91
93
  const addToShardedDirectory = async (parent, child, blockstore, options) => {
92
- const { shard, path } = await addFileToShardedDirectory(parent, child, blockstore, options);
93
- const result = await last(shard.flush(blockstore));
94
- if (result == null) {
95
- throw new Error('No result from flushing shard');
94
+ const { path, hash } = await recreateShardedDirectory(parent.cid, child.Name, blockstore, options);
95
+ const finalSegment = path[path.length - 1];
96
+ if (finalSegment == null) {
97
+ throw new Error('Invalid HAMT, could not generate path');
96
98
  }
97
- const block = await blockstore.get(result.cid);
98
- const node = dagPB.decode(block);
99
- // we have written out the shard, but only one sub-shard will have been written so replace it in the original shard
100
- const parentLinks = parent.node.Links.filter((link) => {
101
- return (link.Name ?? '').substring(0, 2) !== path[0].prefix;
102
- });
103
- const newLink = node.Links
104
- .find(link => (link.Name ?? '').substring(0, 2) === path[0].prefix);
105
- if (newLink == null) {
106
- throw new Error(`No link found with prefix ${path[0].prefix}`);
107
- }
108
- parentLinks.push(newLink);
109
- return await updateHamtDirectory({
110
- Data: parent.node.Data,
111
- Links: parentLinks
112
- }, blockstore, path[0].bucket, options);
113
- };
114
- const addFileToShardedDirectory = async (parent, child, blockstore, options) => {
115
- if (parent.node.Data == null) {
116
- throw new InvalidPBNodeError('Parent node with no data passed to addFileToShardedDirectory');
117
- }
118
- // start at the root bucket and descend, loading nodes as we go
119
- const rootBucket = await recreateInitialHamtLevel(parent.node.Links);
120
- const node = UnixFS.unmarshal(parent.node.Data);
121
- const shard = new DirSharded({
122
- root: true,
123
- dir: true,
124
- parent: undefined,
125
- parentKey: undefined,
126
- path: '',
127
- dirty: true,
128
- flat: false,
129
- mode: node.mode
130
- }, {
131
- ...options,
132
- cidVersion: parent.cid.version
133
- });
134
- shard._bucket = rootBucket;
135
- if (node.mtime != null) {
136
- // update mtime if previously set
137
- shard.mtime = {
138
- secs: BigInt(Math.round(Date.now() / 1000))
139
- };
140
- }
141
- // load subshards until the bucket & position no longer changes
142
- const position = await rootBucket._findNewBucketAndPos(child.Name);
143
- const path = toBucketPath(position);
144
- path[0].node = parent.node;
145
- let index = 0;
146
- while (index < path.length) {
147
- const segment = path[index];
148
- index++;
149
- const node = segment.node;
150
- if (node == null) {
151
- throw new Error('Segment had no node');
152
- }
153
- const link = node.Links
154
- .find(link => (link.Name ?? '').substring(0, 2) === segment.prefix);
155
- if (link == null) {
156
- // prefix is new, file will be added to the current bucket
157
- log(`Link ${segment.prefix}${child.Name} will be added`);
158
- index = path.length;
159
- break;
160
- }
161
- if (link.Name === `${segment.prefix}${child.Name}`) {
99
+ // find the next prefix
100
+ // const index = await hash.take(hamtBucketBits)
101
+ const prefix = finalSegment.prefix;
102
+ const index = parseInt(prefix, 16);
103
+ log('next prefix for %s is %s', child.Name, prefix);
104
+ const linkName = `${prefix}${child.Name}`;
105
+ const existingLink = finalSegment.node.Links.find(l => (l.Name ?? '').startsWith(prefix));
106
+ if (existingLink != null) {
107
+ log('link %s was present in shard', linkName);
108
+ // link is already present in shard
109
+ if (existingLink.Name === linkName) {
110
+ // file with same name is already present in shard
162
111
  if (!options.allowOverwriting) {
163
112
  throw new AlreadyExistsError();
164
113
  }
165
- // file already existed, file will be added to the current bucket
166
- log(`Link ${segment.prefix}${child.Name} will be replaced`);
167
- index = path.length;
168
- break;
114
+ log('overwriting %s in subshard', child.Name);
115
+ finalSegment.node.Links = finalSegment.node.Links.filter(l => l.Name !== linkName);
116
+ finalSegment.node.Links.push({
117
+ Name: linkName,
118
+ Hash: child.Hash,
119
+ Tsize: child.Tsize
120
+ });
169
121
  }
170
- if ((link.Name ?? '').length > 2) {
171
- // another file had the same prefix, will be replaced with a subshard
172
- log(`Link ${link.Name} ${link.Hash} will be replaced with a subshard`);
173
- index = path.length;
174
- break;
122
+ else if (existingLink.Name?.length === 2) {
123
+ throw new Error('Existing link was subshard?!');
175
124
  }
176
- // load sub-shard
177
- log(`Found subshard ${segment.prefix}`);
178
- const block = await blockstore.get(link.Hash);
179
- const subShard = dagPB.decode(block);
180
- // subshard hasn't been loaded, descend to the next level of the HAMT
181
- if (path[index] == null) {
182
- log(`Loaded new subshard ${segment.prefix}`);
183
- await recreateHamtLevel(blockstore, subShard.Links, rootBucket, segment.bucket, parseInt(segment.prefix, 16), options);
184
- const position = await rootBucket._findNewBucketAndPos(child.Name);
185
- path.push({
186
- bucket: position.bucket,
187
- prefix: toPrefix(position.pos),
188
- node: subShard
189
- });
190
- break;
125
+ else {
126
+ // conflict, add a new HAMT segment
127
+ log('prefix %s already exists, creating new subshard', prefix);
128
+ // find the sibling we are going to replace
129
+ const index = finalSegment.node.Links.findIndex(l => l.Name?.startsWith(prefix));
130
+ const sibling = finalSegment.node.Links.splice(index, 1)[0];
131
+ // give the sibling a new HAMT prefix
132
+ const siblingName = (sibling.Name ?? '').substring(2);
133
+ const wrapped = wrapHash(hamtHashFn);
134
+ const siblingHash = wrapped(uint8ArrayFromString(siblingName));
135
+ // discard hash bits until we reach the subshard depth
136
+ for (let i = 0; i < path.length; i++) {
137
+ await siblingHash.take(hamtBucketBits);
138
+ }
139
+ while (true) {
140
+ const siblingIndex = await siblingHash.take(hamtBucketBits);
141
+ const siblingPrefix = toPrefix(siblingIndex);
142
+ sibling.Name = `${siblingPrefix}${siblingName}`;
143
+ // calculate the target file's HAMT prefix in the new sub-shard
144
+ const newIndex = await hash.take(hamtBucketBits);
145
+ const newPrefix = toPrefix(newIndex);
146
+ if (siblingPrefix === newPrefix) {
147
+ // the two sibling names have caused another conflict - add an intermediate node to
148
+ // the HAMT and try again
149
+ // create the child locations
150
+ const children = new SparseArray();
151
+ children.set(newIndex, true);
152
+ path.push({
153
+ prefix: newPrefix,
154
+ children,
155
+ node: {
156
+ Links: []
157
+ }
158
+ });
159
+ continue;
160
+ }
161
+ // create the child locations
162
+ const children = new SparseArray();
163
+ children.set(newIndex, true);
164
+ children.set(siblingIndex, true);
165
+ // add our new segment
166
+ path.push({
167
+ prefix,
168
+ children,
169
+ node: {
170
+ Links: [
171
+ sibling, {
172
+ Name: `${newPrefix}${child.Name}`,
173
+ Hash: child.Hash,
174
+ Tsize: child.Tsize
175
+ }
176
+ ]
177
+ }
178
+ });
179
+ break;
180
+ }
191
181
  }
192
- const nextSegment = path[index];
193
- // add next levels worth of links to bucket
194
- await addLinksToHamtBucket(blockstore, subShard.Links, nextSegment.bucket, rootBucket, options);
195
- nextSegment.node = subShard;
196
182
  }
197
- // finally add the new file into the shard
198
- await shard._bucket.put(child.Name, {
199
- size: BigInt(child.Tsize),
200
- cid: child.Hash
201
- });
202
- return {
203
- shard, path
204
- };
205
- };
206
- const toBucketPath = (position) => {
207
- const path = [{
208
- bucket: position.bucket,
209
- prefix: toPrefix(position.pos)
210
- }];
211
- let bucket = position.bucket._parent;
212
- let positionInBucket = position.bucket._posAtParent;
213
- while (bucket != null) {
214
- path.push({
215
- bucket,
216
- prefix: toPrefix(positionInBucket)
217
- });
218
- positionInBucket = bucket._posAtParent;
219
- bucket = bucket._parent;
183
+ else {
184
+ log('link %s was not present in sub-shard', linkName);
185
+ // add new link to shard
186
+ child.Name = linkName;
187
+ finalSegment.node.Links.push(child);
188
+ finalSegment.children.set(index, true);
189
+ log('adding %s to existing sub-shard', linkName);
220
190
  }
221
- path.reverse();
222
- return path;
191
+ return await updateShardedDirectory(path, blockstore, options);
223
192
  };
224
193
  //# sourceMappingURL=add-link.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"add-link.js","sourceRoot":"","sources":["../../../../src/commands/utils/add-link.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"add-link.js","sourceRoot":"","sources":["../../../../src/commands/utils/add-link.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export declare function wrapHash(hashFn: (value: Uint8Array) => Promise<Uint8Array>): (value: InfiniteHash | Uint8Array) => InfiniteHash;
2
+ export declare class InfiniteHash {
3
+ _value: Uint8Array;
4
+ _hashFn: (value: Uint8Array) => Promise<Uint8Array>;
5
+ _depth: number;
6
+ _availableBits: number;
7
+ _currentBufferIndex: number;
8
+ _buffers: ConsumableBuffer[];
9
+ constructor(value: Uint8Array, hashFn: (value: Uint8Array) => Promise<Uint8Array>);
10
+ take(bits: number): Promise<number>;
11
+ untake(bits: number): void;
12
+ _produceMoreBits(): Promise<void>;
13
+ }
14
+ export declare class ConsumableBuffer {
15
+ _value: Uint8Array;
16
+ _currentBytePos: number;
17
+ _currentBitPos: number;
18
+ constructor(value: Uint8Array);
19
+ availableBits(): number;
20
+ totalBits(): number;
21
+ take(bits: number): number;
22
+ untake(bits: number): void;
23
+ _haveBits(): boolean;
24
+ }
25
+ //# sourceMappingURL=consumable-hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumable-hash.d.ts","sourceRoot":"","sources":["../../../../src/commands/utils/consumable-hash.ts"],"names":[],"mappings":"AAEA,wBAAgB,QAAQ,CAAE,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,GAAG,UAAU,KAAK,YAAY,CAWhI;AAED,qBAAa,YAAY;IACvB,MAAM,EAAE,UAAU,CAAA;IAClB,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,CAAA;IACnD,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,MAAM,CAAA;IACtB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,QAAQ,EAAE,gBAAgB,EAAE,CAAA;gBAEf,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC;IAa5E,IAAI,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyB1C,MAAM,CAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAiBrB,gBAAgB,IAAK,OAAO,CAAC,IAAI,CAAC;CAUzC;AAwBD,qBAAa,gBAAgB;IAC3B,MAAM,EAAE,UAAU,CAAA;IAClB,eAAe,EAAE,MAAM,CAAA;IACvB,cAAc,EAAE,MAAM,CAAA;gBAET,KAAK,EAAE,UAAU;IAM9B,aAAa,IAAK,MAAM;IAIxB,SAAS,IAAK,MAAM;IAIpB,IAAI,CAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAsB3B,MAAM,CAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ3B,SAAS,IAAK,OAAO;CAGtB"}
@@ -0,0 +1,136 @@
1
+ import { concat as uint8ArrayConcat } from 'uint8arrays/concat';
2
+ export function wrapHash(hashFn) {
3
+ function hashing(value) {
4
+ if (value instanceof InfiniteHash) {
5
+ // already a hash. return it
6
+ return value;
7
+ }
8
+ else {
9
+ return new InfiniteHash(value, hashFn);
10
+ }
11
+ }
12
+ return hashing;
13
+ }
14
+ export class InfiniteHash {
15
+ constructor(value, hashFn) {
16
+ if (!(value instanceof Uint8Array)) {
17
+ throw new Error('can only hash Uint8Arrays');
18
+ }
19
+ this._value = value;
20
+ this._hashFn = hashFn;
21
+ this._depth = -1;
22
+ this._availableBits = 0;
23
+ this._currentBufferIndex = 0;
24
+ this._buffers = [];
25
+ }
26
+ async take(bits) {
27
+ let pendingBits = bits;
28
+ while (this._availableBits < pendingBits) {
29
+ await this._produceMoreBits();
30
+ }
31
+ let result = 0;
32
+ while (pendingBits > 0) {
33
+ const hash = this._buffers[this._currentBufferIndex];
34
+ const available = Math.min(hash.availableBits(), pendingBits);
35
+ const took = hash.take(available);
36
+ result = (result << available) + took;
37
+ pendingBits -= available;
38
+ this._availableBits -= available;
39
+ if (hash.availableBits() === 0) {
40
+ this._currentBufferIndex++;
41
+ }
42
+ }
43
+ return result;
44
+ }
45
+ untake(bits) {
46
+ let pendingBits = bits;
47
+ while (pendingBits > 0) {
48
+ const hash = this._buffers[this._currentBufferIndex];
49
+ const availableForUntake = Math.min(hash.totalBits() - hash.availableBits(), pendingBits);
50
+ hash.untake(availableForUntake);
51
+ pendingBits -= availableForUntake;
52
+ this._availableBits += availableForUntake;
53
+ if (this._currentBufferIndex > 0 && hash.totalBits() === hash.availableBits()) {
54
+ this._depth--;
55
+ this._currentBufferIndex--;
56
+ }
57
+ }
58
+ }
59
+ async _produceMoreBits() {
60
+ this._depth++;
61
+ const value = this._depth > 0 ? uint8ArrayConcat([this._value, Uint8Array.from([this._depth])]) : this._value;
62
+ const hashValue = await this._hashFn(value);
63
+ const buffer = new ConsumableBuffer(hashValue);
64
+ this._buffers.push(buffer);
65
+ this._availableBits += buffer.availableBits();
66
+ }
67
+ }
68
+ const START_MASKS = [
69
+ 0b11111111,
70
+ 0b11111110,
71
+ 0b11111100,
72
+ 0b11111000,
73
+ 0b11110000,
74
+ 0b11100000,
75
+ 0b11000000,
76
+ 0b10000000
77
+ ];
78
+ const STOP_MASKS = [
79
+ 0b00000001,
80
+ 0b00000011,
81
+ 0b00000111,
82
+ 0b00001111,
83
+ 0b00011111,
84
+ 0b00111111,
85
+ 0b01111111,
86
+ 0b11111111
87
+ ];
88
+ export class ConsumableBuffer {
89
+ constructor(value) {
90
+ this._value = value;
91
+ this._currentBytePos = value.length - 1;
92
+ this._currentBitPos = 7;
93
+ }
94
+ availableBits() {
95
+ return this._currentBitPos + 1 + this._currentBytePos * 8;
96
+ }
97
+ totalBits() {
98
+ return this._value.length * 8;
99
+ }
100
+ take(bits) {
101
+ let pendingBits = bits;
102
+ let result = 0;
103
+ while (pendingBits > 0 && this._haveBits()) {
104
+ const byte = this._value[this._currentBytePos];
105
+ const availableBits = this._currentBitPos + 1;
106
+ const taking = Math.min(availableBits, pendingBits);
107
+ const value = byteBitsToInt(byte, availableBits - taking, taking);
108
+ result = (result << taking) + value;
109
+ pendingBits -= taking;
110
+ this._currentBitPos -= taking;
111
+ if (this._currentBitPos < 0) {
112
+ this._currentBitPos = 7;
113
+ this._currentBytePos--;
114
+ }
115
+ }
116
+ return result;
117
+ }
118
+ untake(bits) {
119
+ this._currentBitPos += bits;
120
+ while (this._currentBitPos > 7) {
121
+ this._currentBitPos -= 8;
122
+ this._currentBytePos += 1;
123
+ }
124
+ }
125
+ _haveBits() {
126
+ return this._currentBytePos >= 0;
127
+ }
128
+ }
129
+ function byteBitsToInt(byte, start, length) {
130
+ const mask = maskFor(start, length);
131
+ return (byte & mask) >>> start;
132
+ }
133
+ function maskFor(start, length) {
134
+ return START_MASKS[start] & STOP_MASKS[Math.min(length + start - 1, 7)];
135
+ }
136
+ //# sourceMappingURL=consumable-hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumable-hash.js","sourceRoot":"","sources":["../../../../src/commands/utils/consumable-hash.ts"],"names":[],"mappings":"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"}