@atproto/repo 0.8.13 → 0.9.1

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 (99) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/block-map.d.ts +15 -16
  3. package/dist/block-map.d.ts.map +1 -1
  4. package/dist/block-map.js +9 -43
  5. package/dist/block-map.js.map +1 -1
  6. package/dist/car.d.ts +8 -8
  7. package/dist/car.d.ts.map +1 -1
  8. package/dist/car.js +18 -15
  9. package/dist/car.js.map +1 -1
  10. package/dist/cid-set.d.ts +8 -7
  11. package/dist/cid-set.d.ts.map +1 -1
  12. package/dist/cid-set.js +11 -4
  13. package/dist/cid-set.js.map +1 -1
  14. package/dist/data-diff.d.ts +10 -10
  15. package/dist/data-diff.d.ts.map +1 -1
  16. package/dist/data-diff.js.map +1 -1
  17. package/dist/error.d.ts +10 -10
  18. package/dist/error.d.ts.map +1 -1
  19. package/dist/error.js.map +1 -1
  20. package/dist/logger.d.ts.map +1 -1
  21. package/dist/logger.js +1 -0
  22. package/dist/logger.js.map +1 -1
  23. package/dist/mst/mst.d.ts +29 -29
  24. package/dist/mst/mst.d.ts.map +1 -1
  25. package/dist/mst/mst.js +12 -12
  26. package/dist/mst/mst.js.map +1 -1
  27. package/dist/mst/util.d.ts +2 -2
  28. package/dist/mst/util.d.ts.map +1 -1
  29. package/dist/mst/util.js +19 -39
  30. package/dist/mst/util.js.map +1 -1
  31. package/dist/parse.d.ts +6 -7
  32. package/dist/parse.d.ts.map +1 -1
  33. package/dist/parse.js +2 -2
  34. package/dist/parse.js.map +1 -1
  35. package/dist/readable-repo.d.ts +6 -7
  36. package/dist/readable-repo.d.ts.map +1 -1
  37. package/dist/readable-repo.js.map +1 -1
  38. package/dist/repo.d.ts +4 -4
  39. package/dist/repo.d.ts.map +1 -1
  40. package/dist/repo.js +11 -9
  41. package/dist/repo.js.map +1 -1
  42. package/dist/storage/memory-blockstore.d.ts +9 -9
  43. package/dist/storage/memory-blockstore.d.ts.map +1 -1
  44. package/dist/storage/memory-blockstore.js.map +1 -1
  45. package/dist/storage/readable-blockstore.d.ts +11 -12
  46. package/dist/storage/readable-blockstore.d.ts.map +1 -1
  47. package/dist/storage/readable-blockstore.js +2 -35
  48. package/dist/storage/readable-blockstore.js.map +1 -1
  49. package/dist/storage/sync-storage.d.ts +5 -5
  50. package/dist/storage/sync-storage.d.ts.map +1 -1
  51. package/dist/storage/sync-storage.js.map +1 -1
  52. package/dist/storage/types.d.ts +25 -26
  53. package/dist/storage/types.d.ts.map +1 -1
  54. package/dist/storage/types.js.map +1 -1
  55. package/dist/sync/consumer.d.ts +3 -3
  56. package/dist/sync/consumer.d.ts.map +1 -1
  57. package/dist/sync/consumer.js +1 -1
  58. package/dist/sync/consumer.js.map +1 -1
  59. package/dist/sync/provider.d.ts +3 -3
  60. package/dist/sync/provider.d.ts.map +1 -1
  61. package/dist/sync/provider.js.map +1 -1
  62. package/dist/types.d.ts +127 -100
  63. package/dist/types.d.ts.map +1 -1
  64. package/dist/types.js +53 -12
  65. package/dist/types.js.map +1 -1
  66. package/dist/util.d.ts +8 -3
  67. package/dist/util.d.ts.map +1 -1
  68. package/dist/util.js +33 -16
  69. package/dist/util.js.map +1 -1
  70. package/package.json +6 -7
  71. package/src/block-map.ts +31 -26
  72. package/src/car.ts +23 -28
  73. package/src/cid-set.ts +16 -10
  74. package/src/data-diff.ts +10 -10
  75. package/src/error.ts +6 -6
  76. package/src/logger.ts +1 -0
  77. package/src/mst/mst.ts +24 -26
  78. package/src/mst/util.ts +24 -9
  79. package/src/parse.ts +8 -8
  80. package/src/readable-repo.ts +6 -7
  81. package/src/repo.ts +13 -10
  82. package/src/storage/memory-blockstore.ts +8 -8
  83. package/src/storage/readable-blockstore.ts +12 -13
  84. package/src/storage/sync-storage.ts +4 -4
  85. package/src/storage/types.ts +25 -25
  86. package/src/sync/consumer.ts +5 -5
  87. package/src/sync/provider.ts +10 -7
  88. package/src/types.ts +82 -41
  89. package/src/util.ts +31 -14
  90. package/tests/_util.ts +28 -12
  91. package/tests/car.test.ts +31 -11
  92. package/tests/commit-proofs.test.ts +3 -3
  93. package/tests/covering-proofs.test.ts +6 -6
  94. package/tests/mst.test.ts +18 -19
  95. package/tests/proofs.test.ts +8 -6
  96. package/tests/repo.test.ts +1 -1
  97. package/tests/sync.test.ts +3 -6
  98. package/bench/mst.bench.ts +0 -165
  99. package/bench/repo.bench.ts +0 -48
