@atproto/repo 0.8.12 → 0.8.13

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 (53) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/LICENSE.txt +1 -1
  3. package/dist/block-map.d.ts.map +1 -1
  4. package/dist/block-map.js +0 -1
  5. package/dist/block-map.js.map +1 -1
  6. package/dist/car.d.ts.map +1 -1
  7. package/dist/car.js +89 -22
  8. package/dist/car.js.map +1 -1
  9. package/dist/mst/mst.d.ts.map +1 -1
  10. package/dist/mst/mst.js +0 -1
  11. package/dist/mst/mst.js.map +1 -1
  12. package/dist/mst/util.d.ts.map +1 -1
  13. package/dist/mst/util.js +0 -1
  14. package/dist/mst/util.js.map +1 -1
  15. package/dist/parse.d.ts.map +1 -1
  16. package/dist/parse.js +0 -1
  17. package/dist/parse.js.map +1 -1
  18. package/dist/readable-repo.d.ts.map +1 -1
  19. package/dist/readable-repo.js +0 -1
  20. package/dist/readable-repo.js.map +1 -1
  21. package/dist/repo.d.ts.map +1 -1
  22. package/dist/repo.js +0 -1
  23. package/dist/repo.js.map +1 -1
  24. package/dist/storage/readable-blockstore.d.ts.map +1 -1
  25. package/dist/storage/readable-blockstore.js +0 -1
  26. package/dist/storage/readable-blockstore.js.map +1 -1
  27. package/dist/storage/types.d.ts.map +1 -1
  28. package/dist/storage/types.js +0 -1
  29. package/dist/storage/types.js.map +1 -1
  30. package/dist/types.d.ts.map +1 -1
  31. package/dist/types.js +0 -1
  32. package/dist/types.js.map +1 -1
  33. package/dist/util.d.ts.map +1 -1
  34. package/dist/util.js +0 -1
  35. package/dist/util.js.map +1 -1
  36. package/package.json +4 -4
  37. package/src/block-map.ts +0 -2
  38. package/src/car.ts +101 -18
  39. package/src/mst/mst.ts +0 -2
  40. package/src/mst/util.ts +0 -2
  41. package/src/parse.ts +0 -2
  42. package/src/readable-repo.ts +0 -2
  43. package/src/repo.ts +0 -2
  44. package/src/storage/readable-blockstore.ts +0 -2
  45. package/src/storage/types.ts +0 -2
  46. package/src/types.ts +0 -2
  47. package/src/util.ts +0 -2
  48. package/tests/_keys.ts +156 -156
  49. package/tests/_util.ts +0 -2
  50. package/tests/car.test.ts +0 -2
  51. package/tests/commit-proof-fixtures.json +79 -57
  52. package/tests/proofs.test.ts +0 -2
  53. package/tsconfig.tests.tsbuildinfo +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @atproto/repo
2
2
 
3
+ ## 0.8.13
4
+
5
+ ### Patch Changes
6
+
7
+ - [#4729](https://github.com/bluesky-social/atproto/pull/4729) [`192685f`](https://github.com/bluesky-social/atproto/commit/192685fca75a68c9c50a94817d3f27da7fc02f56) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Optimize BufferedReader implementation
8
+
3
9
  ## 0.8.12
4
10
 
5
11
  ### Patch Changes
package/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  Dual MIT/Apache-2.0 License
2
2
 
3
- Copyright (c) 2022-2025 Bluesky Social PBC, and Contributors
3
+ Copyright (c) 2022-2026 Bluesky Social PBC, and Contributors
4
4
 
5
5
  Except as otherwise noted in individual files, this software is licensed under the MIT license (<http://opensource.org/licenses/MIT>), or the Apache License, Version 2.0 (<http://www.apache.org/licenses/LICENSE-2.0>).
6
6
 
@@ -1 +1 @@
1
- {"version":3,"file":"block-map.d.ts","sourceRoot":"","sources":["../src/block-map.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAGtC,OAAO,EAAE,QAAQ,EAAa,MAAM,kBAAkB,CAAA;AAEtD,qBAAa,QAAS,YAAW,QAAQ,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAqC;gBAEpC,OAAO,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAQhE,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;IAMxC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,GAAG,QAAQ;IAK1C,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,UAAU,GAAG,SAAS;IAIrC,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,QAAQ;IAK1B,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG;QAAE,MAAM,EAAE,QAAQ,CAAC;QAAC,OAAO,EAAE,GAAG,EAAE,CAAA;KAAE;IAc1D,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO;IAItB,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAIxD,OAAO,IAAI,KAAK,EAAE;IAIlB,IAAI,IAAI,GAAG,EAAE;IAIb,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ;IAKjC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,QAAQ,IAAI,MAAM,CAIrB;IAED,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO;IAc/B,IAAI,IAAI,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC;IAMrC,MAAM,IAAI,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC;IAI9C,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC;CAKlE;AAMD,KAAK,KAAK,GAAG;IACX,GAAG,EAAE,GAAG,CAAA;IACR,KAAK,EAAE,UAAU,CAAA;CAClB,CAAA;AAED,eAAe,QAAQ,CAAA"}
1
+ {"version":3,"file":"block-map.d.ts","sourceRoot":"","sources":["../src/block-map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAGtC,OAAO,EAAE,QAAQ,EAAa,MAAM,kBAAkB,CAAA;AAEtD,qBAAa,QAAS,YAAW,QAAQ,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAqC;gBAEpC,OAAO,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAQhE,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;IAMxC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,GAAG,QAAQ;IAK1C,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,UAAU,GAAG,SAAS;IAIrC,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,QAAQ;IAK1B,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG;QAAE,MAAM,EAAE,QAAQ,CAAC;QAAC,OAAO,EAAE,GAAG,EAAE,CAAA;KAAE;IAc1D,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO;IAItB,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAIxD,OAAO,IAAI,KAAK,EAAE;IAIlB,IAAI,IAAI,GAAG,EAAE;IAIb,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ;IAKjC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,QAAQ,IAAI,MAAM,CAIrB;IAED,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO;IAc/B,IAAI,IAAI,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC;IAMrC,MAAM,IAAI,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC;IAI9C,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC;CAKlE;AAMD,KAAK,KAAK,GAAG;IACX,GAAG,EAAE,GAAG,CAAA;IACR,KAAK,EAAE,UAAU,CAAA;CAClB,CAAA;AAED,eAAe,QAAQ,CAAA"}
package/dist/block-map.js CHANGED
@@ -1,5 +1,4 @@
1
1
  "use strict";
2
- /* eslint-disable import/no-deprecated */
3
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
3
  if (k2 === undefined) k2 = k;
5
4
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -1 +1 @@
1
- {"version":3,"file":"block-map.js","sourceRoot":"","sources":["../src/block-map.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-deprecated */\n\nimport { CID } from 'multiformats/cid'\nimport * as uint8arrays from 'uint8arrays'\nimport { dataToCborBlock } from '@atproto/common'\nimport { LexValue, lexToIpld } from '@atproto/lexicon'\n\nexport class BlockMap implements Iterable<[cid: CID, bytes: Uint8Array]> {\n private map: Map<string, Uint8Array> = new Map()\n\n constructor(entries?: Iterable<readonly [cid: CID, bytes: Uint8Array]>) {\n if (entries) {\n for (const [cid, bytes] of entries) {\n this.set(cid, bytes)\n }\n }\n }\n\n async add(value: LexValue): Promise<CID> {\n const block = await dataToCborBlock(lexToIpld(value))\n this.set(block.cid, block.bytes)\n return block.cid\n }\n\n set(cid: CID, bytes: Uint8Array): BlockMap {\n this.map.set(cid.toString(), bytes)\n return this\n }\n\n get(cid: CID): Uint8Array | undefined {\n return this.map.get(cid.toString())\n }\n\n delete(cid: CID): BlockMap {\n this.map.delete(cid.toString())\n return this\n }\n\n getMany(cids: CID[]): { blocks: BlockMap; missing: CID[] } {\n const missing: CID[] = []\n const blocks = new BlockMap()\n for (const cid of cids) {\n const got = this.map.get(cid.toString())\n if (got) {\n blocks.set(cid, got)\n } else {\n missing.push(cid)\n }\n }\n return { blocks, missing }\n }\n\n has(cid: CID): boolean {\n return this.map.has(cid.toString())\n }\n\n clear(): void {\n this.map.clear()\n }\n\n forEach(cb: (bytes: Uint8Array, cid: CID) => void): void {\n for (const [cid, bytes] of this) cb(bytes, cid)\n }\n\n entries(): Entry[] {\n return Array.from(this, toEntry)\n }\n\n cids(): CID[] {\n return Array.from(this.keys())\n }\n\n addMap(toAdd: BlockMap): BlockMap {\n for (const [cid, bytes] of toAdd) this.set(cid, bytes)\n return this\n }\n\n get size(): number {\n return this.map.size\n }\n\n get byteSize(): number {\n let size = 0\n for (const bytes of this.values()) size += bytes.length\n return size\n }\n\n equals(other: BlockMap): boolean {\n if (this.size !== other.size) {\n return false\n }\n for (const [cid, bytes] of this) {\n const otherBytes = other.get(cid)\n if (!otherBytes) return false\n if (!uint8arrays.equals(bytes, otherBytes)) {\n return false\n }\n }\n return true\n }\n\n *keys(): Generator<CID, void, unknown> {\n for (const key of this.map.keys()) {\n yield CID.parse(key)\n }\n }\n\n *values(): Generator<Uint8Array, void, unknown> {\n yield* this.map.values()\n }\n\n *[Symbol.iterator](): Generator<[CID, Uint8Array], void, unknown> {\n for (const [key, value] of this.map) {\n yield [CID.parse(key), value]\n }\n }\n}\n\nfunction toEntry([cid, bytes]: readonly [CID, Uint8Array]): Entry {\n return { cid, bytes }\n}\n\ntype Entry = {\n cid: CID\n bytes: Uint8Array\n}\n\nexport default BlockMap\n"]}
1
+ {"version":3,"file":"block-map.js","sourceRoot":"","sources":["../src/block-map.ts"],"names":[],"mappings":"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","sourcesContent":["import { CID } from 'multiformats/cid'\nimport * as uint8arrays from 'uint8arrays'\nimport { dataToCborBlock } from '@atproto/common'\nimport { LexValue, lexToIpld } from '@atproto/lexicon'\n\nexport class BlockMap implements Iterable<[cid: CID, bytes: Uint8Array]> {\n private map: Map<string, Uint8Array> = new Map()\n\n constructor(entries?: Iterable<readonly [cid: CID, bytes: Uint8Array]>) {\n if (entries) {\n for (const [cid, bytes] of entries) {\n this.set(cid, bytes)\n }\n }\n }\n\n async add(value: LexValue): Promise<CID> {\n const block = await dataToCborBlock(lexToIpld(value))\n this.set(block.cid, block.bytes)\n return block.cid\n }\n\n set(cid: CID, bytes: Uint8Array): BlockMap {\n this.map.set(cid.toString(), bytes)\n return this\n }\n\n get(cid: CID): Uint8Array | undefined {\n return this.map.get(cid.toString())\n }\n\n delete(cid: CID): BlockMap {\n this.map.delete(cid.toString())\n return this\n }\n\n getMany(cids: CID[]): { blocks: BlockMap; missing: CID[] } {\n const missing: CID[] = []\n const blocks = new BlockMap()\n for (const cid of cids) {\n const got = this.map.get(cid.toString())\n if (got) {\n blocks.set(cid, got)\n } else {\n missing.push(cid)\n }\n }\n return { blocks, missing }\n }\n\n has(cid: CID): boolean {\n return this.map.has(cid.toString())\n }\n\n clear(): void {\n this.map.clear()\n }\n\n forEach(cb: (bytes: Uint8Array, cid: CID) => void): void {\n for (const [cid, bytes] of this) cb(bytes, cid)\n }\n\n entries(): Entry[] {\n return Array.from(this, toEntry)\n }\n\n cids(): CID[] {\n return Array.from(this.keys())\n }\n\n addMap(toAdd: BlockMap): BlockMap {\n for (const [cid, bytes] of toAdd) this.set(cid, bytes)\n return this\n }\n\n get size(): number {\n return this.map.size\n }\n\n get byteSize(): number {\n let size = 0\n for (const bytes of this.values()) size += bytes.length\n return size\n }\n\n equals(other: BlockMap): boolean {\n if (this.size !== other.size) {\n return false\n }\n for (const [cid, bytes] of this) {\n const otherBytes = other.get(cid)\n if (!otherBytes) return false\n if (!uint8arrays.equals(bytes, otherBytes)) {\n return false\n }\n }\n return true\n }\n\n *keys(): Generator<CID, void, unknown> {\n for (const key of this.map.keys()) {\n yield CID.parse(key)\n }\n }\n\n *values(): Generator<Uint8Array, void, unknown> {\n yield* this.map.values()\n }\n\n *[Symbol.iterator](): Generator<[CID, Uint8Array], void, unknown> {\n for (const [key, value] of this.map) {\n yield [CID.parse(key), value]\n }\n }\n}\n\nfunction toEntry([cid, bytes]: readonly [CID, Uint8Array]): Entry {\n return { cid, bytes }\n}\n\ntype Entry = {\n cid: CID\n bytes: Uint8Array\n}\n\nexport default BlockMap\n"]}
package/dist/car.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"car.d.ts","sourceRoot":"","sources":["../src/car.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAUtC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAElC,wBAAuB,cAAc,CACnC,IAAI,EAAE,GAAG,GAAG,IAAI,EAChB,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,GAC9B,aAAa,CAAC,UAAU,CAAC,CAgB3B;AAED,eAAO,MAAM,eAAe,GAC1B,MAAM,GAAG,GAAG,IAAI,EAChB,QAAQ,QAAQ,KACf,OAAO,CAAC,UAAU,CAGpB,CAAA;AAED,eAAO,MAAM,iBAAiB,GAC5B,MAAM,GAAG,GAAG,IAAI,EAChB,QAAQ,QAAQ,KACf,aAAa,CAAC,UAAU,CAE1B,CAAA;AAQD,MAAM,MAAM,cAAc,GAAG;IAC3B;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAC9B,CAAA;AAED,eAAO,MAAM,OAAO,GAClB,OAAO,UAAU,EACjB,OAAO,cAAc,KACpB,OAAO,CAAC;IAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,CAO5C,CAAA;AAED,eAAO,MAAM,eAAe,GAC1B,OAAO,UAAU,EACjB,OAAO,cAAc,KACpB,OAAO,CAAC;IAAE,IAAI,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,CAUzC,CAAA;AACD,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG;IACvE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1B,CAAA;AAED,eAAO,MAAM,aAAa,GACxB,KAAK,QAAQ,CAAC,UAAU,CAAC,GAAG,aAAa,CAAC,UAAU,CAAC,EACrD,OAAO,cAAc,KACpB,OAAO,CAAC;IACT,KAAK,EAAE,GAAG,EAAE,CAAA;IACZ,MAAM,EAAE,gBAAgB,CAAA;CACzB,CAEA,CAAA;AAED,eAAO,MAAM,aAAa,GACxB,QAAQ,WAAW,EACnB,OAAO,cAAc,KACpB,OAAO,CAAC;IACT,KAAK,EAAE,GAAG,EAAE,CAAA;IACZ,MAAM,EAAE,gBAAgB,CAAA;CACzB,CAmBA,CAAA;AAoDD,wBAAuB,uBAAuB,CAC5C,GAAG,EAAE,aAAa,CAAC,QAAQ,CAAC,GAC3B,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAKzC;AAuBD,UAAU,WAAW;IACnB,MAAM,EAAE,OAAO,CAAA;IACf,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IAC9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB"}
1
+ {"version":3,"file":"car.d.ts","sourceRoot":"","sources":["../src/car.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAUtC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAElC,wBAAuB,cAAc,CACnC,IAAI,EAAE,GAAG,GAAG,IAAI,EAChB,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,GAC9B,aAAa,CAAC,UAAU,CAAC,CAgB3B;AAED,eAAO,MAAM,eAAe,GAC1B,MAAM,GAAG,GAAG,IAAI,EAChB,QAAQ,QAAQ,KACf,OAAO,CAAC,UAAU,CAGpB,CAAA;AAED,eAAO,MAAM,iBAAiB,GAC5B,MAAM,GAAG,GAAG,IAAI,EAChB,QAAQ,QAAQ,KACf,aAAa,CAAC,UAAU,CAE1B,CAAA;AAQD,MAAM,MAAM,cAAc,GAAG;IAC3B;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAC9B,CAAA;AAED,eAAO,MAAM,OAAO,GAClB,OAAO,UAAU,EACjB,OAAO,cAAc,KACpB,OAAO,CAAC;IAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,CAO5C,CAAA;AAED,eAAO,MAAM,eAAe,GAC1B,OAAO,UAAU,EACjB,OAAO,cAAc,KACpB,OAAO,CAAC;IAAE,IAAI,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,CAUzC,CAAA;AACD,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG;IACvE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1B,CAAA;AAED,eAAO,MAAM,aAAa,GACxB,KAAK,QAAQ,CAAC,UAAU,CAAC,GAAG,aAAa,CAAC,UAAU,CAAC,EACrD,OAAO,cAAc,KACpB,OAAO,CAAC;IACT,KAAK,EAAE,GAAG,EAAE,CAAA;IACZ,MAAM,EAAE,gBAAgB,CAAA;CACzB,CAEA,CAAA;AAED,eAAO,MAAM,aAAa,GACxB,QAAQ,WAAW,EACnB,OAAO,cAAc,KACpB,OAAO,CAAC;IACT,KAAK,EAAE,GAAG,EAAE,CAAA;IACZ,MAAM,EAAE,gBAAgB,CAAA;CACzB,CAmBA,CAAA;AAoDD,wBAAuB,uBAAuB,CAC5C,GAAG,EAAE,aAAa,CAAC,QAAQ,CAAC,GAC3B,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAKzC;AAuBD,UAAU,WAAW;IACnB,MAAM,EAAE,OAAO,CAAA;IACf,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IAC9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB"}
package/dist/car.js CHANGED
@@ -1,5 +1,4 @@
1
1
  "use strict";
2
- /* eslint-disable import/no-deprecated */
3
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
3
  if (k2 === undefined) k2 = k;
5
4
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -219,14 +218,13 @@ class Ui8Reader {
219
218
  }
220
219
  async close() { }
221
220
  }
221
+ /**
222
+ * This code was optimized for performance. See
223
+ * {@link https://github.com/bluesky-social/atproto/pull/4729 #4729} for more details
224
+ * and benchmarks.
225
+ */
222
226
  class BufferedReader {
223
227
  constructor(stream) {
224
- Object.defineProperty(this, "buffer", {
225
- enumerable: true,
226
- configurable: true,
227
- writable: true,
228
- value: new Uint8Array()
229
- });
230
228
  Object.defineProperty(this, "iterator", {
231
229
  enumerable: true,
232
230
  configurable: true,
@@ -239,36 +237,105 @@ class BufferedReader {
239
237
  writable: true,
240
238
  value: false
241
239
  });
240
+ /** fifo list of chunks to consume */
241
+ Object.defineProperty(this, "chunks", {
242
+ enumerable: true,
243
+ configurable: true,
244
+ writable: true,
245
+ value: []
246
+ });
242
247
  this.iterator =
243
248
  Symbol.asyncIterator in stream
244
249
  ? stream[Symbol.asyncIterator]()
245
250
  : stream[Symbol.iterator]();
246
251
  }
247
- async read(bytesToRead) {
248
- await this.readUntilBuffered(bytesToRead);
249
- const value = this.buffer.subarray(0, bytesToRead);
250
- this.buffer = this.buffer.subarray(bytesToRead);
251
- return value;
252
+ /** Number of bytes currently buffered and available for reading */
253
+ get bufferedByteLength() {
254
+ let total = 0;
255
+ for (let i = 0; i < this.chunks.length; i++) {
256
+ total += this.chunks[i].byteLength;
257
+ }
258
+ return total;
252
259
  }
253
- async readUntilBuffered(bytesToRead) {
254
- if (this.isDone) {
255
- return;
260
+ /**
261
+ * @note concurrent reads are **NOT** supported by the current implementation
262
+ * and would require call to readUntilBuffered to be using a fifo lock for
263
+ * read()s to be processed in fifo order.
264
+ */
265
+ async read(bytesToRead) {
266
+ const bytesNeeded = bytesToRead - this.bufferedByteLength;
267
+ if (bytesNeeded > 0 && !this.isDone) {
268
+ await this.readUntilBuffered(bytesNeeded);
256
269
  }
257
- while (this.buffer.length < bytesToRead) {
270
+ const resultLength = Math.min(bytesToRead, this.bufferedByteLength);
271
+ if (resultLength <= 0)
272
+ return new Uint8Array();
273
+ const firstChunk = this.consumeChunk(resultLength);
274
+ if (firstChunk.byteLength === resultLength) {
275
+ // If the data consumed from the first chunk contains all we need, return
276
+ // it as-is. This allows to avoid any copy operation.
277
+ return firstChunk;
278
+ }
279
+ // The first chunk does not have all the data we need. We have to copy
280
+ // multiple chunks into a larger buffer
281
+ const result = new Uint8Array(resultLength);
282
+ let resultWriteIndex = 0;
283
+ // Copy the first chunk into the result buffer
284
+ result.set(firstChunk, resultWriteIndex);
285
+ resultWriteIndex += firstChunk.byteLength;
286
+ // Copy more chunks as needed (we use do-while because we *know* we need
287
+ // more than one chunk)
288
+ do {
289
+ const missingLength = resultLength - resultWriteIndex;
290
+ const currentChunk = this.consumeChunk(missingLength);
291
+ result.set(currentChunk, resultWriteIndex);
292
+ resultWriteIndex += currentChunk.byteLength;
293
+ } while (resultWriteIndex < resultLength);
294
+ return result;
295
+ }
296
+ async readUntilBuffered(bytesNeeded) {
297
+ let bytesRead = 0;
298
+ while (bytesRead < bytesNeeded) {
258
299
  const next = await this.iterator.next();
259
300
  if (next.done) {
260
301
  this.isDone = true;
261
- return;
302
+ break;
303
+ }
304
+ else {
305
+ this.chunks.push(next.value);
306
+ bytesRead += next.value.byteLength;
262
307
  }
263
- this.buffer = ui8.concat([this.buffer, next.value]);
308
+ }
309
+ return bytesRead;
310
+ }
311
+ consumeChunk(bytesToConsume) {
312
+ const firstChunk = this.chunks[0];
313
+ if (bytesToConsume < firstChunk.byteLength) {
314
+ // return a sub-view of the data being read and replace the first chunk
315
+ // with a sub-view that does not contain that data.
316
+ // @NOTE for some reason, subarray() revealed to be 7-8% slower in NodeJS
317
+ // benchmarks.
318
+ // this.chunks[0] = firstChunk.subarray(bytesToConsume)
319
+ // return firstChunk.subarray(0, bytesToConsume)
320
+ this.chunks[0] = new Uint8Array(firstChunk.buffer, firstChunk.byteOffset + bytesToConsume, firstChunk.byteLength - bytesToConsume);
321
+ return new Uint8Array(firstChunk.buffer, firstChunk.byteOffset, bytesToConsume);
322
+ }
323
+ else {
324
+ // First chunk is being read in full, discard it
325
+ this.chunks.shift();
326
+ return firstChunk;
264
327
  }
265
328
  }
266
329
  async close() {
267
- if (!this.isDone && this.iterator.return) {
268
- await this.iterator.return();
330
+ try {
331
+ if (!this.isDone && this.iterator.return) {
332
+ await this.iterator.return();
333
+ }
334
+ }
335
+ finally {
336
+ this.isDone = true;
337
+ this.chunks.length = 0;
269
338
  }
270
- this.isDone = true;
271
- this.buffer = new Uint8Array();
272
339
  }
273
340
  }
274
341
  //# sourceMappingURL=car.js.map
package/dist/car.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"car.js","sourceRoot":"","sources":["../src/car.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-deprecated */\n\nimport { setImmediate } from 'node:timers/promises'\nimport * as cbor from '@ipld/dag-cbor'\nimport { CID } from 'multiformats/cid'\nimport * as ui8 from 'uint8arrays'\nimport * as varint from 'varint'\nimport {\n check,\n parseCidFromBytes,\n schema,\n streamToBuffer,\n verifyCidForBytes,\n} from '@atproto/common'\nimport { BlockMap } from './block-map'\nimport { CarBlock } from './types'\n\nexport async function* writeCarStream(\n root: CID | null,\n blocks: AsyncIterable<CarBlock>,\n): AsyncIterable<Uint8Array> {\n const header = new Uint8Array(\n cbor.encode({\n version: 1,\n roots: root ? [root] : [],\n }),\n )\n yield new Uint8Array(varint.encode(header.byteLength))\n yield header\n for await (const block of blocks) {\n yield new Uint8Array(\n varint.encode(block.cid.bytes.byteLength + block.bytes.byteLength),\n )\n yield block.cid.bytes\n yield block.bytes\n }\n}\n\nexport const blocksToCarFile = (\n root: CID | null,\n blocks: BlockMap,\n): Promise<Uint8Array> => {\n const carStream = blocksToCarStream(root, blocks)\n return streamToBuffer(carStream)\n}\n\nexport const blocksToCarStream = (\n root: CID | null,\n blocks: BlockMap,\n): AsyncIterable<Uint8Array> => {\n return writeCarStream(root, iterateBlocks(blocks))\n}\n\nasync function* iterateBlocks(blocks: BlockMap) {\n for (const entry of blocks.entries()) {\n yield { cid: entry.cid, bytes: entry.bytes }\n }\n}\n\nexport type ReadCarOptions = {\n /**\n * When true, does not verify CID-to-content mapping within CAR.\n */\n skipCidVerification?: boolean\n}\n\nexport const readCar = async (\n bytes: Uint8Array,\n opts?: ReadCarOptions,\n): Promise<{ roots: CID[]; blocks: BlockMap }> => {\n const { roots, blocks } = await readCarReader(new Ui8Reader(bytes), opts)\n const blockMap = new BlockMap()\n for await (const block of blocks) {\n blockMap.set(block.cid, block.bytes)\n }\n return { roots, blocks: blockMap }\n}\n\nexport const readCarWithRoot = async (\n bytes: Uint8Array,\n opts?: ReadCarOptions,\n): Promise<{ root: CID; blocks: BlockMap }> => {\n const { roots, blocks } = await readCar(bytes, opts)\n if (roots.length !== 1) {\n throw new Error(`Expected one root, got ${roots.length}`)\n }\n const root = roots[0]\n return {\n root,\n blocks,\n }\n}\nexport type CarBlockIterable = AsyncGenerator<CarBlock, void, unknown> & {\n dump: () => Promise<void>\n}\n\nexport const readCarStream = async (\n car: Iterable<Uint8Array> | AsyncIterable<Uint8Array>,\n opts?: ReadCarOptions,\n): Promise<{\n roots: CID[]\n blocks: CarBlockIterable\n}> => {\n return readCarReader(new BufferedReader(car), opts)\n}\n\nexport const readCarReader = async (\n reader: BytesReader,\n opts?: ReadCarOptions,\n): Promise<{\n roots: CID[]\n blocks: CarBlockIterable\n}> => {\n try {\n const headerSize = await readVarint(reader)\n if (headerSize === null) {\n throw new Error('Could not parse CAR header')\n }\n const headerBytes = await reader.read(headerSize)\n const header = cbor.decode(headerBytes)\n if (!check.is(header, schema.carHeader)) {\n throw new Error('Could not parse CAR header')\n }\n return {\n roots: header.roots,\n blocks: readCarBlocksIter(reader, opts),\n }\n } catch (err) {\n await reader.close()\n throw err\n }\n}\n\nconst readCarBlocksIter = (\n reader: BytesReader,\n opts?: ReadCarOptions,\n): CarBlockIterable => {\n let generator = readCarBlocksIterGenerator(reader)\n if (!opts?.skipCidVerification) {\n generator = verifyIncomingCarBlocks(generator)\n }\n return Object.assign(generator, {\n async dump() {\n // try/finally to ensure that reader.close is called even if blocks.return throws.\n try {\n // Prevent the iterator from being started after this method is called.\n await generator.return()\n } finally {\n // @NOTE the \"finally\" block of the async generator won't be called\n // if the iteration was never started so we need to manually close here.\n await reader.close()\n }\n },\n })\n}\n\nasync function* readCarBlocksIterGenerator(\n reader: BytesReader,\n): AsyncGenerator<CarBlock, void, unknown> {\n let blocks = 0\n try {\n while (!reader.isDone) {\n const blockSize = await readVarint(reader)\n if (blockSize === null) {\n break\n }\n const blockBytes = await reader.read(blockSize)\n const cid = parseCidFromBytes(blockBytes.subarray(0, 36))\n const bytes = blockBytes.subarray(36)\n yield { cid, bytes }\n\n // yield to the event loop every 25 blocks\n // in the case the incoming CAR is synchronous, this can end up jamming up the thread\n blocks++\n if (blocks % 25 === 0) {\n await setImmediate()\n }\n }\n } finally {\n await reader.close()\n }\n}\n\nexport async function* verifyIncomingCarBlocks(\n car: AsyncIterable<CarBlock>,\n): AsyncGenerator<CarBlock, void, unknown> {\n for await (const block of car) {\n await verifyCidForBytes(block.cid, block.bytes)\n yield block\n }\n}\n\nconst readVarint = async (reader: BytesReader): Promise<number | null> => {\n let done = false\n const bytes: Uint8Array[] = []\n while (!done) {\n const byte = await reader.read(1)\n if (byte.byteLength === 0) {\n if (bytes.length > 0) {\n throw new Error('could not parse varint')\n } else {\n return null\n }\n }\n bytes.push(byte)\n if (byte[0] < 128) {\n done = true\n }\n }\n const concatted = ui8.concat(bytes)\n return varint.decode(concatted)\n}\n\ninterface BytesReader {\n isDone: boolean\n read(bytesToRead: number): Promise<Uint8Array>\n close(): Promise<void>\n}\n\nclass Ui8Reader implements BytesReader {\n idx = 0\n isDone = false\n\n constructor(public bytes: Uint8Array) {}\n\n async read(bytesToRead: number): Promise<Uint8Array> {\n const value = this.bytes.subarray(this.idx, this.idx + bytesToRead)\n this.idx += bytesToRead\n if (this.idx >= this.bytes.length) {\n this.isDone = true\n }\n return value\n }\n\n async close(): Promise<void> {}\n}\n\nclass BufferedReader implements BytesReader {\n buffer: Uint8Array = new Uint8Array()\n iterator: Iterator<Uint8Array> | AsyncIterator<Uint8Array>\n isDone = false\n\n constructor(stream: Iterable<Uint8Array> | AsyncIterable<Uint8Array>) {\n this.iterator =\n Symbol.asyncIterator in stream\n ? stream[Symbol.asyncIterator]()\n : stream[Symbol.iterator]()\n }\n\n async read(bytesToRead: number): Promise<Uint8Array> {\n await this.readUntilBuffered(bytesToRead)\n const value = this.buffer.subarray(0, bytesToRead)\n this.buffer = this.buffer.subarray(bytesToRead)\n return value\n }\n\n private async readUntilBuffered(bytesToRead: number) {\n if (this.isDone) {\n return\n }\n while (this.buffer.length < bytesToRead) {\n const next = await this.iterator.next()\n if (next.done) {\n this.isDone = true\n return\n }\n this.buffer = ui8.concat([this.buffer, next.value])\n }\n }\n\n async close(): Promise<void> {\n if (!this.isDone && this.iterator.return) {\n await this.iterator.return()\n }\n this.isDone = true\n this.buffer = new Uint8Array()\n }\n}\n"]}
1
+ {"version":3,"file":"car.js","sourceRoot":"","sources":["../src/car.ts"],"names":[],"mappings":"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","sourcesContent":["import { setImmediate } from 'node:timers/promises'\nimport * as cbor from '@ipld/dag-cbor'\nimport { CID } from 'multiformats/cid'\nimport * as ui8 from 'uint8arrays'\nimport * as varint from 'varint'\nimport {\n check,\n parseCidFromBytes,\n schema,\n streamToBuffer,\n verifyCidForBytes,\n} from '@atproto/common'\nimport { BlockMap } from './block-map'\nimport { CarBlock } from './types'\n\nexport async function* writeCarStream(\n root: CID | null,\n blocks: AsyncIterable<CarBlock>,\n): AsyncIterable<Uint8Array> {\n const header = new Uint8Array(\n cbor.encode({\n version: 1,\n roots: root ? [root] : [],\n }),\n )\n yield new Uint8Array(varint.encode(header.byteLength))\n yield header\n for await (const block of blocks) {\n yield new Uint8Array(\n varint.encode(block.cid.bytes.byteLength + block.bytes.byteLength),\n )\n yield block.cid.bytes\n yield block.bytes\n }\n}\n\nexport const blocksToCarFile = (\n root: CID | null,\n blocks: BlockMap,\n): Promise<Uint8Array> => {\n const carStream = blocksToCarStream(root, blocks)\n return streamToBuffer(carStream)\n}\n\nexport const blocksToCarStream = (\n root: CID | null,\n blocks: BlockMap,\n): AsyncIterable<Uint8Array> => {\n return writeCarStream(root, iterateBlocks(blocks))\n}\n\nasync function* iterateBlocks(blocks: BlockMap) {\n for (const entry of blocks.entries()) {\n yield { cid: entry.cid, bytes: entry.bytes }\n }\n}\n\nexport type ReadCarOptions = {\n /**\n * When true, does not verify CID-to-content mapping within CAR.\n */\n skipCidVerification?: boolean\n}\n\nexport const readCar = async (\n bytes: Uint8Array,\n opts?: ReadCarOptions,\n): Promise<{ roots: CID[]; blocks: BlockMap }> => {\n const { roots, blocks } = await readCarReader(new Ui8Reader(bytes), opts)\n const blockMap = new BlockMap()\n for await (const block of blocks) {\n blockMap.set(block.cid, block.bytes)\n }\n return { roots, blocks: blockMap }\n}\n\nexport const readCarWithRoot = async (\n bytes: Uint8Array,\n opts?: ReadCarOptions,\n): Promise<{ root: CID; blocks: BlockMap }> => {\n const { roots, blocks } = await readCar(bytes, opts)\n if (roots.length !== 1) {\n throw new Error(`Expected one root, got ${roots.length}`)\n }\n const root = roots[0]\n return {\n root,\n blocks,\n }\n}\nexport type CarBlockIterable = AsyncGenerator<CarBlock, void, unknown> & {\n dump: () => Promise<void>\n}\n\nexport const readCarStream = async (\n car: Iterable<Uint8Array> | AsyncIterable<Uint8Array>,\n opts?: ReadCarOptions,\n): Promise<{\n roots: CID[]\n blocks: CarBlockIterable\n}> => {\n return readCarReader(new BufferedReader(car), opts)\n}\n\nexport const readCarReader = async (\n reader: BytesReader,\n opts?: ReadCarOptions,\n): Promise<{\n roots: CID[]\n blocks: CarBlockIterable\n}> => {\n try {\n const headerSize = await readVarint(reader)\n if (headerSize === null) {\n throw new Error('Could not parse CAR header')\n }\n const headerBytes = await reader.read(headerSize)\n const header = cbor.decode(headerBytes)\n if (!check.is(header, schema.carHeader)) {\n throw new Error('Could not parse CAR header')\n }\n return {\n roots: header.roots,\n blocks: readCarBlocksIter(reader, opts),\n }\n } catch (err) {\n await reader.close()\n throw err\n }\n}\n\nconst readCarBlocksIter = (\n reader: BytesReader,\n opts?: ReadCarOptions,\n): CarBlockIterable => {\n let generator = readCarBlocksIterGenerator(reader)\n if (!opts?.skipCidVerification) {\n generator = verifyIncomingCarBlocks(generator)\n }\n return Object.assign(generator, {\n async dump() {\n // try/finally to ensure that reader.close is called even if blocks.return throws.\n try {\n // Prevent the iterator from being started after this method is called.\n await generator.return()\n } finally {\n // @NOTE the \"finally\" block of the async generator won't be called\n // if the iteration was never started so we need to manually close here.\n await reader.close()\n }\n },\n })\n}\n\nasync function* readCarBlocksIterGenerator(\n reader: BytesReader,\n): AsyncGenerator<CarBlock, void, unknown> {\n let blocks = 0\n try {\n while (!reader.isDone) {\n const blockSize = await readVarint(reader)\n if (blockSize === null) {\n break\n }\n const blockBytes = await reader.read(blockSize)\n const cid = parseCidFromBytes(blockBytes.subarray(0, 36))\n const bytes = blockBytes.subarray(36)\n yield { cid, bytes }\n\n // yield to the event loop every 25 blocks\n // in the case the incoming CAR is synchronous, this can end up jamming up the thread\n blocks++\n if (blocks % 25 === 0) {\n await setImmediate()\n }\n }\n } finally {\n await reader.close()\n }\n}\n\nexport async function* verifyIncomingCarBlocks(\n car: AsyncIterable<CarBlock>,\n): AsyncGenerator<CarBlock, void, unknown> {\n for await (const block of car) {\n await verifyCidForBytes(block.cid, block.bytes)\n yield block\n }\n}\n\nconst readVarint = async (reader: BytesReader): Promise<number | null> => {\n let done = false\n const bytes: Uint8Array[] = []\n while (!done) {\n const byte = await reader.read(1)\n if (byte.byteLength === 0) {\n if (bytes.length > 0) {\n throw new Error('could not parse varint')\n } else {\n return null\n }\n }\n bytes.push(byte)\n if (byte[0] < 128) {\n done = true\n }\n }\n const concatted = ui8.concat(bytes)\n return varint.decode(concatted)\n}\n\ninterface BytesReader {\n isDone: boolean\n read(bytesToRead: number): Promise<Uint8Array>\n close(): Promise<void>\n}\n\nclass Ui8Reader implements BytesReader {\n idx = 0\n isDone = false\n\n constructor(public bytes: Uint8Array) {}\n\n async read(bytesToRead: number): Promise<Uint8Array> {\n const value = this.bytes.subarray(this.idx, this.idx + bytesToRead)\n this.idx += bytesToRead\n if (this.idx >= this.bytes.length) {\n this.isDone = true\n }\n return value\n }\n\n async close(): Promise<void> {}\n}\n\n/**\n * This code was optimized for performance. See\n * {@link https://github.com/bluesky-social/atproto/pull/4729 #4729} for more details\n * and benchmarks.\n */\nclass BufferedReader implements BytesReader {\n iterator: Iterator<Uint8Array> | AsyncIterator<Uint8Array>\n isDone = false\n\n /** fifo list of chunks to consume */\n private chunks: Uint8Array[] = []\n\n constructor(stream: Iterable<Uint8Array> | AsyncIterable<Uint8Array>) {\n this.iterator =\n Symbol.asyncIterator in stream\n ? stream[Symbol.asyncIterator]()\n : stream[Symbol.iterator]()\n }\n\n /** Number of bytes currently buffered and available for reading */\n get bufferedByteLength() {\n let total = 0\n for (let i = 0; i < this.chunks.length; i++) {\n total += this.chunks[i].byteLength\n }\n return total\n }\n\n /**\n * @note concurrent reads are **NOT** supported by the current implementation\n * and would require call to readUntilBuffered to be using a fifo lock for\n * read()s to be processed in fifo order.\n */\n async read(bytesToRead: number): Promise<Uint8Array> {\n const bytesNeeded = bytesToRead - this.bufferedByteLength\n if (bytesNeeded > 0 && !this.isDone) {\n await this.readUntilBuffered(bytesNeeded)\n }\n\n const resultLength = Math.min(bytesToRead, this.bufferedByteLength)\n if (resultLength <= 0) return new Uint8Array()\n\n const firstChunk = this.consumeChunk(resultLength)\n if (firstChunk.byteLength === resultLength) {\n // If the data consumed from the first chunk contains all we need, return\n // it as-is. This allows to avoid any copy operation.\n return firstChunk\n }\n\n // The first chunk does not have all the data we need. We have to copy\n // multiple chunks into a larger buffer\n const result = new Uint8Array(resultLength)\n let resultWriteIndex = 0\n\n // Copy the first chunk into the result buffer\n result.set(firstChunk, resultWriteIndex)\n resultWriteIndex += firstChunk.byteLength\n\n // Copy more chunks as needed (we use do-while because we *know* we need\n // more than one chunk)\n do {\n const missingLength = resultLength - resultWriteIndex\n const currentChunk = this.consumeChunk(missingLength)\n\n result.set(currentChunk, resultWriteIndex)\n resultWriteIndex += currentChunk.byteLength\n } while (resultWriteIndex < resultLength)\n\n return result\n }\n\n private async readUntilBuffered(bytesNeeded: number) {\n let bytesRead = 0\n while (bytesRead < bytesNeeded) {\n const next = await this.iterator.next()\n if (next.done) {\n this.isDone = true\n break\n } else {\n this.chunks.push(next.value)\n bytesRead += next.value.byteLength\n }\n }\n return bytesRead\n }\n\n private consumeChunk(bytesToConsume: number) {\n const firstChunk = this.chunks[0]!\n if (bytesToConsume < firstChunk.byteLength) {\n // return a sub-view of the data being read and replace the first chunk\n // with a sub-view that does not contain that data.\n\n // @NOTE for some reason, subarray() revealed to be 7-8% slower in NodeJS\n // benchmarks.\n\n // this.chunks[0] = firstChunk.subarray(bytesToConsume)\n // return firstChunk.subarray(0, bytesToConsume)\n\n this.chunks[0] = new Uint8Array(\n firstChunk.buffer,\n firstChunk.byteOffset + bytesToConsume,\n firstChunk.byteLength - bytesToConsume,\n )\n return new Uint8Array(\n firstChunk.buffer,\n firstChunk.byteOffset,\n bytesToConsume,\n )\n } else {\n // First chunk is being read in full, discard it\n this.chunks.shift()\n return firstChunk\n }\n }\n\n async close(): Promise<void> {\n try {\n if (!this.isDone && this.iterator.return) {\n await this.iterator.return()\n }\n } finally {\n this.isDone = true\n this.chunks.length = 0\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"mst.d.ts","sourceRoot":"","sources":["../../src/mst/mst.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mst.d.ts","sourceRoot":"","sources":["../../src/mst/mst.ts"],"names":[],"mappings":"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"}
package/dist/mst/mst.js CHANGED
@@ -1,5 +1,4 @@
1
1
  "use strict";
2
- /* eslint-disable import/no-deprecated */
3
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
3
  if (k2 === undefined) k2 = k;
5
4
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -1 +1 @@
1
- {"version":3,"file":"mst.js","sourceRoot":"","sources":["../../src/mst/mst.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-deprecated */\n\nimport { CID } from 'multiformats'\nimport { z } from 'zod'\nimport { cidForCbor, dataToCborBlock, schema as common } from '@atproto/common'\nimport { BlockMap } from '../block-map'\nimport { CidSet } from '../cid-set'\nimport { MissingBlockError, MissingBlocksError } from '../error'\nimport * as parse from '../parse'\nimport { ReadableBlockstore } from '../storage'\nimport { CarBlock } from '../types'\nimport * as util from './util'\n\n/**\n * This is an implementation of a Merkle Search Tree (MST)\n * The data structure is described here: https://hal.inria.fr/hal-02303490/document\n * The MST is an ordered, insert-order-independent, deterministic tree.\n * Keys are laid out in alphabetic order.\n * The key insight of an MST is that each key is hashed and starting 0s are counted\n * to determine which layer it falls on (5 zeros for ~32 fanout).\n * This is a merkle tree, so each subtree is referred to by it's hash (CID).\n * When a leaf is changed, ever tree on the path to that leaf is changed as well,\n * thereby updating the root hash.\n *\n * For atproto, we use SHA-256 as the key hashing algorithm, and ~4 fanout\n * (2-bits of zero per layer).\n */\n\n/**\n * A couple notes on CBOR encoding:\n *\n * There are never two neighboring subtrees.\n * Therefore, we can represent a node as an array of\n * leaves & pointers to their right neighbor (possibly null),\n * along with a pointer to the left-most subtree (also possibly null).\n *\n * Most keys in a subtree will have overlap.\n * We do compression on prefixes by describing keys as:\n * - the length of the prefix that it shares in common with the preceding key\n * - the rest of the string\n *\n * For example:\n * If the first leaf in a tree is `bsky/posts/abcdefg` and the second is `bsky/posts/abcdehi`\n * Then the first will be described as `prefix: 0, key: 'bsky/posts/abcdefg'`,\n * and the second will be described as `prefix: 16, key: 'hi'.`\n */\nconst subTreePointer = z.nullable(common.cid)\nconst treeEntry = z.object({\n p: z.number(), // prefix count of ascii chars that this key shares with the prev key\n k: common.bytes, // the rest of the key outside the shared prefix\n v: common.cid, // value\n t: subTreePointer, // next subtree (to the right of leaf)\n})\nconst nodeData = z.object({\n l: subTreePointer, // left-most subtree\n e: z.array(treeEntry), //entries\n})\nexport type NodeData = z.infer<typeof nodeData>\n\nexport const nodeDataDef = {\n name: 'mst node',\n schema: nodeData,\n}\n\nexport type NodeEntry = MST | Leaf\n\nexport type MstOpts = {\n layer: number\n}\n\nexport class MST {\n storage: ReadableBlockstore\n entries: NodeEntry[] | null\n layer: number | null\n pointer: CID\n outdatedPointer = false\n\n constructor(\n storage: ReadableBlockstore,\n pointer: CID,\n entries: NodeEntry[] | null,\n layer: number | null,\n ) {\n this.storage = storage\n this.entries = entries\n this.layer = layer\n this.pointer = pointer\n }\n\n static async create(\n storage: ReadableBlockstore,\n entries: NodeEntry[] = [],\n opts?: Partial<MstOpts>,\n ): Promise<MST> {\n const pointer = await util.cidForEntries(entries)\n const { layer = null } = opts || {}\n return new MST(storage, pointer, entries, layer)\n }\n\n static async fromData(\n storage: ReadableBlockstore,\n data: NodeData,\n opts?: Partial<MstOpts>,\n ): Promise<MST> {\n const { layer = null } = opts || {}\n const entries = await util.deserializeNodeData(storage, data, opts)\n const pointer = await cidForCbor(data)\n return new MST(storage, pointer, entries, layer)\n }\n\n // this is really a *lazy* load, doesn't actually touch storage\n static load(\n storage: ReadableBlockstore,\n cid: CID,\n opts?: Partial<MstOpts>,\n ): MST {\n const { layer = null } = opts || {}\n return new MST(storage, cid, null, layer)\n }\n\n // Immutability\n // -------------------\n\n // We never mutate an MST, we just return a new MST with updated values\n async newTree(entries: NodeEntry[]): Promise<MST> {\n const mst = new MST(this.storage, this.pointer, entries, this.layer)\n mst.outdatedPointer = true\n return mst\n }\n\n // Getters (lazy load)\n // -------------------\n\n // We don't want to load entries of every subtree, just the ones we need\n async getEntries(): Promise<NodeEntry[]> {\n if (this.entries) return [...this.entries]\n if (this.pointer) {\n const data = await this.storage.readObj(this.pointer, nodeDataDef)\n const firstLeaf = data.e[0]\n const layer =\n firstLeaf !== undefined\n ? await util.leadingZerosOnHash(firstLeaf.k)\n : undefined\n this.entries = await util.deserializeNodeData(this.storage, data, {\n layer,\n })\n\n return this.entries\n }\n throw new Error('No entries or CID provided')\n }\n\n // We don't hash the node on every mutation for performance reasons\n // Instead we keep track of whether the pointer is outdated and only (recursively) calculate when needed\n async getPointer(): Promise<CID> {\n if (!this.outdatedPointer) return this.pointer\n const { cid } = await this.serialize()\n this.pointer = cid\n this.outdatedPointer = false\n return this.pointer\n }\n\n async serialize(): Promise<{ cid: CID; bytes: Uint8Array }> {\n let entries = await this.getEntries()\n const outdated = entries.filter(\n (e) => e.isTree() && e.outdatedPointer,\n ) as MST[]\n if (outdated.length > 0) {\n await Promise.all(outdated.map((e) => e.getPointer()))\n entries = await this.getEntries()\n }\n const data = util.serializeNodeData(entries)\n const block = await dataToCborBlock(data)\n return {\n cid: block.cid,\n bytes: block.bytes,\n }\n }\n\n // In most cases, we get the layer of a node from a hint on creation\n // In the case of the topmost node in the tree, we look for a key in the node & determine the layer\n // In the case where we don't find one, we recurse down until we do.\n // If we still can't find one, then we have an empty tree and the node is layer 0\n async getLayer(): Promise<number> {\n this.layer = await this.attemptGetLayer()\n if (this.layer === null) this.layer = 0\n return this.layer\n }\n\n async attemptGetLayer(): Promise<number | null> {\n if (this.layer !== null) return this.layer\n const entries = await this.getEntries()\n let layer = await util.layerForEntries(entries)\n if (layer === null) {\n for (const entry of entries) {\n if (entry.isTree()) {\n const childLayer = await entry.attemptGetLayer()\n if (childLayer !== null) {\n layer = childLayer + 1\n break\n }\n }\n }\n }\n if (layer !== null) this.layer = layer\n return layer\n }\n\n // Core functionality\n // -------------------\n\n // Return the necessary blocks to persist the MST to repo storage\n async getUnstoredBlocks(): Promise<{ root: CID; blocks: BlockMap }> {\n const blocks = new BlockMap()\n const pointer = await this.getPointer()\n const alreadyHas = await this.storage.has(pointer)\n if (alreadyHas) return { root: pointer, blocks }\n const entries = await this.getEntries()\n const data = util.serializeNodeData(entries)\n await blocks.add(data)\n for (const entry of entries) {\n if (entry.isTree()) {\n const subtree = await entry.getUnstoredBlocks()\n blocks.addMap(subtree.blocks)\n }\n }\n return { root: pointer, blocks: blocks }\n }\n\n // Adds a new leaf for the given key/value pair\n // Throws if a leaf with that key already exists\n async add(key: string, value: CID, knownZeros?: number): Promise<MST> {\n util.ensureValidMstKey(key)\n const keyZeros = knownZeros ?? (await util.leadingZerosOnHash(key))\n const layer = await this.getLayer()\n const newLeaf = new Leaf(key, value)\n if (keyZeros === layer) {\n // it belongs in this layer\n const index = await this.findGtOrEqualLeafIndex(key)\n const found = await this.atIndex(index)\n if (found?.isLeaf() && found.key === key) {\n throw new Error(`There is already a value at key: ${key}`)\n }\n const prevNode = await this.atIndex(index - 1)\n if (!prevNode || prevNode.isLeaf()) {\n // if entry before is a leaf, (or we're on far left) we can just splice in\n return this.spliceIn(newLeaf, index)\n } else {\n // else we try to split the subtree around the key\n const splitSubTree = await prevNode.splitAround(key)\n return this.replaceWithSplit(\n index - 1,\n splitSubTree[0],\n newLeaf,\n splitSubTree[1],\n )\n }\n } else if (keyZeros < layer) {\n // it belongs on a lower layer\n const index = await this.findGtOrEqualLeafIndex(key)\n const prevNode = await this.atIndex(index - 1)\n if (prevNode && prevNode.isTree()) {\n // if entry before is a tree, we add it to that tree\n const newSubtree = await prevNode.add(key, value, keyZeros)\n return this.updateEntry(index - 1, newSubtree)\n } else {\n const subTree = await this.createChild()\n const newSubTree = await subTree.add(key, value, keyZeros)\n return this.spliceIn(newSubTree, index)\n }\n } else {\n // it belongs on a higher layer & we must push the rest of the tree down\n const split = await this.splitAround(key)\n // if the newly added key has >=2 more leading zeros than the current highest layer\n // then we need to add in structural nodes in between as well\n let left: MST | null = split[0]\n let right: MST | null = split[1]\n const layer = await this.getLayer()\n const extraLayersToAdd = keyZeros - layer\n // intentionally starting at 1, since first layer is taken care of by split\n for (let i = 1; i < extraLayersToAdd; i++) {\n if (left !== null) {\n left = await left.createParent()\n }\n if (right !== null) {\n right = await right.createParent()\n }\n }\n const updated: NodeEntry[] = []\n if (left) updated.push(left)\n updated.push(new Leaf(key, value))\n if (right) updated.push(right)\n const newRoot = await MST.create(this.storage, updated, {\n layer: keyZeros,\n })\n newRoot.outdatedPointer = true\n return newRoot\n }\n }\n\n // Gets the value at the given key\n async get(key: string): Promise<CID | null> {\n const index = await this.findGtOrEqualLeafIndex(key)\n const found = await this.atIndex(index)\n if (found && found.isLeaf() && found.key === key) {\n return found.value\n }\n const prev = await this.atIndex(index - 1)\n if (prev && prev.isTree()) {\n return prev.get(key)\n }\n return null\n }\n\n // Edits the value at the given key\n // Throws if the given key does not exist\n async update(key: string, value: CID): Promise<MST> {\n util.ensureValidMstKey(key)\n const index = await this.findGtOrEqualLeafIndex(key)\n const found = await this.atIndex(index)\n if (found && found.isLeaf() && found.key === key) {\n return this.updateEntry(index, new Leaf(key, value))\n }\n const prev = await this.atIndex(index - 1)\n if (prev && prev.isTree()) {\n const updatedTree = await prev.update(key, value)\n return this.updateEntry(index - 1, updatedTree)\n }\n throw new Error(`Could not find a record with key: ${key}`)\n }\n\n // Deletes the value at the given key\n async delete(key: string): Promise<MST> {\n const altered = await this.deleteRecurse(key)\n return altered.trimTop()\n }\n\n async deleteRecurse(key: string): Promise<MST> {\n const index = await this.findGtOrEqualLeafIndex(key)\n const found = await this.atIndex(index)\n // if found, remove it on this level\n if (found?.isLeaf() && found.key === key) {\n const prev = await this.atIndex(index - 1)\n const next = await this.atIndex(index + 1)\n if (prev?.isTree() && next?.isTree()) {\n const merged = await prev.appendMerge(next)\n return this.newTree([\n ...(await this.slice(0, index - 1)),\n merged,\n ...(await this.slice(index + 2)),\n ])\n } else {\n return this.removeEntry(index)\n }\n }\n // else recurse down to find it\n const prev = await this.atIndex(index - 1)\n if (prev?.isTree()) {\n const subtree = await prev.deleteRecurse(key)\n const subTreeEntries = await subtree.getEntries()\n if (subTreeEntries.length === 0) {\n return this.removeEntry(index - 1)\n } else {\n return this.updateEntry(index - 1, subtree)\n }\n } else {\n throw new Error(`Could not find a record with key: ${key}`)\n }\n }\n\n // Simple Operations\n // -------------------\n\n // update entry in place\n async updateEntry(index: number, entry: NodeEntry): Promise<MST> {\n const update = [\n ...(await this.slice(0, index)),\n entry,\n ...(await this.slice(index + 1)),\n ]\n return this.newTree(update)\n }\n\n // remove entry at index\n async removeEntry(index: number): Promise<MST> {\n const updated = [\n ...(await this.slice(0, index)),\n ...(await this.slice(index + 1)),\n ]\n return this.newTree(updated)\n }\n\n // append entry to end of the node\n async append(entry: NodeEntry): Promise<MST> {\n const entries = await this.getEntries()\n return this.newTree([...entries, entry])\n }\n\n // prepend entry to start of the node\n async prepend(entry: NodeEntry): Promise<MST> {\n const entries = await this.getEntries()\n return this.newTree([entry, ...entries])\n }\n\n // returns entry at index\n async atIndex(index: number): Promise<NodeEntry | null> {\n const entries = await this.getEntries()\n return entries[index] ?? null\n }\n\n // returns a slice of the node (like array.slice)\n async slice(\n start?: number | undefined,\n end?: number | undefined,\n ): Promise<NodeEntry[]> {\n const entries = await this.getEntries()\n return entries.slice(start, end)\n }\n\n // inserts entry at index\n async spliceIn(entry: NodeEntry, index: number): Promise<MST> {\n const update = [\n ...(await this.slice(0, index)),\n entry,\n ...(await this.slice(index)),\n ]\n return this.newTree(update)\n }\n\n // replaces an entry with [ Maybe(tree), Leaf, Maybe(tree) ]\n async replaceWithSplit(\n index: number,\n left: MST | null,\n leaf: Leaf,\n right: MST | null,\n ): Promise<MST> {\n const update = await this.slice(0, index)\n if (left) update.push(left)\n update.push(leaf)\n if (right) update.push(right)\n update.push(...(await this.slice(index + 1)))\n return this.newTree(update)\n }\n\n // if the topmost node in the tree only points to another tree, trim the top and return the subtree\n async trimTop(): Promise<MST> {\n let entries: NodeEntry[]\n try {\n entries = await this.getEntries()\n } catch (err) {\n if (err instanceof MissingBlockError) {\n return this\n } else {\n throw err\n }\n }\n if (entries.length === 1 && entries[0].isTree()) {\n return entries[0].trimTop()\n } else {\n return this\n }\n }\n\n // Subtree & Splits\n // -------------------\n\n // Recursively splits a sub tree around a given key\n async splitAround(key: string): Promise<[MST | null, MST | null]> {\n const index = await this.findGtOrEqualLeafIndex(key)\n // split tree around key\n const leftData = await this.slice(0, index)\n const rightData = await this.slice(index)\n let left = await this.newTree(leftData)\n let right = await this.newTree(rightData)\n\n // if the far right of the left side is a subtree,\n // we need to split it on the key as well\n const lastInLeft = leftData[leftData.length - 1]\n if (lastInLeft?.isTree()) {\n left = await left.removeEntry(leftData.length - 1)\n const split = await lastInLeft.splitAround(key)\n if (split[0]) {\n left = await left.append(split[0])\n }\n if (split[1]) {\n right = await right.prepend(split[1])\n }\n }\n\n return [\n (await left.getEntries()).length > 0 ? left : null,\n (await right.getEntries()).length > 0 ? right : null,\n ]\n }\n\n // The simple merge case where every key in the right tree is greater than every key in the left tree\n // (used primarily for deletes)\n async appendMerge(toMerge: MST): Promise<MST> {\n if ((await this.getLayer()) !== (await toMerge.getLayer())) {\n throw new Error(\n 'Trying to merge two nodes from different layers of the MST',\n )\n }\n const thisEntries = await this.getEntries()\n const toMergeEntries = await toMerge.getEntries()\n const lastInLeft = thisEntries[thisEntries.length - 1]\n const firstInRight = toMergeEntries[0]\n if (lastInLeft?.isTree() && firstInRight?.isTree()) {\n const merged = await lastInLeft.appendMerge(firstInRight)\n return this.newTree([\n ...thisEntries.slice(0, thisEntries.length - 1),\n merged,\n ...toMergeEntries.slice(1),\n ])\n } else {\n return this.newTree([...thisEntries, ...toMergeEntries])\n }\n }\n\n // Create relatives\n // -------------------\n\n async createChild(): Promise<MST> {\n const layer = await this.getLayer()\n return MST.create(this.storage, [], {\n layer: layer - 1,\n })\n }\n\n async createParent(): Promise<MST> {\n const layer = await this.getLayer()\n const parent = await MST.create(this.storage, [this], {\n layer: layer + 1,\n })\n parent.outdatedPointer = true\n return parent\n }\n\n // Finding insertion points\n // -------------------\n\n // finds index of first leaf node that is greater than or equal to the value\n async findGtOrEqualLeafIndex(key: string): Promise<number> {\n const entries = await this.getEntries()\n const maybeIndex = entries.findIndex(\n (entry) => entry.isLeaf() && entry.key >= key,\n )\n // if we can't find, we're on the end\n return maybeIndex >= 0 ? maybeIndex : entries.length\n }\n\n // List operations (partial tree traversal)\n // -------------------\n\n // @TODO write tests for these\n\n // Walk tree starting at key\n async *walkFrom(key: string): AsyncIterable<NodeEntry> {\n yield this\n const index = await this.findGtOrEqualLeafIndex(key)\n const entries = await this.getEntries()\n const found = entries[index]\n if (found && found.isLeaf() && found.key === key) {\n yield found\n } else {\n const prev = entries[index - 1]\n if (prev) {\n if (prev.isLeaf() && prev.key === key) {\n yield prev\n } else if (prev.isTree()) {\n yield* prev.walkFrom(key)\n }\n }\n }\n\n for (let i = index; i < entries.length; i++) {\n const entry = entries[i]\n if (entry.isLeaf()) {\n yield entry\n } else {\n yield* entry.walkFrom(key)\n }\n }\n }\n\n async *walkLeavesFrom(key: string): AsyncIterable<Leaf> {\n for await (const node of this.walkFrom(key)) {\n if (node.isLeaf()) {\n yield node\n }\n }\n }\n\n async list(\n count = Number.MAX_SAFE_INTEGER,\n after?: string,\n before?: string,\n ): Promise<Leaf[]> {\n const vals: Leaf[] = []\n for await (const leaf of this.walkLeavesFrom(after || '')) {\n if (leaf.key === after) continue\n if (vals.length >= count) break\n if (before && leaf.key >= before) break\n vals.push(leaf)\n }\n return vals\n }\n\n async listWithPrefix(\n prefix: string,\n count = Number.MAX_SAFE_INTEGER,\n ): Promise<Leaf[]> {\n const vals: Leaf[] = []\n for await (const leaf of this.walkLeavesFrom(prefix)) {\n if (vals.length >= count || !leaf.key.startsWith(prefix)) break\n vals.push(leaf)\n }\n return vals\n }\n\n // Full tree traversal\n // -------------------\n\n // Walk full tree & emit nodes, consumer can bail at any point by returning false\n async *walk(): AsyncIterable<NodeEntry> {\n yield this\n const entries = await this.getEntries()\n for (const entry of entries) {\n if (entry.isTree()) {\n for await (const e of entry.walk()) {\n yield e\n }\n } else {\n yield entry\n }\n }\n }\n\n // Walk full tree & emit nodes, consumer can bail at any point by returning false\n async paths(): Promise<NodeEntry[][]> {\n const entries = await this.getEntries()\n let paths: NodeEntry[][] = []\n for (const entry of entries) {\n if (entry.isLeaf()) {\n paths.push([entry])\n }\n if (entry.isTree()) {\n const subPaths = await entry.paths()\n paths = [...paths, ...subPaths.map((p) => [entry, ...p])]\n }\n }\n return paths\n }\n\n // Walks tree & returns all nodes\n async allNodes(): Promise<NodeEntry[]> {\n const nodes: NodeEntry[] = []\n for await (const entry of this.walk()) {\n nodes.push(entry)\n }\n return nodes\n }\n\n // Walks tree & returns all cids\n async allCids(): Promise<CidSet> {\n const cids = new CidSet()\n const entries = await this.getEntries()\n for (const entry of entries) {\n if (entry.isLeaf()) {\n cids.add(entry.value)\n } else {\n const subtreeCids = await entry.allCids()\n cids.addSet(subtreeCids)\n }\n }\n cids.add(await this.getPointer())\n return cids\n }\n\n // Walks tree & returns all leaves\n async leaves() {\n const leaves: Leaf[] = []\n for await (const entry of this.walk()) {\n if (entry.isLeaf()) leaves.push(entry)\n }\n return leaves\n }\n\n // Returns total leaf count\n async leafCount(): Promise<number> {\n const leaves = await this.leaves()\n return leaves.length\n }\n\n // Reachable tree traversal\n // -------------------\n\n // Walk reachable branches of tree & emit nodes, consumer can bail at any point by returning false\n async *walkReachable(): AsyncIterable<NodeEntry> {\n yield this\n const entries = await this.getEntries()\n for (const entry of entries) {\n if (entry.isTree()) {\n try {\n for await (const e of entry.walkReachable()) {\n yield e\n }\n } catch (err) {\n if (err instanceof MissingBlockError) {\n continue\n } else {\n throw err\n }\n }\n } else {\n yield entry\n }\n }\n }\n\n async reachableLeaves(): Promise<Leaf[]> {\n const leaves: Leaf[] = []\n for await (const entry of this.walkReachable()) {\n if (entry.isLeaf()) leaves.push(entry)\n }\n return leaves\n }\n\n // Sync Protocol\n\n async *carBlockStream(): AsyncIterable<CarBlock> {\n const leaves = new CidSet()\n let toFetch = new CidSet()\n toFetch.add(await this.getPointer())\n while (toFetch.size() > 0) {\n const nextLayer = new CidSet()\n const fetched = await this.storage.getBlocks(toFetch.toList())\n if (fetched.missing.length > 0) {\n throw new MissingBlocksError('mst node', fetched.missing)\n }\n for (const cid of toFetch.toList()) {\n const found = await parse.getAndParseByDef(\n fetched.blocks,\n cid,\n nodeDataDef,\n )\n yield { cid, bytes: found.bytes }\n const entries = await util.deserializeNodeData(this.storage, found.obj)\n\n for (const entry of entries) {\n if (entry.isLeaf()) {\n leaves.add(entry.value)\n } else {\n nextLayer.add(await entry.getPointer())\n }\n }\n }\n toFetch = nextLayer\n }\n const leafData = await this.storage.getBlocks(leaves.toList())\n if (leafData.missing.length > 0) {\n throw new MissingBlocksError('mst leaf', leafData.missing)\n }\n\n for (const leaf of leafData.blocks.entries()) {\n yield leaf\n }\n }\n\n async cidsForPath(key: string): Promise<CID[]> {\n const cids: CID[] = [await this.getPointer()]\n const index = await this.findGtOrEqualLeafIndex(key)\n const found = await this.atIndex(index)\n if (found && found.isLeaf() && found.key === key) {\n return [...cids, found.value]\n }\n const prev = await this.atIndex(index - 1)\n if (prev && prev.isTree()) {\n return [...cids, ...(await prev.cidsForPath(key))]\n }\n return cids\n }\n\n // A covering proof is all MST nodes (leaves excluded) needed to prove the value of a given leaf\n // and its siblings to its immediate right and left (if applicable)\n // We simply find the immediately preceeding node and then walk from that node until we reach the\n // first key that is greater than the requested key (the right sibling)\n async getCoveringProof(key: string): Promise<BlockMap> {\n const [self, left, right] = await Promise.all([\n this.proofForKey(key),\n this.proofForLeftSib(key),\n this.proofForRightSib(key),\n ])\n return self.addMap(left).addMap(right)\n }\n\n async proofForKey(key: string): Promise<BlockMap> {\n const index = await this.findGtOrEqualLeafIndex(key)\n const found = await this.atIndex(index)\n let blocks: BlockMap\n if (found && found.isLeaf() && found.key === key) {\n blocks = new BlockMap()\n } else {\n const prev = await this.atIndex(index - 1)\n if (!prev || prev.isLeaf()) {\n return new BlockMap()\n } else {\n blocks = await prev.proofForKey(key)\n }\n }\n const serialized = await this.serialize()\n return blocks.set(serialized.cid, serialized.bytes)\n }\n\n async proofForLeftSib(key: string): Promise<BlockMap> {\n const index = await this.findGtOrEqualLeafIndex(key)\n const prev = await this.atIndex(index - 1)\n let blocks: BlockMap\n if (!prev || prev.isLeaf()) {\n blocks = new BlockMap()\n } else {\n blocks = await prev.proofForLeftSib(key)\n }\n const serialized = await this.serialize()\n return blocks.set(serialized.cid, serialized.bytes)\n }\n\n async proofForRightSib(key: string): Promise<BlockMap> {\n const index = await this.findGtOrEqualLeafIndex(key)\n let found = await this.atIndex(index)\n if (!found) {\n found = await this.atIndex(index - 1)\n }\n let blocks: BlockMap\n if (!found) {\n // shouldn't ever hit, null case\n blocks = new BlockMap()\n } else if (found.isTree()) {\n blocks = await found.proofForRightSib(key)\n // recurse down\n } else {\n const node =\n found.key === key\n ? await this.atIndex(index + 1)\n : await this.atIndex(index - 1)\n if (!node || node.isLeaf()) {\n blocks = new BlockMap()\n } else {\n blocks = await node.proofForRightSib(key)\n }\n }\n const serialized = await this.serialize()\n return blocks.set(serialized.cid, serialized.bytes)\n }\n\n // Matching Leaf interface\n // -------------------\n\n isTree(): this is MST {\n return true\n }\n\n isLeaf(): this is Leaf {\n return false\n }\n\n async equals(other: NodeEntry): Promise<boolean> {\n if (other.isLeaf()) return false\n const thisPointer = await this.getPointer()\n const otherPointer = await other.getPointer()\n return thisPointer.equals(otherPointer)\n }\n}\n\nexport class Leaf {\n constructor(\n public key: string,\n public value: CID,\n ) {}\n\n isTree(): this is MST {\n return false\n }\n\n isLeaf(): this is Leaf {\n return true\n }\n\n equals(entry: NodeEntry): boolean {\n if (entry.isLeaf()) {\n return this.key === entry.key && this.value.equals(entry.value)\n } else {\n return false\n }\n }\n}\n"]}
1
+ {"version":3,"file":"mst.js","sourceRoot":"","sources":["../../src/mst/mst.ts"],"names":[],"mappings":"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","sourcesContent":["import { CID } from 'multiformats'\nimport { z } from 'zod'\nimport { cidForCbor, dataToCborBlock, schema as common } from '@atproto/common'\nimport { BlockMap } from '../block-map'\nimport { CidSet } from '../cid-set'\nimport { MissingBlockError, MissingBlocksError } from '../error'\nimport * as parse from '../parse'\nimport { ReadableBlockstore } from '../storage'\nimport { CarBlock } from '../types'\nimport * as util from './util'\n\n/**\n * This is an implementation of a Merkle Search Tree (MST)\n * The data structure is described here: https://hal.inria.fr/hal-02303490/document\n * The MST is an ordered, insert-order-independent, deterministic tree.\n * Keys are laid out in alphabetic order.\n * The key insight of an MST is that each key is hashed and starting 0s are counted\n * to determine which layer it falls on (5 zeros for ~32 fanout).\n * This is a merkle tree, so each subtree is referred to by it's hash (CID).\n * When a leaf is changed, ever tree on the path to that leaf is changed as well,\n * thereby updating the root hash.\n *\n * For atproto, we use SHA-256 as the key hashing algorithm, and ~4 fanout\n * (2-bits of zero per layer).\n */\n\n/**\n * A couple notes on CBOR encoding:\n *\n * There are never two neighboring subtrees.\n * Therefore, we can represent a node as an array of\n * leaves & pointers to their right neighbor (possibly null),\n * along with a pointer to the left-most subtree (also possibly null).\n *\n * Most keys in a subtree will have overlap.\n * We do compression on prefixes by describing keys as:\n * - the length of the prefix that it shares in common with the preceding key\n * - the rest of the string\n *\n * For example:\n * If the first leaf in a tree is `bsky/posts/abcdefg` and the second is `bsky/posts/abcdehi`\n * Then the first will be described as `prefix: 0, key: 'bsky/posts/abcdefg'`,\n * and the second will be described as `prefix: 16, key: 'hi'.`\n */\nconst subTreePointer = z.nullable(common.cid)\nconst treeEntry = z.object({\n p: z.number(), // prefix count of ascii chars that this key shares with the prev key\n k: common.bytes, // the rest of the key outside the shared prefix\n v: common.cid, // value\n t: subTreePointer, // next subtree (to the right of leaf)\n})\nconst nodeData = z.object({\n l: subTreePointer, // left-most subtree\n e: z.array(treeEntry), //entries\n})\nexport type NodeData = z.infer<typeof nodeData>\n\nexport const nodeDataDef = {\n name: 'mst node',\n schema: nodeData,\n}\n\nexport type NodeEntry = MST | Leaf\n\nexport type MstOpts = {\n layer: number\n}\n\nexport class MST {\n storage: ReadableBlockstore\n entries: NodeEntry[] | null\n layer: number | null\n pointer: CID\n outdatedPointer = false\n\n constructor(\n storage: ReadableBlockstore,\n pointer: CID,\n entries: NodeEntry[] | null,\n layer: number | null,\n ) {\n this.storage = storage\n this.entries = entries\n this.layer = layer\n this.pointer = pointer\n }\n\n static async create(\n storage: ReadableBlockstore,\n entries: NodeEntry[] = [],\n opts?: Partial<MstOpts>,\n ): Promise<MST> {\n const pointer = await util.cidForEntries(entries)\n const { layer = null } = opts || {}\n return new MST(storage, pointer, entries, layer)\n }\n\n static async fromData(\n storage: ReadableBlockstore,\n data: NodeData,\n opts?: Partial<MstOpts>,\n ): Promise<MST> {\n const { layer = null } = opts || {}\n const entries = await util.deserializeNodeData(storage, data, opts)\n const pointer = await cidForCbor(data)\n return new MST(storage, pointer, entries, layer)\n }\n\n // this is really a *lazy* load, doesn't actually touch storage\n static load(\n storage: ReadableBlockstore,\n cid: CID,\n opts?: Partial<MstOpts>,\n ): MST {\n const { layer = null } = opts || {}\n return new MST(storage, cid, null, layer)\n }\n\n // Immutability\n // -------------------\n\n // We never mutate an MST, we just return a new MST with updated values\n async newTree(entries: NodeEntry[]): Promise<MST> {\n const mst = new MST(this.storage, this.pointer, entries, this.layer)\n mst.outdatedPointer = true\n return mst\n }\n\n // Getters (lazy load)\n // -------------------\n\n // We don't want to load entries of every subtree, just the ones we need\n async getEntries(): Promise<NodeEntry[]> {\n if (this.entries) return [...this.entries]\n if (this.pointer) {\n const data = await this.storage.readObj(this.pointer, nodeDataDef)\n const firstLeaf = data.e[0]\n const layer =\n firstLeaf !== undefined\n ? await util.leadingZerosOnHash(firstLeaf.k)\n : undefined\n this.entries = await util.deserializeNodeData(this.storage, data, {\n layer,\n })\n\n return this.entries\n }\n throw new Error('No entries or CID provided')\n }\n\n // We don't hash the node on every mutation for performance reasons\n // Instead we keep track of whether the pointer is outdated and only (recursively) calculate when needed\n async getPointer(): Promise<CID> {\n if (!this.outdatedPointer) return this.pointer\n const { cid } = await this.serialize()\n this.pointer = cid\n this.outdatedPointer = false\n return this.pointer\n }\n\n async serialize(): Promise<{ cid: CID; bytes: Uint8Array }> {\n let entries = await this.getEntries()\n const outdated = entries.filter(\n (e) => e.isTree() && e.outdatedPointer,\n ) as MST[]\n if (outdated.length > 0) {\n await Promise.all(outdated.map((e) => e.getPointer()))\n entries = await this.getEntries()\n }\n const data = util.serializeNodeData(entries)\n const block = await dataToCborBlock(data)\n return {\n cid: block.cid,\n bytes: block.bytes,\n }\n }\n\n // In most cases, we get the layer of a node from a hint on creation\n // In the case of the topmost node in the tree, we look for a key in the node & determine the layer\n // In the case where we don't find one, we recurse down until we do.\n // If we still can't find one, then we have an empty tree and the node is layer 0\n async getLayer(): Promise<number> {\n this.layer = await this.attemptGetLayer()\n if (this.layer === null) this.layer = 0\n return this.layer\n }\n\n async attemptGetLayer(): Promise<number | null> {\n if (this.layer !== null) return this.layer\n const entries = await this.getEntries()\n let layer = await util.layerForEntries(entries)\n if (layer === null) {\n for (const entry of entries) {\n if (entry.isTree()) {\n const childLayer = await entry.attemptGetLayer()\n if (childLayer !== null) {\n layer = childLayer + 1\n break\n }\n }\n }\n }\n if (layer !== null) this.layer = layer\n return layer\n }\n\n // Core functionality\n // -------------------\n\n // Return the necessary blocks to persist the MST to repo storage\n async getUnstoredBlocks(): Promise<{ root: CID; blocks: BlockMap }> {\n const blocks = new BlockMap()\n const pointer = await this.getPointer()\n const alreadyHas = await this.storage.has(pointer)\n if (alreadyHas) return { root: pointer, blocks }\n const entries = await this.getEntries()\n const data = util.serializeNodeData(entries)\n await blocks.add(data)\n for (const entry of entries) {\n if (entry.isTree()) {\n const subtree = await entry.getUnstoredBlocks()\n blocks.addMap(subtree.blocks)\n }\n }\n return { root: pointer, blocks: blocks }\n }\n\n // Adds a new leaf for the given key/value pair\n // Throws if a leaf with that key already exists\n async add(key: string, value: CID, knownZeros?: number): Promise<MST> {\n util.ensureValidMstKey(key)\n const keyZeros = knownZeros ?? (await util.leadingZerosOnHash(key))\n const layer = await this.getLayer()\n const newLeaf = new Leaf(key, value)\n if (keyZeros === layer) {\n // it belongs in this layer\n const index = await this.findGtOrEqualLeafIndex(key)\n const found = await this.atIndex(index)\n if (found?.isLeaf() && found.key === key) {\n throw new Error(`There is already a value at key: ${key}`)\n }\n const prevNode = await this.atIndex(index - 1)\n if (!prevNode || prevNode.isLeaf()) {\n // if entry before is a leaf, (or we're on far left) we can just splice in\n return this.spliceIn(newLeaf, index)\n } else {\n // else we try to split the subtree around the key\n const splitSubTree = await prevNode.splitAround(key)\n return this.replaceWithSplit(\n index - 1,\n splitSubTree[0],\n newLeaf,\n splitSubTree[1],\n )\n }\n } else if (keyZeros < layer) {\n // it belongs on a lower layer\n const index = await this.findGtOrEqualLeafIndex(key)\n const prevNode = await this.atIndex(index - 1)\n if (prevNode && prevNode.isTree()) {\n // if entry before is a tree, we add it to that tree\n const newSubtree = await prevNode.add(key, value, keyZeros)\n return this.updateEntry(index - 1, newSubtree)\n } else {\n const subTree = await this.createChild()\n const newSubTree = await subTree.add(key, value, keyZeros)\n return this.spliceIn(newSubTree, index)\n }\n } else {\n // it belongs on a higher layer & we must push the rest of the tree down\n const split = await this.splitAround(key)\n // if the newly added key has >=2 more leading zeros than the current highest layer\n // then we need to add in structural nodes in between as well\n let left: MST | null = split[0]\n let right: MST | null = split[1]\n const layer = await this.getLayer()\n const extraLayersToAdd = keyZeros - layer\n // intentionally starting at 1, since first layer is taken care of by split\n for (let i = 1; i < extraLayersToAdd; i++) {\n if (left !== null) {\n left = await left.createParent()\n }\n if (right !== null) {\n right = await right.createParent()\n }\n }\n const updated: NodeEntry[] = []\n if (left) updated.push(left)\n updated.push(new Leaf(key, value))\n if (right) updated.push(right)\n const newRoot = await MST.create(this.storage, updated, {\n layer: keyZeros,\n })\n newRoot.outdatedPointer = true\n return newRoot\n }\n }\n\n // Gets the value at the given key\n async get(key: string): Promise<CID | null> {\n const index = await this.findGtOrEqualLeafIndex(key)\n const found = await this.atIndex(index)\n if (found && found.isLeaf() && found.key === key) {\n return found.value\n }\n const prev = await this.atIndex(index - 1)\n if (prev && prev.isTree()) {\n return prev.get(key)\n }\n return null\n }\n\n // Edits the value at the given key\n // Throws if the given key does not exist\n async update(key: string, value: CID): Promise<MST> {\n util.ensureValidMstKey(key)\n const index = await this.findGtOrEqualLeafIndex(key)\n const found = await this.atIndex(index)\n if (found && found.isLeaf() && found.key === key) {\n return this.updateEntry(index, new Leaf(key, value))\n }\n const prev = await this.atIndex(index - 1)\n if (prev && prev.isTree()) {\n const updatedTree = await prev.update(key, value)\n return this.updateEntry(index - 1, updatedTree)\n }\n throw new Error(`Could not find a record with key: ${key}`)\n }\n\n // Deletes the value at the given key\n async delete(key: string): Promise<MST> {\n const altered = await this.deleteRecurse(key)\n return altered.trimTop()\n }\n\n async deleteRecurse(key: string): Promise<MST> {\n const index = await this.findGtOrEqualLeafIndex(key)\n const found = await this.atIndex(index)\n // if found, remove it on this level\n if (found?.isLeaf() && found.key === key) {\n const prev = await this.atIndex(index - 1)\n const next = await this.atIndex(index + 1)\n if (prev?.isTree() && next?.isTree()) {\n const merged = await prev.appendMerge(next)\n return this.newTree([\n ...(await this.slice(0, index - 1)),\n merged,\n ...(await this.slice(index + 2)),\n ])\n } else {\n return this.removeEntry(index)\n }\n }\n // else recurse down to find it\n const prev = await this.atIndex(index - 1)\n if (prev?.isTree()) {\n const subtree = await prev.deleteRecurse(key)\n const subTreeEntries = await subtree.getEntries()\n if (subTreeEntries.length === 0) {\n return this.removeEntry(index - 1)\n } else {\n return this.updateEntry(index - 1, subtree)\n }\n } else {\n throw new Error(`Could not find a record with key: ${key}`)\n }\n }\n\n // Simple Operations\n // -------------------\n\n // update entry in place\n async updateEntry(index: number, entry: NodeEntry): Promise<MST> {\n const update = [\n ...(await this.slice(0, index)),\n entry,\n ...(await this.slice(index + 1)),\n ]\n return this.newTree(update)\n }\n\n // remove entry at index\n async removeEntry(index: number): Promise<MST> {\n const updated = [\n ...(await this.slice(0, index)),\n ...(await this.slice(index + 1)),\n ]\n return this.newTree(updated)\n }\n\n // append entry to end of the node\n async append(entry: NodeEntry): Promise<MST> {\n const entries = await this.getEntries()\n return this.newTree([...entries, entry])\n }\n\n // prepend entry to start of the node\n async prepend(entry: NodeEntry): Promise<MST> {\n const entries = await this.getEntries()\n return this.newTree([entry, ...entries])\n }\n\n // returns entry at index\n async atIndex(index: number): Promise<NodeEntry | null> {\n const entries = await this.getEntries()\n return entries[index] ?? null\n }\n\n // returns a slice of the node (like array.slice)\n async slice(\n start?: number | undefined,\n end?: number | undefined,\n ): Promise<NodeEntry[]> {\n const entries = await this.getEntries()\n return entries.slice(start, end)\n }\n\n // inserts entry at index\n async spliceIn(entry: NodeEntry, index: number): Promise<MST> {\n const update = [\n ...(await this.slice(0, index)),\n entry,\n ...(await this.slice(index)),\n ]\n return this.newTree(update)\n }\n\n // replaces an entry with [ Maybe(tree), Leaf, Maybe(tree) ]\n async replaceWithSplit(\n index: number,\n left: MST | null,\n leaf: Leaf,\n right: MST | null,\n ): Promise<MST> {\n const update = await this.slice(0, index)\n if (left) update.push(left)\n update.push(leaf)\n if (right) update.push(right)\n update.push(...(await this.slice(index + 1)))\n return this.newTree(update)\n }\n\n // if the topmost node in the tree only points to another tree, trim the top and return the subtree\n async trimTop(): Promise<MST> {\n let entries: NodeEntry[]\n try {\n entries = await this.getEntries()\n } catch (err) {\n if (err instanceof MissingBlockError) {\n return this\n } else {\n throw err\n }\n }\n if (entries.length === 1 && entries[0].isTree()) {\n return entries[0].trimTop()\n } else {\n return this\n }\n }\n\n // Subtree & Splits\n // -------------------\n\n // Recursively splits a sub tree around a given key\n async splitAround(key: string): Promise<[MST | null, MST | null]> {\n const index = await this.findGtOrEqualLeafIndex(key)\n // split tree around key\n const leftData = await this.slice(0, index)\n const rightData = await this.slice(index)\n let left = await this.newTree(leftData)\n let right = await this.newTree(rightData)\n\n // if the far right of the left side is a subtree,\n // we need to split it on the key as well\n const lastInLeft = leftData[leftData.length - 1]\n if (lastInLeft?.isTree()) {\n left = await left.removeEntry(leftData.length - 1)\n const split = await lastInLeft.splitAround(key)\n if (split[0]) {\n left = await left.append(split[0])\n }\n if (split[1]) {\n right = await right.prepend(split[1])\n }\n }\n\n return [\n (await left.getEntries()).length > 0 ? left : null,\n (await right.getEntries()).length > 0 ? right : null,\n ]\n }\n\n // The simple merge case where every key in the right tree is greater than every key in the left tree\n // (used primarily for deletes)\n async appendMerge(toMerge: MST): Promise<MST> {\n if ((await this.getLayer()) !== (await toMerge.getLayer())) {\n throw new Error(\n 'Trying to merge two nodes from different layers of the MST',\n )\n }\n const thisEntries = await this.getEntries()\n const toMergeEntries = await toMerge.getEntries()\n const lastInLeft = thisEntries[thisEntries.length - 1]\n const firstInRight = toMergeEntries[0]\n if (lastInLeft?.isTree() && firstInRight?.isTree()) {\n const merged = await lastInLeft.appendMerge(firstInRight)\n return this.newTree([\n ...thisEntries.slice(0, thisEntries.length - 1),\n merged,\n ...toMergeEntries.slice(1),\n ])\n } else {\n return this.newTree([...thisEntries, ...toMergeEntries])\n }\n }\n\n // Create relatives\n // -------------------\n\n async createChild(): Promise<MST> {\n const layer = await this.getLayer()\n return MST.create(this.storage, [], {\n layer: layer - 1,\n })\n }\n\n async createParent(): Promise<MST> {\n const layer = await this.getLayer()\n const parent = await MST.create(this.storage, [this], {\n layer: layer + 1,\n })\n parent.outdatedPointer = true\n return parent\n }\n\n // Finding insertion points\n // -------------------\n\n // finds index of first leaf node that is greater than or equal to the value\n async findGtOrEqualLeafIndex(key: string): Promise<number> {\n const entries = await this.getEntries()\n const maybeIndex = entries.findIndex(\n (entry) => entry.isLeaf() && entry.key >= key,\n )\n // if we can't find, we're on the end\n return maybeIndex >= 0 ? maybeIndex : entries.length\n }\n\n // List operations (partial tree traversal)\n // -------------------\n\n // @TODO write tests for these\n\n // Walk tree starting at key\n async *walkFrom(key: string): AsyncIterable<NodeEntry> {\n yield this\n const index = await this.findGtOrEqualLeafIndex(key)\n const entries = await this.getEntries()\n const found = entries[index]\n if (found && found.isLeaf() && found.key === key) {\n yield found\n } else {\n const prev = entries[index - 1]\n if (prev) {\n if (prev.isLeaf() && prev.key === key) {\n yield prev\n } else if (prev.isTree()) {\n yield* prev.walkFrom(key)\n }\n }\n }\n\n for (let i = index; i < entries.length; i++) {\n const entry = entries[i]\n if (entry.isLeaf()) {\n yield entry\n } else {\n yield* entry.walkFrom(key)\n }\n }\n }\n\n async *walkLeavesFrom(key: string): AsyncIterable<Leaf> {\n for await (const node of this.walkFrom(key)) {\n if (node.isLeaf()) {\n yield node\n }\n }\n }\n\n async list(\n count = Number.MAX_SAFE_INTEGER,\n after?: string,\n before?: string,\n ): Promise<Leaf[]> {\n const vals: Leaf[] = []\n for await (const leaf of this.walkLeavesFrom(after || '')) {\n if (leaf.key === after) continue\n if (vals.length >= count) break\n if (before && leaf.key >= before) break\n vals.push(leaf)\n }\n return vals\n }\n\n async listWithPrefix(\n prefix: string,\n count = Number.MAX_SAFE_INTEGER,\n ): Promise<Leaf[]> {\n const vals: Leaf[] = []\n for await (const leaf of this.walkLeavesFrom(prefix)) {\n if (vals.length >= count || !leaf.key.startsWith(prefix)) break\n vals.push(leaf)\n }\n return vals\n }\n\n // Full tree traversal\n // -------------------\n\n // Walk full tree & emit nodes, consumer can bail at any point by returning false\n async *walk(): AsyncIterable<NodeEntry> {\n yield this\n const entries = await this.getEntries()\n for (const entry of entries) {\n if (entry.isTree()) {\n for await (const e of entry.walk()) {\n yield e\n }\n } else {\n yield entry\n }\n }\n }\n\n // Walk full tree & emit nodes, consumer can bail at any point by returning false\n async paths(): Promise<NodeEntry[][]> {\n const entries = await this.getEntries()\n let paths: NodeEntry[][] = []\n for (const entry of entries) {\n if (entry.isLeaf()) {\n paths.push([entry])\n }\n if (entry.isTree()) {\n const subPaths = await entry.paths()\n paths = [...paths, ...subPaths.map((p) => [entry, ...p])]\n }\n }\n return paths\n }\n\n // Walks tree & returns all nodes\n async allNodes(): Promise<NodeEntry[]> {\n const nodes: NodeEntry[] = []\n for await (const entry of this.walk()) {\n nodes.push(entry)\n }\n return nodes\n }\n\n // Walks tree & returns all cids\n async allCids(): Promise<CidSet> {\n const cids = new CidSet()\n const entries = await this.getEntries()\n for (const entry of entries) {\n if (entry.isLeaf()) {\n cids.add(entry.value)\n } else {\n const subtreeCids = await entry.allCids()\n cids.addSet(subtreeCids)\n }\n }\n cids.add(await this.getPointer())\n return cids\n }\n\n // Walks tree & returns all leaves\n async leaves() {\n const leaves: Leaf[] = []\n for await (const entry of this.walk()) {\n if (entry.isLeaf()) leaves.push(entry)\n }\n return leaves\n }\n\n // Returns total leaf count\n async leafCount(): Promise<number> {\n const leaves = await this.leaves()\n return leaves.length\n }\n\n // Reachable tree traversal\n // -------------------\n\n // Walk reachable branches of tree & emit nodes, consumer can bail at any point by returning false\n async *walkReachable(): AsyncIterable<NodeEntry> {\n yield this\n const entries = await this.getEntries()\n for (const entry of entries) {\n if (entry.isTree()) {\n try {\n for await (const e of entry.walkReachable()) {\n yield e\n }\n } catch (err) {\n if (err instanceof MissingBlockError) {\n continue\n } else {\n throw err\n }\n }\n } else {\n yield entry\n }\n }\n }\n\n async reachableLeaves(): Promise<Leaf[]> {\n const leaves: Leaf[] = []\n for await (const entry of this.walkReachable()) {\n if (entry.isLeaf()) leaves.push(entry)\n }\n return leaves\n }\n\n // Sync Protocol\n\n async *carBlockStream(): AsyncIterable<CarBlock> {\n const leaves = new CidSet()\n let toFetch = new CidSet()\n toFetch.add(await this.getPointer())\n while (toFetch.size() > 0) {\n const nextLayer = new CidSet()\n const fetched = await this.storage.getBlocks(toFetch.toList())\n if (fetched.missing.length > 0) {\n throw new MissingBlocksError('mst node', fetched.missing)\n }\n for (const cid of toFetch.toList()) {\n const found = await parse.getAndParseByDef(\n fetched.blocks,\n cid,\n nodeDataDef,\n )\n yield { cid, bytes: found.bytes }\n const entries = await util.deserializeNodeData(this.storage, found.obj)\n\n for (const entry of entries) {\n if (entry.isLeaf()) {\n leaves.add(entry.value)\n } else {\n nextLayer.add(await entry.getPointer())\n }\n }\n }\n toFetch = nextLayer\n }\n const leafData = await this.storage.getBlocks(leaves.toList())\n if (leafData.missing.length > 0) {\n throw new MissingBlocksError('mst leaf', leafData.missing)\n }\n\n for (const leaf of leafData.blocks.entries()) {\n yield leaf\n }\n }\n\n async cidsForPath(key: string): Promise<CID[]> {\n const cids: CID[] = [await this.getPointer()]\n const index = await this.findGtOrEqualLeafIndex(key)\n const found = await this.atIndex(index)\n if (found && found.isLeaf() && found.key === key) {\n return [...cids, found.value]\n }\n const prev = await this.atIndex(index - 1)\n if (prev && prev.isTree()) {\n return [...cids, ...(await prev.cidsForPath(key))]\n }\n return cids\n }\n\n // A covering proof is all MST nodes (leaves excluded) needed to prove the value of a given leaf\n // and its siblings to its immediate right and left (if applicable)\n // We simply find the immediately preceeding node and then walk from that node until we reach the\n // first key that is greater than the requested key (the right sibling)\n async getCoveringProof(key: string): Promise<BlockMap> {\n const [self, left, right] = await Promise.all([\n this.proofForKey(key),\n this.proofForLeftSib(key),\n this.proofForRightSib(key),\n ])\n return self.addMap(left).addMap(right)\n }\n\n async proofForKey(key: string): Promise<BlockMap> {\n const index = await this.findGtOrEqualLeafIndex(key)\n const found = await this.atIndex(index)\n let blocks: BlockMap\n if (found && found.isLeaf() && found.key === key) {\n blocks = new BlockMap()\n } else {\n const prev = await this.atIndex(index - 1)\n if (!prev || prev.isLeaf()) {\n return new BlockMap()\n } else {\n blocks = await prev.proofForKey(key)\n }\n }\n const serialized = await this.serialize()\n return blocks.set(serialized.cid, serialized.bytes)\n }\n\n async proofForLeftSib(key: string): Promise<BlockMap> {\n const index = await this.findGtOrEqualLeafIndex(key)\n const prev = await this.atIndex(index - 1)\n let blocks: BlockMap\n if (!prev || prev.isLeaf()) {\n blocks = new BlockMap()\n } else {\n blocks = await prev.proofForLeftSib(key)\n }\n const serialized = await this.serialize()\n return blocks.set(serialized.cid, serialized.bytes)\n }\n\n async proofForRightSib(key: string): Promise<BlockMap> {\n const index = await this.findGtOrEqualLeafIndex(key)\n let found = await this.atIndex(index)\n if (!found) {\n found = await this.atIndex(index - 1)\n }\n let blocks: BlockMap\n if (!found) {\n // shouldn't ever hit, null case\n blocks = new BlockMap()\n } else if (found.isTree()) {\n blocks = await found.proofForRightSib(key)\n // recurse down\n } else {\n const node =\n found.key === key\n ? await this.atIndex(index + 1)\n : await this.atIndex(index - 1)\n if (!node || node.isLeaf()) {\n blocks = new BlockMap()\n } else {\n blocks = await node.proofForRightSib(key)\n }\n }\n const serialized = await this.serialize()\n return blocks.set(serialized.cid, serialized.bytes)\n }\n\n // Matching Leaf interface\n // -------------------\n\n isTree(): this is MST {\n return true\n }\n\n isLeaf(): this is Leaf {\n return false\n }\n\n async equals(other: NodeEntry): Promise<boolean> {\n if (other.isLeaf()) return false\n const thisPointer = await this.getPointer()\n const otherPointer = await other.getPointer()\n return thisPointer.equals(otherPointer)\n }\n}\n\nexport class Leaf {\n constructor(\n public key: string,\n public value: CID,\n ) {}\n\n isTree(): this is MST {\n return false\n }\n\n isLeaf(): this is Leaf {\n return true\n }\n\n equals(entry: NodeEntry): boolean {\n if (entry.isLeaf()) {\n return this.key === entry.key && this.value.equals(entry.value)\n } else {\n return false\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/mst/util.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAIlC,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAa,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAE/D,eAAO,MAAM,kBAAkB,GAAU,KAAK,MAAM,GAAG,UAAU,oBAehE,CAAA;AAED,eAAO,MAAM,eAAe,GAC1B,SAAS,SAAS,EAAE,KACnB,OAAO,CAAC,MAAM,GAAG,IAAI,CAIvB,CAAA;AAED,eAAO,MAAM,mBAAmB,GAC9B,SAAS,kBAAkB,EAC3B,MAAM,QAAQ,EACd,OAAO,OAAO,CAAC,OAAO,CAAC,KACtB,OAAO,CAAC,SAAS,EAAE,CA0BrB,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,SAAS,SAAS,EAAE,KAAG,QAmCxD,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,KAAG,MAQrD,CAAA;AAED,eAAO,MAAM,aAAa,GAAU,SAAS,SAAS,EAAE,KAAG,OAAO,CAAC,GAAG,CAGrE,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,KAAG,OAU3C,CAAA;AAED,eAAO,MAAM,eAAe,QAAyB,CAAA;AAErD,eAAO,MAAM,YAAY,GAAI,KAAK,MAAM,KAAG,OAE1C,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,KAAK,MAAM,SAI5C,CAAA;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IACxB,GAAG,EAAE,MAAM;gBAAX,GAAG,EAAE,MAAM;CAG/B"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/mst/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAIlC,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAa,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAE/D,eAAO,MAAM,kBAAkB,GAAU,KAAK,MAAM,GAAG,UAAU,oBAehE,CAAA;AAED,eAAO,MAAM,eAAe,GAC1B,SAAS,SAAS,EAAE,KACnB,OAAO,CAAC,MAAM,GAAG,IAAI,CAIvB,CAAA;AAED,eAAO,MAAM,mBAAmB,GAC9B,SAAS,kBAAkB,EAC3B,MAAM,QAAQ,EACd,OAAO,OAAO,CAAC,OAAO,CAAC,KACtB,OAAO,CAAC,SAAS,EAAE,CA0BrB,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,SAAS,SAAS,EAAE,KAAG,QAmCxD,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,KAAG,MAQrD,CAAA;AAED,eAAO,MAAM,aAAa,GAAU,SAAS,SAAS,EAAE,KAAG,OAAO,CAAC,GAAG,CAGrE,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,KAAG,OAU3C,CAAA;AAED,eAAO,MAAM,eAAe,QAAyB,CAAA;AAErD,eAAO,MAAM,YAAY,GAAI,KAAK,MAAM,KAAG,OAE1C,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,KAAK,MAAM,SAI5C,CAAA;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IACxB,GAAG,EAAE,MAAM;gBAAX,GAAG,EAAE,MAAM;CAG/B"}