package/dist/error.d.ts CHANGED
@@ -1,21 +1,21 @@
1
- import { CID } from 'multiformats/cid';
1
+ import { Cid } from '@atproto/lex-data';
2
2
  export declare class MissingBlockError extends Error {
3
- cid: CID;
4
- constructor(cid: CID, def?: string);
3
+ cid: Cid;
4
+ constructor(cid: Cid, def?: string);
5
5
  }
6
6
  export declare class MissingBlocksError extends Error {
7
7
  context: string;
8
- cids: CID[];
9
- constructor(context: string, cids: CID[]);
8
+ cids: Cid[];
9
+ constructor(context: string, cids: Cid[]);
10
10
  }
11
11
  export declare class MissingCommitBlocksError extends Error {
12
- commit: CID;
13
- cids: CID[];
14
- constructor(commit: CID, cids: CID[]);
12
+ commit: Cid;
13
+ cids: Cid[];
14
+ constructor(commit: Cid, cids: Cid[]);
15
15
  }
16
16
  export declare class UnexpectedObjectError extends Error {
17
- cid: CID;
17
+ cid: Cid;
18
18
  def: string;
19
- constructor(cid: CID, def: string);
19
+ constructor(cid: Cid, def: string);
20
20
  }
21
21
  //# sourceMappingURL=error.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAEtC,qBAAa,iBAAkB,SAAQ,KAAK;IAEjC,GAAG,EAAE,GAAG;gBAAR,GAAG,EAAE,GAAG,EACf,GAAG,CAAC,EAAE,MAAM;CAQf;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAElC,OAAO,EAAE,MAAM;IACf,IAAI,EAAE,GAAG,EAAE;gBADX,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,GAAG,EAAE;CAKrB;AAED,qBAAa,wBAAyB,SAAQ,KAAK;IAExC,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,GAAG,EAAE;gBADX,MAAM,EAAE,GAAG,EACX,IAAI,EAAE,GAAG,EAAE;CAKrB;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IAErC,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,MAAM;gBADX,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,MAAM;CAIrB"}
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AAEvC,qBAAa,iBAAkB,SAAQ,KAAK;IAEjC,GAAG,EAAE,GAAG;gBAAR,GAAG,EAAE,GAAG,EACf,GAAG,CAAC,EAAE,MAAM;CAQf;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAElC,OAAO,EAAE,MAAM;IACf,IAAI,EAAE,GAAG,EAAE;gBADX,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,GAAG,EAAE;CAKrB;AAED,qBAAa,wBAAyB,SAAQ,KAAK;IAExC,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,GAAG,EAAE;gBADX,MAAM,EAAE,GAAG,EACX,IAAI,EAAE,GAAG,EAAE;CAKrB;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IAErC,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,MAAM;gBADX,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,MAAM;CAIrB"}
package/dist/error.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"error.js","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":";;;AAEA,MAAa,iBAAkB,SAAQ,KAAK;IAC1C,YACS,GAAQ,EACf,GAAY;QAEZ,IAAI,GAAG,GAAG,oBAAoB,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAA;QAC9C,IAAI,GAAG,EAAE,CAAC;YACR,GAAG,IAAI,oBAAoB,GAAG,EAAE,CAAA;QAClC,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,CAAA;QAPV;;;;mBAAO,GAAG;WAAK;IAQjB,CAAC;CACF;AAXD,8CAWC;AAED,MAAa,kBAAmB,SAAQ,KAAK;IAC3C,YACS,OAAe,EACf,IAAW;QAElB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC5C,KAAK,CAAC,WAAW,OAAO,YAAY,MAAM,EAAE,CAAC,CAAA;QAJ7C;;;;mBAAO,OAAO;WAAQ;QACtB;;;;mBAAO,IAAI;WAAO;IAIpB,CAAC;CACF;AARD,gDAQC;AAED,MAAa,wBAAyB,SAAQ,KAAK;IACjD,YACS,MAAW,EACX,IAAW;QAElB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC5C,KAAK,CAAC,6BAA6B,MAAM,CAAC,QAAQ,EAAE,KAAK,MAAM,EAAE,CAAC,CAAA;QAJlE;;;;mBAAO,MAAM;WAAK;QAClB;;;;mBAAO,IAAI;WAAO;IAIpB,CAAC;CACF;AARD,4DAQC;AAED,MAAa,qBAAsB,SAAQ,KAAK;IAC9C,YACS,GAAQ,EACR,GAAW;QAElB,KAAK,CAAC,wBAAwB,GAAG,CAAC,QAAQ,EAAE,eAAe,GAAG,EAAE,CAAC,CAAA;QAHjE;;;;mBAAO,GAAG;WAAK;QACf;;;;mBAAO,GAAG;WAAQ;IAGpB,CAAC;CACF;AAPD,sDAOC","sourcesContent":["import { CID } from 'multiformats/cid'\n\nexport class MissingBlockError extends Error {\n constructor(\n public cid: CID,\n def?: string,\n ) {\n let msg = `block not found: ${cid.toString()}`\n if (def) {\n msg += `, expected type: ${def}`\n }\n super(msg)\n }\n}\n\nexport class MissingBlocksError extends Error {\n constructor(\n public context: string,\n public cids: CID[],\n ) {\n const cidStr = cids.map((c) => c.toString())\n super(`missing ${context} blocks: ${cidStr}`)\n }\n}\n\nexport class MissingCommitBlocksError extends Error {\n constructor(\n public commit: CID,\n public cids: CID[],\n ) {\n const cidStr = cids.map((c) => c.toString())\n super(`missing blocks for commit ${commit.toString()}: ${cidStr}`)\n }\n}\n\nexport class UnexpectedObjectError extends Error {\n constructor(\n public cid: CID,\n public def: string,\n ) {\n super(`unexpected object at ${cid.toString()}, expected: ${def}`)\n }\n}\n"]}
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":";;;AAEA,MAAa,iBAAkB,SAAQ,KAAK;IAC1C,YACS,GAAQ,EACf,GAAY;QAEZ,IAAI,GAAG,GAAG,oBAAoB,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAA;QAC9C,IAAI,GAAG,EAAE,CAAC;YACR,GAAG,IAAI,oBAAoB,GAAG,EAAE,CAAA;QAClC,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,CAAA;QAPV;;;;mBAAO,GAAG;WAAK;IAQjB,CAAC;CACF;AAXD,8CAWC;AAED,MAAa,kBAAmB,SAAQ,KAAK;IAC3C,YACS,OAAe,EACf,IAAW;QAElB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC5C,KAAK,CAAC,WAAW,OAAO,YAAY,MAAM,EAAE,CAAC,CAAA;QAJ7C;;;;mBAAO,OAAO;WAAQ;QACtB;;;;mBAAO,IAAI;WAAO;IAIpB,CAAC;CACF;AARD,gDAQC;AAED,MAAa,wBAAyB,SAAQ,KAAK;IACjD,YACS,MAAW,EACX,IAAW;QAElB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC5C,KAAK,CAAC,6BAA6B,MAAM,CAAC,QAAQ,EAAE,KAAK,MAAM,EAAE,CAAC,CAAA;QAJlE;;;;mBAAO,MAAM;WAAK;QAClB;;;;mBAAO,IAAI;WAAO;IAIpB,CAAC;CACF;AARD,4DAQC;AAED,MAAa,qBAAsB,SAAQ,KAAK;IAC9C,YACS,GAAQ,EACR,GAAW;QAElB,KAAK,CAAC,wBAAwB,GAAG,CAAC,QAAQ,EAAE,eAAe,GAAG,EAAE,CAAC,CAAA;QAHjE;;;;mBAAO,GAAG;WAAK;QACf;;;;mBAAO,GAAG;WAAQ;IAGpB,CAAC;CACF;AAPD,sDAOC","sourcesContent":["import { Cid } from '@atproto/lex-data'\n\nexport class MissingBlockError extends Error {\n constructor(\n public cid: Cid,\n def?: string,\n ) {\n let msg = `block not found: ${cid.toString()}`\n if (def) {\n msg += `, expected type: ${def}`\n }\n super(msg)\n }\n}\n\nexport class MissingBlocksError extends Error {\n constructor(\n public context: string,\n public cids: Cid[],\n ) {\n const cidStr = cids.map((c) => c.toString())\n super(`missing ${context} blocks: ${cidStr}`)\n }\n}\n\nexport class MissingCommitBlocksError extends Error {\n constructor(\n public commit: Cid,\n public cids: Cid[],\n ) {\n const cidStr = cids.map((c) => c.toString())\n super(`missing blocks for commit ${commit.toString()}: ${cidStr}`)\n }\n}\n\nexport class UnexpectedObjectError extends Error {\n constructor(\n public cid: Cid,\n public def: string,\n ) {\n super(`unexpected object at ${cid.toString()}, expected: ${def}`)\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,eAAO,MAAM,MAAM,EAAE,UAAU,CAAC,OAAO,eAAe,CAC7B,CAAA;AAEzB,eAAe,MAAM,CAAA"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,eAAO,MAAM,MAAM,EAAE,UAAU,CAAC,OAAO,eAAe,CAC7B,CAAA;AAEzB,eAAe,MAAM,CAAA"}
package/dist/logger.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.logger = void 0;
4
+ // @TODO remove dependency on @atproto/common and subsystemLogger
4
5
  const common_1 = require("@atproto/common");
5
6
  exports.logger = (0, common_1.subsystemLogger)('repo');
6
7
  exports.default = exports.logger;
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";;;AAAA,4CAAiD;AAEpC,QAAA,MAAM,GACjB,IAAA,wBAAe,EAAC,MAAM,CAAC,CAAA;AAEzB,kBAAe,cAAM,CAAA","sourcesContent":["import { subsystemLogger } from '@atproto/common'\n\nexport const logger: ReturnType<typeof subsystemLogger> =\n subsystemLogger('repo')\n\nexport default logger\n"]}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";;;AAAA,iEAAiE;AACjE,4CAAiD;AAEpC,QAAA,MAAM,GACjB,IAAA,wBAAe,EAAC,MAAM,CAAC,CAAA;AAEzB,kBAAe,cAAM,CAAA","sourcesContent":["// @TODO remove dependency on @atproto/common and subsystemLogger\nimport { subsystemLogger } from '@atproto/common'\n\nexport const logger: ReturnType<typeof subsystemLogger> =\n subsystemLogger('repo')\n\nexport default logger\n"]}
package/dist/mst/mst.d.ts CHANGED
@@ -1,21 +1,21 @@
1
- import { CID } from 'multiformats';
2
1
  import { z } from 'zod';
2
+ import { Cid } from '@atproto/lex-data';
3
3
  import { BlockMap } from '../block-map';
4
4
  import { CidSet } from '../cid-set';
5
5
  import { ReadableBlockstore } from '../storage';
6
6
  import { CarBlock } from '../types';
7
7
  declare const nodeData: z.ZodObject<{
8
- l: z.ZodNullable<z.ZodEffects<z.ZodUnknown, CID, unknown>>;
8
+ l: z.ZodNullable<z.ZodEffects<z.ZodUnknown, Cid<0 | 1, number, number>, unknown>>;
9
9
  e: z.ZodArray<z.ZodObject<{
10
10
  p: z.ZodNumber;
11
11
  k: z.ZodType<Uint8Array<ArrayBuffer>, z.ZodTypeDef, Uint8Array<ArrayBuffer>>;
12
- v: z.ZodEffects<z.ZodUnknown, CID, unknown>;
13
- t: z.ZodNullable<z.ZodEffects<z.ZodUnknown, CID, unknown>>;
12
+ v: z.ZodEffects<z.ZodUnknown, Cid<0 | 1, number, number>, unknown>;
13
+ t: z.ZodNullable<z.ZodEffects<z.ZodUnknown, Cid<0 | 1, number, number>, unknown>>;
14
14
  }, "strip", z.ZodTypeAny, {
15
15
  p: number;
16
16
  k: Uint8Array<ArrayBuffer>;
17
- v: CID;
18
- t: CID | null;
17
+ v: Cid<0 | 1, number, number>;
18
+ t: Cid<0 | 1, number, number> | null;
19
19
  }, {
20
20
  p: number;
21
21
  k: Uint8Array<ArrayBuffer>;
@@ -23,12 +23,12 @@ declare const nodeData: z.ZodObject<{
23
23
  t?: unknown;
24
24
  }>, "many">;
25
25
  }, "strip", z.ZodTypeAny, {
26
- l: CID | null;
26
+ l: Cid<0 | 1, number, number> | null;
27
27
  e: {
28
28
  p: number;
29
29
  k: Uint8Array<ArrayBuffer>;
30
- v: CID;
31
- t: CID | null;
30
+ v: Cid<0 | 1, number, number>;
31
+ t: Cid<0 | 1, number, number> | null;
32
32
  }[];
33
33
  }, {
34
34
  e: {
@@ -43,17 +43,17 @@ export type NodeData = z.infer<typeof nodeData>;
43
43
  export declare const nodeDataDef: {
44
44
  name: string;
45
45
  schema: z.ZodObject<{
46
- l: z.ZodNullable<z.ZodEffects<z.ZodUnknown, CID, unknown>>;
46
+ l: z.ZodNullable<z.ZodEffects<z.ZodUnknown, Cid<0 | 1, number, number>, unknown>>;
47
47
  e: z.ZodArray<z.ZodObject<{
48
48
  p: z.ZodNumber;
49
49
  k: z.ZodType<Uint8Array<ArrayBuffer>, z.ZodTypeDef, Uint8Array<ArrayBuffer>>;
50
- v: z.ZodEffects<z.ZodUnknown, CID, unknown>;
51
- t: z.ZodNullable<z.ZodEffects<z.ZodUnknown, CID, unknown>>;
50
+ v: z.ZodEffects<z.ZodUnknown, Cid<0 | 1, number, number>, unknown>;
51
+ t: z.ZodNullable<z.ZodEffects<z.ZodUnknown, Cid<0 | 1, number, number>, unknown>>;
52
52
  }, "strip", z.ZodTypeAny, {
53
53
  p: number;
54
54
  k: Uint8Array<ArrayBuffer>;
55
- v: CID;
56
- t: CID | null;
55
+ v: Cid<0 | 1, number, number>;
56
+ t: Cid<0 | 1, number, number> | null;
57
57
  }, {
58
58
  p: number;
59
59
  k: Uint8Array<ArrayBuffer>;
@@ -61,12 +61,12 @@ export declare const nodeDataDef: {
61
61
  t?: unknown;
62
62
  }>, "many">;
63
63
  }, "strip", z.ZodTypeAny, {
64
- l: CID | null;
64
+ l: Cid<0 | 1, number, number> | null;
65
65
  e: {
66
66
  p: number;
67
67
  k: Uint8Array<ArrayBuffer>;
68
- v: CID;
69
- t: CID | null;
68
+ v: Cid<0 | 1, number, number>;
69
+ t: Cid<0 | 1, number, number> | null;
70
70
  }[];
71
71
  }, {
72
72
  e: {
@@ -86,28 +86,28 @@ export declare class MST {
86
86
  storage: ReadableBlockstore;
87
87
  entries: NodeEntry[] | null;
88
88
  layer: number | null;
89
- pointer: CID;
89
+ pointer: Cid;
90
90
  outdatedPointer: boolean;
91
- constructor(storage: ReadableBlockstore, pointer: CID, entries: NodeEntry[] | null, layer: number | null);
91
+ constructor(storage: ReadableBlockstore, pointer: Cid, entries: NodeEntry[] | null, layer: number | null);
92
92
  static create(storage: ReadableBlockstore, entries?: NodeEntry[], opts?: Partial<MstOpts>): Promise<MST>;
93
93
  static fromData(storage: ReadableBlockstore, data: NodeData, opts?: Partial<MstOpts>): Promise<MST>;
94
- static load(storage: ReadableBlockstore, cid: CID, opts?: Partial<MstOpts>): MST;
94
+ static load(storage: ReadableBlockstore, cid: Cid, opts?: Partial<MstOpts>): MST;
95
95
  newTree(entries: NodeEntry[]): Promise<MST>;
96
96
  getEntries(): Promise<NodeEntry[]>;
97
- getPointer(): Promise<CID>;
97
+ getPointer(): Promise<Cid>;
98
98
  serialize(): Promise<{
99
- cid: CID;
99
+ cid: Cid;
100
100
  bytes: Uint8Array;
101
101
  }>;
102
102
  getLayer(): Promise<number>;
103
103
  attemptGetLayer(): Promise<number | null>;
104
104
  getUnstoredBlocks(): Promise<{
105
- root: CID;
105
+ root: Cid;
106
106
  blocks: BlockMap;
107
107
  }>;
108
- add(key: string, value: CID, knownZeros?: number): Promise<MST>;
109
- get(key: string): Promise<CID | null>;
110
- update(key: string, value: CID): Promise<MST>;
108
+ add(key: string, value: Cid, knownZeros?: number): Promise<MST>;
109
+ get(key: string): Promise<Cid | null>;
110
+ update(key: string, value: Cid): Promise<MST>;
111
111
  delete(key: string): Promise<MST>;
112
112
  deleteRecurse(key: string): Promise<MST>;
113
113
  updateEntry(index: number, entry: NodeEntry): Promise<MST>;
@@ -137,7 +137,7 @@ export declare class MST {
137
137
  walkReachable(): AsyncIterable<NodeEntry>;
138
138
  reachableLeaves(): Promise<Leaf[]>;
139
139
  carBlockStream(): AsyncIterable<CarBlock>;
140
- cidsForPath(key: string): Promise<CID[]>;
140
+ cidsForPath(key: string): Promise<Cid[]>;
141
141
  getCoveringProof(key: string): Promise<BlockMap>;
142
142
  proofForKey(key: string): Promise<BlockMap>;
143
143
  proofForLeftSib(key: string): Promise<BlockMap>;
@@ -148,8 +148,8 @@ export declare class MST {
148
148
  }
149
149
  export declare class Leaf {
150
150
  key: string;
151
- value: CID;
152
- constructor(key: string, value: CID);
151
+ value: Cid;
152
+ constructor(key: string, value: Cid);
153
153
  isTree(): this is MST;
154
154
  isLeaf(): this is Leaf;
155
155
  equals(entry: NodeEntry): boolean;
@@ -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
@@ -35,11 +35,13 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.Leaf = exports.MST = exports.nodeDataDef = void 0;
37
37
  const zod_1 = require("zod");
38
- const common_1 = require("@atproto/common");
38
+ const lex_cbor_1 = require("@atproto/lex-cbor");
39
+ const lex_data_1 = require("@atproto/lex-data");
39
40
  const block_map_1 = require("../block-map");
40
41
  const cid_set_1 = require("../cid-set");
41
42
  const error_1 = require("../error");
42
43
  const parse = __importStar(require("../parse"));
44
+ const types_1 = require("../types");
43
45
  const util = __importStar(require("./util"));
44
46
  /**
45
47
  * This is an implementation of a Merkle Search Tree (MST)
@@ -48,7 +50,7 @@ const util = __importStar(require("./util"));
48
50
  * Keys are laid out in alphabetic order.
49
51
  * The key insight of an MST is that each key is hashed and starting 0s are counted
50
52
  * to determine which layer it falls on (5 zeros for ~32 fanout).
51
- * This is a merkle tree, so each subtree is referred to by it's hash (CID).
53
+ * This is a merkle tree, so each subtree is referred to by it's hash (Cid).
52
54
  * When a leaf is changed, ever tree on the path to that leaf is changed as well,
53
55
  * thereby updating the root hash.
54
56
  *
@@ -73,11 +75,11 @@ const util = __importStar(require("./util"));
73
75
  * Then the first will be described as `prefix: 0, key: 'bsky/posts/abcdefg'`,
74
76
  * and the second will be described as `prefix: 16, key: 'hi'.`
75
77
  */
76
- const subTreePointer = zod_1.z.nullable(common_1.schema.cid);
78
+ const subTreePointer = zod_1.z.nullable(types_1.schema.cid);
77
79
  const treeEntry = zod_1.z.object({
78
80
  p: zod_1.z.number(), // prefix count of ascii chars that this key shares with the prev key
79
- k: common_1.schema.bytes, // the rest of the key outside the shared prefix
80
- v: common_1.schema.cid, // value
81
+ k: types_1.schema.bytes, // the rest of the key outside the shared prefix
82
+ v: types_1.schema.cid, // value
81
83
  t: subTreePointer, // next subtree (to the right of leaf)
82
84
  });
83
85
  const nodeData = zod_1.z.object({
@@ -133,7 +135,7 @@ class MST {
133
135
  static async fromData(storage, data, opts) {
134
136
  const { layer = null } = opts || {};
135
137
  const entries = await util.deserializeNodeData(storage, data, opts);
136
- const pointer = await (0, common_1.cidForCbor)(data);
138
+ const pointer = await (0, lex_cbor_1.cidForLex)(data);
137
139
  return new MST(storage, pointer, entries, layer);
138
140
  }
139
141
  // this is really a *lazy* load, doesn't actually touch storage
@@ -166,7 +168,7 @@ class MST {
166
168
  });
167
169
  return this.entries;
168
170
  }
169
- throw new Error('No entries or CID provided');
171
+ throw new Error('No entries or Cid provided');
170
172
  }
171
173
  // We don't hash the node on every mutation for performance reasons
172
174
  // Instead we keep track of whether the pointer is outdated and only (recursively) calculate when needed
@@ -186,11 +188,9 @@ class MST {
186
188
  entries = await this.getEntries();
187
189
  }
188
190
  const data = util.serializeNodeData(entries);
189
- const block = await (0, common_1.dataToCborBlock)(data);
190
- return {
191
- cid: block.cid,
192
- bytes: block.bytes,
193
- };
191
+ const bytes = (0, lex_cbor_1.encode)(data);
192
+ const cid = await (0, lex_data_1.cidForCbor)(bytes);
193
+ return { cid, bytes };
194
194
  }
195
195
  // In most cases, we get the layer of a node from a hint on creation
196
196
  // In the case of the topmost node in the tree, we look for a key in the node & determine the layer
@@ -1 +1 @@
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
+ {"version":3,"file":"mst.js","sourceRoot":"","sources":["../../src/mst/mst.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod'\nimport { cidForLex, encode } from '@atproto/lex-cbor'\nimport { Cid, cidForCbor } from '@atproto/lex-data'\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, schema } 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(schema.cid)\nconst treeEntry = z.object({\n p: z.number(), // prefix count of ascii chars that this key shares with the prev key\n k: schema.bytes, // the rest of the key outside the shared prefix\n v: schema.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 cidForLex(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 bytes = encode(data)\n const cid = await cidForCbor(bytes)\n return { cid, bytes }\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,4 +1,4 @@
1
- import { CID } from 'multiformats';
1
+ import { Cid } from '@atproto/lex-data';
2
2
  import { ReadableBlockstore } from '../storage';
3
3
  import { MstOpts, NodeData, NodeEntry } from './mst';
4
4
  export declare const leadingZerosOnHash: (key: string | Uint8Array) => Promise<number>;
@@ -6,7 +6,7 @@ export declare const layerForEntries: (entries: NodeEntry[]) => Promise<number |
6
6
  export declare const deserializeNodeData: (storage: ReadableBlockstore, data: NodeData, opts?: Partial<MstOpts>) => Promise<NodeEntry[]>;
7
7
  export declare const serializeNodeData: (entries: NodeEntry[]) => NodeData;
8
8
  export declare const countPrefixLen: (a: string, b: string) => number;
9
- export declare const cidForEntries: (entries: NodeEntry[]) => Promise<CID>;
9
+ export declare const cidForEntries: (entries: NodeEntry[]) => Promise<Cid>;
10
10
  export declare const isValidMstKey: (str: string) => boolean;
11
11
  export declare const validCharsRegex: RegExp;
12
12
  export declare const isValidChars: (str: string) => boolean;
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/mst/util.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAa,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAkB/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"}